anchor.diff:              {[], Opts}
       end.
   
  -%% -- encoders -----------------------------------------------------
  +%% -- analysis -----------------------------------------------------
   
   analyze_defs(Defs) ->
       #anres{used_types          = find_used_types(Defs),
              known_msg_size      = find_msgsizes_known_at_compile_time(Defs),
              msg_occurrences     = find_msg_occurrences(Defs),
              fixlen_types        = find_fixlen_types(Defs),
  -           num_packed_fields   = find_num_packed_fields(Defs)}.
  +           num_packed_fields   = find_num_packed_fields(Defs),
  +           num_fields          = find_num_fields(Defs),
  +           d_field_pass_method = compute_decode_field_pass_methods(Defs)}.
   
   find_used_types(Defs) ->
       fold_msg_fields(fun(_MsgName, #field{type=Type}, Acc) ->
  
positive.code: 
  format_decoders(Defs, AnRes, Opts) ->
      [format_enum_decoders(Defs, AnRes),
       format_initial_msgs(Defs),
       format_msg_decoders(Defs, Opts)].
  
  format_enum_decoders(Defs, #anres{used_types=UsedTypes}) ->
      %% FIXME: enum values can be negative, but "raw" varints are positive
      %%        insert a 2-complement in the mapping in order to move computations
      %%        from runtime to compiletime??
      [[string:join([f("~p(~w) -> ~p",
                       [mk_fn(d_enum_, EnumName), EnumValue, EnumSym])
                     || {EnumSym, EnumValue} <- EnumDef],
  
negative.code:      f("~s",
         [MergeCode]),
       f("    ~p(~s, 0, 0~s).~n",
         [mk_fn(d_read_field_def_, MsgName), RestVar, OutFieldVars])].
  
  format_vi_based_field_decoder_par(MsgName, FieldDef, Opts) ->
      #field{type=Type, name=FName}=FieldDef,
      BValueExpr = "X bsl N + Acc",
      {FValueCode, RestVar} = mk_unpack_vi(4, "FValue", BValueExpr, Type, "Rest",
  