anchor.diff:         [mk_fn(d_read_field_def_, MsgName),
           mk_fn(d_reverse_toplevel_fields_, MsgName)])].
   
  -format_read_field_cases(MsgName, MsgDef, FieldVars) ->
  +format_read_field_cases(MsgName, MsgDef, FieldPass, FieldVars) ->
       [begin
            Wiretype = case is_packed(FieldDef) of
                           true  -> gpb:encode_wiretype(bytes);
                           false -> gpb:encode_wiretype(Type)
                       end,
            Key = (FNum bsl 3) bor Wiretype,
  +         Fill = if FieldPass == pass_as_params -> fill;
  +                   FieldPass == pass_as_record -> no_fill
  +                end,
            indent(8, f("~w -> ~p(Rest~s~s);~n",
                    [Key, mk_fn(d_field_, MsgName, FName),
  -                  case mk_field_decoder_vi_params(FieldDef) of
  +                  case mk_field_decoder_vi_params(FieldDef, Fill) of
                         ""     -> [];
                         Params -> [", ", Params]
                     end,
  -                  if FieldVars == none -> ", Msg";
  -                     FieldVars /= none -> FieldVars
  +                  if FieldPass == pass_as_record -> ", Msg";
  +                     FieldPass == pass_as_params -> FieldVars
                     end]))
        end
        || #field{fnum=FNum, type=Type, name=FName}=FieldDef <- MsgDef].
   
  -
  -mk_field_decoder_vi_params(FieldDef) ->
  -    mk_field_decoder_vi_params(FieldDef, fill).
   
   mk_field_decoder_vi_params(#field{type=Type}=FieldDef, Fill) ->
       case is_packed(FieldDef) of
  
positive.code:                 MsgName, FieldVars])
       end,
       f("~p(<<>>, 0, 0~s) ->~n", [mk_fn(d_read_field_def_, MsgName), FieldVars]),
       f("    #~p{~s}.~n~n", [MsgName, FieldSets])];
  format_msg_decoder_read_field(MsgName, MsgDef) when length(MsgDef) > 250 ->
      ReadFieldCases = format_read_field_cases(MsgName, MsgDef, none),
      [f("~p(Bin) ->~n", [mk_fn(d_msg_, MsgName)]),
       indent(4, f("Msg0 = ~s(),~n", [mk_fn(msg0_, MsgName)])),
       indent(4, f("~p(Bin, 0, 0, Msg0).~n", [mk_fn(d_read_field_def_, MsgName)])),
  
negative.code:      f("~p(<<0:1, X:7, Rest/binary>>, N, Acc~s) ->~n", [SkipFn, PassFieldVars]),
       f("    Length = X bsl N + Acc,~n"),
       f("    <<_:Length/binary, Rest2/binary>> = Rest,~n"),
       f("    ~p(Rest2, 0, 0~s).~n~n", [ReadFieldFn, PassFieldVars])].
  
  format_length_delimited_skipper_par(MsgName) ->
      SkipFn = mk_fn(skip_length_delimited_, MsgName),
      [f("~p(<<1:1, X:7, Rest/binary>>, N, Acc, Msg) ->~n", [SkipFn]),
       f("    ~p(Rest, N+7, X bsl N + Acc, Msg);~n", [SkipFn]),
  