anchor.diff:      [%% skip_varint_<MsgName>/2,4
        gpb_codegen:format_fn(
          SkipVarintFnName,
  -       fun(<<1:1, _:7, Rest/binary>>, Z1, Z2, '<Params>') ->
  -               '<call-recursively>'(Rest, Z1, Z2, '<Params>');
  -          (<<0:1, _:7, Rest/binary>>, Z1, Z2, '<Params>') ->
  -               '<call-read-field>'(Rest, Z1,Z2, '<Params>')
  +       fun(<<1:1, _:7, Rest/binary>>, Z1, Z2, '<Params>', TrUserData) ->
  +               call_self(Rest, Z1, Z2, '<Params>', TrUserData);
  +          (<<0:1, _:7, Rest/binary>>, Z1, Z2, '<Params>', TrUserData) ->
  +               '<call-read-field>'(Rest, Z1,Z2, '<Params>', TrUserData)
          end,
  -       [replace_term('<call-recursively>', SkipVarintFnName),
  -        replace_term('<call-read-field>', ReadFieldFnName),
  +       [replace_term('<call-read-field>', ReadFieldFnName),
           splice_trees('<Params>', Params)]),
        "\n",
        %% skip_length_delimited_<MsgName>/4
        gpb_codegen:format_fn(
          SkipLenDelimFnName,
  -       fun(<<1:1, X:7, Rest/binary>>, N, Acc, '<Params>') when N < ?NB ->
  -               '<call-recursively>'(Rest, N+7, X bsl N + Acc, '<Params>');
  -          (<<0:1, X:7, Rest/binary>>, N, Acc, '<Params>') ->
  +       fun(<<1:1, X:7, Rest/binary>>, N, Acc, '<Params>', TrUserData)
  +             when N < ?NB ->
  +               call_self(Rest, N+7, X bsl N + Acc, '<Params>', TrUserData);
  +          (<<0:1, X:7, Rest/binary>>, N, Acc, '<Params>', TrUserData) ->
                  Length = X bsl N + Acc,
                  <<_:Length/binary, Rest2/binary>> = Rest,
  -               '<call-read-field>'(Rest2, 0, 0, '<Params>')
  +               '<call-read-field>'(Rest2, 0, 0, '<Params>', TrUserData)
          end,
  -       [replace_term('<call-recursively>', SkipLenDelimFnName),
  -        replace_term('<call-read-field>', ReadFieldFnName),
  +       [replace_term('<call-read-field>', ReadFieldFnName),
           splice_trees('<Params>', Params)]),
        "\n",
        %% skip_32_<MsgName>/2,4
        %% skip_64_<MsgName>/2,4
        [[gpb_codegen:format_fn(
            mk_fn(skip_, NumBits, MsgName),
  -         fun(<<_:'<NumBits>', Rest/binary>>, Z1, Z2, '<Params>') ->
  -                 '<call-read-field>'(Rest, Z1, Z2, '<Params>')
  +         fun(<<_:'<NumBits>', Rest/binary>>, Z1, Z2, '<Params>', TrUserData) ->
  +                 '<call-read-field>'(Rest, Z1, Z2, '<Params>', TrUserData)
            end,
            [replace_term('<call-read-field>', ReadFieldFnName),
             replace_term('<NumBits>', NumBits),
  
positive.code: default_fn_by_op(_, Fn) ->
      Fn.
  
  %% The "option allow_alias = true;" inside an enum X { ... }
  %% says it is ok to have multiple symbols that map to the same numeric value.
  %% Appeared in protobuf 2.5.0.
  
negative.code:            records -> ?f("-export([encode_msg/1, encode_msg/2]).~n");
             maps    -> ?f("-export([encode_msg/2, encode_msg/3]).~n")
         end,
         ?f("-export([decode_msg/2"),[", decode_msg/3" || NoNif], ?f("]).~n"),
         case get_records_or_maps_by_opts(Opts) of
             records -> ?f("-export([merge_msgs/2]).~n");
             maps    -> ?f("-export([merge_msgs/3]).~n")
  