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)
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), )
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_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, )