@@ -290,20 +290,50 @@ prefix_bitstring(B) ->
290290 {false , <<? binary :8 , Enc /binary >>}.
291291
292292encode_pid (P ) ->
293- PBin = term_to_binary (P ),
294- <<131 ,103 ,100 ,ALen :16 ,Name :ALen /binary ,Rest :9 /binary >> = PBin ,
293+ case term_to_binary (P ) of
294+ <<131 ,88 ,100 ,ALen :16 ,Name :ALen /binary ,NS :8 /binary ,C :32 >> ->
295+ case C > 3 of
296+ true -> encode_pid (Name , NS , <<255 , C :32 >>);
297+ false -> encode_pid (Name , NS , <<C >>)
298+ end ;
299+ <<131 ,103 ,100 ,ALen :16 ,Name :ALen /binary ,NS :8 /binary ,C :8 >> ->
300+ true = C =< 3 ,
301+ encode_pid (Name , NS , <<C >>)
302+ end .
303+
304+ encode_pid (Name , NS , C ) ->
295305 NameEnc = encode_bin_elems (Name ),
296- <<? pid , NameEnc /binary , Rest /binary >>.
306+ <<? pid , NameEnc /binary , NS / binary , C /binary >>.
297307
298308encode_port (P ) ->
299- PBin = term_to_binary (P ),
300- <<131 ,102 ,100 ,ALen :16 ,Name :ALen /binary ,Rest :5 /binary >> = PBin ,
309+ case term_to_binary (P ) of
310+ <<131 ,89 ,100 ,ALen :16 ,Name :ALen /binary ,N :4 /binary ,C :32 >> ->
311+ case C > 3 of
312+ true -> encode_port (Name , N , <<255 , C :32 >>);
313+ false -> encode_port (Name , N , <<C >>)
314+ end ;
315+ <<131 ,102 ,100 ,ALen :16 ,Name :ALen /binary ,N :4 /binary ,C :8 >> ->
316+ true = C =< 3 ,
317+ encode_port (Name , N , <<C >>)
318+ end .
319+
320+ encode_port (Name , N , C ) ->
301321 NameEnc = encode_bin_elems (Name ),
302- <<? port , NameEnc /binary , Rest /binary >>.
322+ <<? port , NameEnc /binary , N / binary , C /binary >>.
303323
304324encode_ref (R ) ->
305- RBin = term_to_binary (R ),
306- <<131 ,114 ,_Len :16 ,100 ,NLen :16 ,Name :NLen /binary ,Rest /binary >> = RBin ,
325+ case term_to_binary (R ) of
326+ <<131 ,90 ,_Len :16 ,100 ,NLen :16 ,Name :NLen /binary ,C :32 ,Rest /binary >> ->
327+ case C > 3 of
328+ true -> encode_ref (Name , <<255 , C :32 , Rest /binary >>);
329+ false -> encode_ref (Name , <<C , Rest /binary >>)
330+ end ;
331+ <<131 ,114 ,_Len :16 ,100 ,NLen :16 ,Name :NLen /binary ,C :8 ,Rest /binary >> ->
332+ true = C =< 3 ,
333+ encode_ref (Name , <<C , Rest /binary >>)
334+ end .
335+
336+ encode_ref (Name , Rest ) ->
307337 NameEnc = encode_bin_elems (Name ),
308338 RestEnc = encode_bin_elems (Rest ),
309339 <<? reference , NameEnc /binary , RestEnc /binary >>.
@@ -771,23 +801,41 @@ decode_list(Elems, Acc) ->
771801
772802decode_pid (Bin ) ->
773803 {Name , Rest } = decode_binary (Bin ),
774- <<Tail :9 /binary , Rest1 /binary >> = Rest ,
775804 NameSz = size (Name ),
776- {binary_to_term (<<131 ,103 ,100 ,NameSz :16 ,Name /binary ,Tail /binary >>), Rest1 }.
805+ case Rest of
806+ <<NS :8 /binary , 255 , C :4 /binary , Rest1 /binary >> ->
807+ {binary_to_term (<<131 ,88 ,100 ,NameSz :16 ,Name /binary ,NS /binary ,C /binary >>), Rest1 };
808+ <<NS :8 /binary , C :8 , Rest1 /binary >> ->
809+ true = C =< 3 ,
810+ {binary_to_term (<<131 ,103 ,100 ,NameSz :16 ,Name /binary ,NS /binary ,C >>), Rest1 }
811+ end .
777812
778813decode_port (Bin ) ->
779814 {Name , Rest } = decode_binary (Bin ),
780- <<Tail :5 /binary , Rest1 /binary >> = Rest ,
781815 NameSz = size (Name ),
782- {binary_to_term (<<131 ,102 ,100 ,NameSz :16 ,Name /binary ,Tail /binary >>), Rest1 }.
816+ case Rest of
817+ <<N :4 /binary , 255 , C :4 /binary , Rest1 /binary >> ->
818+ {binary_to_term (<<131 ,89 ,100 ,NameSz :16 ,Name /binary ,N /binary ,C /binary >>), Rest1 };
819+ <<N :4 /binary , C :8 , Rest1 /binary >> ->
820+ true = C =< 3 ,
821+ {binary_to_term (<<131 ,102 ,100 ,NameSz :16 ,Name /binary ,N /binary ,C >>), Rest1 }
822+ end .
783823
784824decode_ref (Bin ) ->
785825 {Name , Rest } = decode_binary (Bin ),
786826 {Tail , Rest1 } = decode_binary (Rest ),
787827 NLen = size (Name ),
788- Len = (size (Tail )- 1 ) div 4 ,
789- RefBin = <<131 ,114 ,Len :16 ,100 ,NLen :16 ,Name /binary ,Tail /binary >>,
790- {binary_to_term (RefBin ), Rest1 }.
828+ case Tail of
829+ <<255 , C :4 /binary , Tail1 /binary >> ->
830+ Len = size (Tail1 ) div 4 ,
831+ RefBin = <<131 ,90 ,Len :16 ,100 ,NLen :16 ,Name /binary ,C /binary ,Tail1 /binary >>,
832+ {binary_to_term (RefBin ), Rest1 };
833+ <<C :8 , Tail1 /binary >> ->
834+ true = C =< 3 ,
835+ Len = size (Tail1 ) div 4 ,
836+ RefBin = <<131 ,114 ,Len :16 ,100 ,NLen :16 ,Name /binary ,C ,Tail1 /binary >>,
837+ {binary_to_term (RefBin ), Rest1 }
838+ end .
791839
792840decode_neg (I , 1 , Rest ) ->
793841 {(I - 16#7fffFFFF ), Rest };
0 commit comments