예제 #1
0
def gen_field_reader(f, parent_struct_name, msg, file):
    suffix = ("[r.{field}.length - counters[{i}]]").format(
        field=f.name, i=f.number) if util.field_is_repeated(f) else ""
    if f.type == FieldDescriptorProto.TYPE_ENUM:
        type_name = util.gen_enum_name_from_field(f)
        library_name = "" if msg.name == type_name.split(".")[0] else (
            type_name.split(".")[0] + ".")
        if library_name == ".":
            library_name = util.gen_global_enum_name(file) + library_name
        decode_type = util.gen_global_type_decl_from_field(f)
        if decode_type[0] == ".":
            decode_type = util.gen_global_enum_name(file) + decode_type
        return (decoder_constants.ENUM_FIELD_READER).format(
            field=f.name,
            decoder=util.gen_decoder_name(f),
            decode_type=decode_type,
            t=util.gen_internal_struct_name(msg, parent_struct_name),
            i=f.number,
            n=util.max_field_number(msg) + 1,
            suffix=suffix,
            enum_name=type_name.split(".")[-1],
            library_name=library_name)
    return (decoder_constants.FIELD_READER).format(
        field=f.name,
        decoder=util.gen_decoder_name(f),
        decode_type=util.gen_global_type_decl_from_field(f),
        t=util.gen_internal_struct_name(msg, parent_struct_name),
        i=f.number,
        n=util.max_field_number(msg) + 1,
        suffix=suffix)
예제 #2
0
def gen_inner_decoder(msg, parent_struct_name):
    return (
        "  function _decode(uint p, bytes bs, uint sz)                   \n"
        "      internal pure returns ({struct}, uint) {{             \n"
        "    {struct} memory r;                                          \n"
        "    uint[{n}] memory counters;                                  \n"
        "    uint fieldId;                                               \n"
        "    _pb.WireType wireType;                                      \n"
        "    uint bytesRead;                                             \n"
        "    uint offset = p;                                            \n"
        "    while(p < offset+sz) {{                                     \n"
        "      (fieldId, wireType, bytesRead) = _pb._decode_key(p, bs);  \n"
        "      p += bytesRead;                                           \n"
        "      {first_pass}                                              \n"
        "    }}                                                          \n"
        "    p = offset;                                                 \n"
        "{allocators}                                                    \n"
        "    while(p < offset+sz) {{                                     \n"
        "      (fieldId, wireType, bytesRead) = _pb._decode_key(p, bs);  \n"
        "      p += bytesRead;                                           \n"
        "      {second_pass}                                             \n"
        "    }}                                                          \n"
        "    return (r, sz);                                             \n"
        "  }}                                                            \n"
    ).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
        n=util.max_field_number(msg) + 1,
        first_pass=gen_inner_fields_decoder(msg, parent_struct_name, True),
        allocators=gen_inner_arraty_allocators(msg, parent_struct_name),
        second_pass=gen_inner_fields_decoder(msg, parent_struct_name, False),
    )
예제 #3
0
def gen_inner_decoder(msg, parent_struct_name):
    """
    If there are not repeated fields, the second pass is not generated.
  """
    allocators = gen_inner_array_allocators(
        msg, parent_struct_name) + "\n" + gen_inner_maps_size(
            msg, parent_struct_name)
    if allocators.strip():
        second_pass = decoder_constants.INNER_DECODER_SECOND_PASS.format(
            allocators=allocators,
            second_pass=gen_inner_fields_decoder(msg, parent_struct_name,
                                                 False))
    else:
        second_pass = ""
    first_pass = gen_inner_fields_decoder(msg, parent_struct_name, True)
    return (decoder_constants.INNER_DECODER).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
        n=util.max_field_number(msg) + 1,
        first_pass=first_pass,
        else_statement=decoder_constants.INNER_DECODER_ELSE.format()
        if first_pass else "",
        second_pass=second_pass)
예제 #4
0
def gen_field_reader(f, parent_struct_name, msg):
    suffix = ("[ r.{field}.length - counters[{i}] ]").format(field = f.name, i = f.number) if util.field_is_repeated(f) else ""
    return (
        "  function _read_{field}(uint p, bytes bs, {t} r, uint[{n}] counters) internal pure returns (uint) {{                            \n"
        "    ({decode_type} x, uint sz) = {decoder}(p, bs);                   \n"
        "    if(isNil(r)) {{                                                  \n" 
        "      counters[{i}] += 1;                                            \n"
        "    }} else {{                                                       \n"
        "      r.{field}{suffix} = x;                                         \n"
        "      if(counters[{i}] > 0) counters[{i}] -= 1;                      \n"
        "    }}                                                               \n"
        "    return sz;                                                       \n"
        "  }}                                                                 \n"
    ).format(
        field = f.name,
        decoder = util.gen_decoder_name(f),
        decode_type = util.gen_global_type_decl_from_field(f),
        t = util.gen_internal_struct_name(msg, parent_struct_name),
        i = f.number,
        n = util.max_field_number(msg) + 1,
        suffix = suffix,
    )