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)
Example #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),
    )
Example #3
0
def gen_store_function(msg, parent_struct_name):
    return (
        "  //store function                                                     \n"
        "  function store({name} memory input, {name} storage output) internal{{\n"
        "{store_codes}"
        "  }}                                                                   \n"
    ).format(name=util.gen_internal_struct_name(msg, parent_struct_name),
             store_codes=gen_store_codes(msg, parent_struct_name))
Example #4
0
def gen_nested_encoder(msg, parent_struct_name):
    return (
        "  function _encode_nested({struct} r, uint p, bytes bs)        \n"
        "      internal pure returns (uint) {{                       \n"
        "    uint offset = p;                                           \n"
        "    p += _pb._encode_varint(_estimate(r), p, bs);              \n"
        "    p += _encode(r, p, bs);                                    \n"
        "    return p - offset;                                         \n"
        "  }}                                                            \n"
    ).format(struct=util.gen_internal_struct_name(msg, parent_struct_name))
Example #5
0
def gen_utility_functions(msg, parent_struct_name):
    return (
        "  //utility functions                                           \n"
        "  function nil() internal pure returns ({name} r) {{        \n"
        "    assembly {{ r := 0 }}                                       \n"
        "  }}                                                            \n"
        "  function isNil({name} x) internal pure returns (bool r) {{\n"
        "    assembly {{ r := iszero(x) }}                               \n"
        "  }}                                                            \n"
    ).format(name=util.gen_internal_struct_name(msg, parent_struct_name))
def gen_estimator(msg, parent_struct_name, file):
    est = gen_field_estimators(msg, parent_struct_name, file)
    not_pure = util.str_contains(est, "r.")
    return (encoder_constants.ESTIMATOR).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
        varname="r" if not_pure else "/* r */",
        param="\n   * @param r The struct to be encoded" if not_pure else "",
        mutability="pure",
        counter="uint256 i;" if has_repeated_field(msg.field) else "",
        estimators=est)
Example #7
0
def gen_main_decoder(msg, parent_struct_name):
    return (
        "  function decode(bytes bs) {visibility} pure returns ({name}) {{\n"
        "    (Data memory x,) = _decode(32, bs, bs.length);                       \n"
        "    return x;                                                    \n"
        "  }}\n"
        "  function decode({name} storage self, bytes bs) {visibility} {{\n"
        "    (Data memory x,) = _decode(32, bs, bs.length);                    \n"
        "    store(x, self);                                           \n"
        "  }}").format(visibility=util.gen_visibility(True),
                       name=util.gen_internal_struct_name(
                           msg, parent_struct_name))
Example #8
0
def gen_main_encoder(msg, parent_struct_name):
    return (
        "  function encode({struct} r) {visibility} pure returns (bytes) {{\n"
        "    bytes memory bs = new bytes(_estimate(r));					   \n"
        "    uint sz = _encode(r, 32, bs);                                 \n"
        "    assembly {{ mstore(bs, sz) }}                                 \n"
        "    return bs;                                                    \n"
        "  }}                                                              \n"
    ).format(
        visibility=util.gen_visibility(False),
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
    )
Example #9
0
def gen_inner_encoder(msg, parent_struct_name):
    return (
        "  function _encode({struct} r, uint p, bytes bs)        \n"
        "      internal pure returns (uint) {{               \n"
        "    uint offset = p;                                   \n"
        "{counter}\n"
        "{encoders}\n"
        "    return p - offset;                                 \n"
        "  }}                                                    \n").format(
            struct=util.gen_internal_struct_name(msg, parent_struct_name),
            counter="uint i;" if has_repeated_field(msg.field) else "",
            encoders=gen_inner_field_encoders(msg, parent_struct_name),
        )
Example #10
0
def gen_estimator(msg, parent_struct_name):
    est = gen_field_estimators(msg, parent_struct_name)
    not_pure = util.str_contains(est, "r.")
    return (
        "  function _estimate({struct} {varname}) internal {mutability} returns (uint) {{ \n"
        "    uint e;                                                        \n"
        "{counter}\n"
        "{estimators}\n"
        "    return e;                                                      \n"
        "  }}                                                                \n"
    ).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
        varname="r" if not_pure else "/* r */",
        mutability="pure",
        counter="uint i;" if has_repeated_field(msg.field) else "",
        estimators=est,
    )
Example #11
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,
    )
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)
def gen_inner_encoder(msg, parent_struct_name, file):
    return (encoder_constants.INNER_ENCODER).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
        counter="uint256 i;" if has_repeated_field(msg.field) else "",
        encoders=gen_inner_field_encoders(msg, parent_struct_name, file))
def gen_nested_encoder(msg, parent_struct_name):
    return (encoder_constants.NESTED_ENCODER).format(
        struct=util.gen_internal_struct_name(msg, parent_struct_name))
def gen_main_decoder(msg, parent_struct_name):
    return (decoder_constants.MAIN_DECODER).format(
        visibility=util.gen_visibility(True),
        name=util.gen_internal_struct_name(msg, parent_struct_name))
Example #16
0
def gen_utility_functions(msg, parent_struct_name):
    return (sol_constants.UTILITY_FUNCTION).format(
        name=util.gen_internal_struct_name(msg, parent_struct_name))
Example #17
0
def gen_store_function(msg, parent_struct_name):
    return (sol_constants.STORE_FUNCTION).format(
        name=util.gen_internal_struct_name(msg, parent_struct_name),
        store_codes=gen_store_codes(msg, parent_struct_name))
def gen_main_encoder(msg, parent_struct_name):
    return (encoder_constants.MAIN_ENCODER).format(
        visibility=util.gen_visibility(False),
        struct=util.gen_internal_struct_name(msg, parent_struct_name),
    )