@@ -121,13 +121,8 @@ defmodule Msgpax.Unpacker do
121
121
unpack_list ( buffer , result , options , outer , 0 , length )
122
122
end
123
123
124
- def unpack_list ( << buffer :: bits >> , result , options , outer , count , count ) do
125
- { value , rest } = Enum . split ( result , count )
126
- unpack_continue ( buffer , [ :lists . reverse ( value ) | rest ] , options , outer )
127
- end
128
-
129
124
for { format , { :value , value } } <- formats do
130
- def unpack_list ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length ) do
125
+ def unpack_list ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length ) when index < length do
131
126
unpack_list ( rest , [ unquote ( value ) | result ] , options , outer , index + 1 , length )
132
127
end
133
128
end
@@ -137,27 +132,27 @@ defmodule Msgpax.Unpacker do
137
132
result = Macro . var ( :result , nil )
138
133
options = Macro . var ( :options , nil )
139
134
outer = Macro . var ( :outer , nil )
140
- def unpack_list ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length ) do
135
+ def unpack_list ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length ) when index < length do
141
136
outer = [ { index , length } | outer ]
142
137
unquote ( pipe ( rest , pipe ( result , pipe ( options , pipe ( outer , call , 0 ) , 0 ) , 0 ) , 0 ) )
143
138
end
144
139
end
145
140
146
- def unpack_map ( << buffer :: bits >> , result , options , outer , length ) do
147
- unpack_map ( buffer , result , options , outer , 0 , length , :key )
141
+ def unpack_list ( << buffer :: bits >> , result , options , outer , count , count ) do
142
+ { value , rest } = Enum . split ( result , count )
143
+ unpack_continue ( buffer , [ :lists . reverse ( value ) | rest ] , options , outer )
148
144
end
149
145
150
- def unpack_map ( << buffer :: bits >> , result , options , outer , count , count , :key ) do
151
- { value , rest } = Enum . split ( result , count )
152
- unpack_continue ( buffer , [ :maps . from_list ( value ) | rest ] , options , outer )
146
+ def unpack_map ( << buffer :: bits >> , result , options , outer , length ) do
147
+ unpack_map ( buffer , result , options , outer , 0 , length , :key )
153
148
end
154
149
155
150
for { format , { :value , value } } <- formats do
156
- def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length , :key ) do
151
+ def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length , :key ) when index < length do
157
152
unpack_map ( rest , [ unquote ( value ) | result ] , options , outer , index , length , :value )
158
153
end
159
154
160
- def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , [ key | result ] , options , outer , index , length , :value ) do
155
+ def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , [ key | result ] , options , outer , index , length , :value ) when index < length do
161
156
unpack_map ( rest , [ { key , unquote ( value ) } | result ] , options , outer , index + 1 , length , :key )
162
157
end
163
158
end
@@ -167,12 +162,17 @@ defmodule Msgpax.Unpacker do
167
162
result = Macro . var ( :result , nil )
168
163
options = Macro . var ( :options , nil )
169
164
outer = Macro . var ( :outer , nil )
170
- def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length , type ) do
165
+ def unpack_map ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , length , type ) when index < length do
171
166
outer = [ { index , length , type } | outer ]
172
167
unquote ( pipe ( rest , pipe ( result , pipe ( options , pipe ( outer , call , 0 ) , 0 ) , 0 ) , 0 ) )
173
168
end
174
169
end
175
170
171
+ def unpack_map ( << buffer :: bits >> , result , options , outer , count , count , :key ) do
172
+ { value , rest } = Enum . split ( result , count )
173
+ unpack_continue ( buffer , [ :maps . from_list ( value ) | rest ] , options , outer )
174
+ end
175
+
176
176
defp unpack_ext ( << buffer :: bits >> , result , options , outer , type , data ) do
177
177
if type in 0 .. 127 do
178
178
unpack_continue ( buffer , [ unpack_ext ( type , data , options ) | result ] , options , outer )
0 commit comments