@@ -120,45 +120,46 @@ unpack_stream(<<16#C1, _R/binary>>, _) -> throw({badarg, 16#C1});
120120
121121% % fixext 1 stores an integer and a byte array whose length is 1 byte
122122unpack_stream (<<16#D4 , T :1 /signed -integer -unit :8 , Data :1 /binary , Rest /binary >>,
123- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
124- maybe_unpack_ext (16#D4 , Unpack , T , Data , Rest , Orig );
123+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
124+ maybe_unpack_ext (16#D4 , Unpack , T , Data , Rest , Orig , Opt );
125125
126126% % fixext 2 stores an integer and a byte array whose length is 2 bytes
127127unpack_stream (<<16#D5 , T :1 /signed -integer -unit :8 , Data :2 /binary , Rest /binary >>,
128- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
129- maybe_unpack_ext (16#D5 , Unpack , T , Data , Rest , Orig );
128+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
129+ maybe_unpack_ext (16#D5 , Unpack , T , Data , Rest , Orig , Opt );
130130
131131% % fixext 4 stores an integer and a byte array whose length is 4 bytes
132132unpack_stream (<<16#D6 , T :1 /signed -integer -unit :8 , Data :4 /binary , Rest /binary >>,
133- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
134- maybe_unpack_ext (16#D6 , Unpack , T , Data , Rest , Orig );
133+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
134+ maybe_unpack_ext (16#D6 , Unpack , T , Data , Rest , Orig , Opt );
135135
136136% % fixext 8 stores an integer and a byte array whose length is 8 bytes
137137unpack_stream (<<16#D7 , T :1 /signed -integer -unit :8 , Data :8 /binary , Rest /binary >>,
138- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
139- maybe_unpack_ext (16#D7 , Unpack , T , Data , Rest , Orig );
138+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
139+ maybe_unpack_ext (16#D7 , Unpack , T , Data , Rest , Orig , Opt );
140140
141141% % fixext 16 stores an integer and a byte array whose length is 16 bytes
142142unpack_stream (<<16#D8 , T :1 /signed -integer -unit :8 , Data :16 /binary , Rest /binary >>,
143- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
144- maybe_unpack_ext (16#D8 , Unpack , T , Data , Rest , Orig );
143+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
144+ maybe_unpack_ext (16#D8 , Unpack , T , Data , Rest , Orig , Opt );
145145
146146% % ext 8 stores an integer and a byte array whose length is upto (2^8)-1 bytes:
147147unpack_stream (<<16#C7 , Len :8 , Type :1 /signed -integer -unit :8 , Data :Len /binary , Rest /binary >>,
148- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
149- maybe_unpack_ext (16#C7 , Unpack , Type , Data , Rest , Orig );
148+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
149+ maybe_unpack_ext (16#C7 , Unpack , Type , Data , Rest , Orig , Opt );
150150
151151% % ext 16 stores an integer and a byte array whose length is upto (2^16)-1 bytes:
152152unpack_stream (<<16#C8 , Len :16 , Type :1 /signed -integer -unit :8 , Data :Len /binary , Rest /binary >>,
153- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
154- maybe_unpack_ext (16#C8 , Unpack , Type , Data , Rest , Orig );
153+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
154+ maybe_unpack_ext (16#C8 , Unpack , Type , Data , Rest , Orig , Opt );
155155
156156% % ext 32 stores an integer and a byte array whose length is upto (2^32)-1 bytes:
157157unpack_stream (<<16#C9 , Len :32 , Type :1 /signed -integer -unit :8 , Data :Len /binary , Rest /binary >>,
158- ? OPTION {ext_unpacker = Unpack , original_list = Orig } = _Opt ) ->
159- maybe_unpack_ext (16#C9 , Unpack , Type , Data , Rest , Orig );
158+ ? OPTION {ext_unpacker = Unpack , original_list = Orig } = Opt ) ->
159+ maybe_unpack_ext (16#C9 , Unpack , Type , Data , Rest , Orig , Opt );
160160
161- unpack_stream (_Bin , _ ) -> throw (incomplete ).
161+ unpack_stream (_Bin , _Opt ) ->
162+ throw (incomplete ).
162163
163164-spec unpack_array (binary (), non_neg_integer (), [msgpack :object ()], ? OPTION {}) ->
164165 {[msgpack :object ()], binary ()} | no_return ().
@@ -234,13 +235,19 @@ unpack_str(Binary) ->
234235 String -> String
235236 end .
236237
237- maybe_unpack_ext (F , undefined , _ , _ , _Rest , _ ) -> throw ({badarg , {bad_ext , F }});
238- maybe_unpack_ext (_ , Unpack , Type , Data , Rest , Orig ) when is_function (Unpack , 3 ) ->
238+ maybe_unpack_ext (F , _ , _ , _ , _Rest , _ , ? OPTION {spec = old }) ->
239+ % % trying to unpack new ext formats with old unpacker
240+ throw ({badarg , {new_spec , F }});
241+ maybe_unpack_ext (F , undefined , _ , _ , _Rest , _ , _ ) ->
242+ throw ({badarg , {bad_ext , F }});
243+ maybe_unpack_ext (_ , Unpack , Type , Data , Rest , Orig , _ )
244+ when is_function (Unpack , 3 ) ->
239245 case Unpack (Type , Data , Orig ) of
240246 {ok , Term } -> {Term , Rest };
241247 {error , E } -> {error , E }
242248 end ;
243- maybe_unpack_ext (_ , Unpack , Type , Data , Rest , _ ) when is_function (Unpack , 2 ) ->
249+ maybe_unpack_ext (_ , Unpack , Type , Data , Rest , _ , _ )
250+ when is_function (Unpack , 2 ) ->
244251 case Unpack (Type , Data ) of
245252 {ok , Term } -> {Term , Rest };
246253 {error , E } -> {error , E }
0 commit comments