@@ -28,10 +28,6 @@ defmodule Msgpax.Unpacker do
28
28
unpack ( buffer , [ ] , options , [ :root ] , 0 , 1 )
29
29
end
30
30
31
- defp unpack ( << buffer :: bits >> , result , options , [ kind , index , length | outer ] , count , count ) do
32
- unpack ( buffer , build_collection ( result , count , kind ) , options , outer , index + 1 , length )
33
- end
34
-
35
31
primitives = % {
36
32
[ quote ( do: [ 0xC0 ] ) ] => quote ( do: nil ) ,
37
33
[ quote ( do: [ 0xC2 ] ) ] => quote ( do: false ) ,
@@ -61,7 +57,13 @@ defmodule Msgpax.Unpacker do
61
57
}
62
58
for { formats , value } <- primitives , format <- formats do
63
59
defp unpack ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , count ) when index < count do
64
- unpack ( rest , [ unquote ( value ) | result ] , options , outer , index + 1 , count )
60
+ result = [ unquote ( value ) | result ]
61
+ case index + 1 do
62
+ ^ count ->
63
+ unpack_continue ( rest , options , outer , result , count )
64
+ index ->
65
+ unpack ( rest , result , options , outer , index , count )
66
+ end
65
67
end
66
68
end
67
69
@@ -72,7 +74,19 @@ defmodule Msgpax.Unpacker do
72
74
]
73
75
for format <- lists do
74
76
defp unpack ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , count ) when index < count do
75
- unpack ( rest , result , options , [ :list , index , count | outer ] , 0 , unquote ( quote ( do: length ) ) )
77
+ case unquote ( quote ( do: length ) ) do
78
+ 0 ->
79
+ result = [ [ ] | result ]
80
+ case index + 1 do
81
+ ^ count ->
82
+ unpack_continue ( rest , options , outer , result , count )
83
+ index ->
84
+ unpack ( rest , result , options , outer , index , count )
85
+ end
86
+
87
+ length ->
88
+ unpack ( rest , result , options , [ :list , index , count | outer ] , 0 , length )
89
+ end
76
90
end
77
91
end
78
92
@@ -83,7 +97,19 @@ defmodule Msgpax.Unpacker do
83
97
]
84
98
for format <- maps do
85
99
defp unpack ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , count ) when index < count do
86
- unpack ( rest , result , options , [ :map , index , count | outer ] , 0 , unquote ( quote ( do: length ) ) * 2 )
100
+ case unquote ( quote ( do: length ) ) do
101
+ 0 ->
102
+ result = [ % { } | result ]
103
+ case index + 1 do
104
+ ^ count ->
105
+ unpack_continue ( rest , options , outer , result , count )
106
+ index ->
107
+ unpack ( rest , result , options , outer , index , count )
108
+ end
109
+
110
+ length ->
111
+ unpack ( rest , result , options , [ :map , index , count | outer ] , 0 , length * 2 )
112
+ end
87
113
end
88
114
end
89
115
@@ -95,7 +121,13 @@ defmodule Msgpax.Unpacker do
95
121
for format <- binaries do
96
122
defp unpack ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , count ) when index < count do
97
123
value = unpack_binary ( unquote ( quote ( do: content ) ) , options )
98
- unpack ( rest , [ value | result ] , options , outer , index + 1 , count )
124
+ result = [ value | result ]
125
+ case index + 1 do
126
+ ^ count ->
127
+ unpack_continue ( rest , options , outer , result , count )
128
+ index ->
129
+ unpack ( rest , result , options , outer , index , count )
130
+ end
99
131
end
100
132
end
101
133
@@ -112,14 +144,16 @@ defmodule Msgpax.Unpacker do
112
144
for format <- extensions do
113
145
defp unpack ( << unquote_splicing ( format ) , rest :: bits >> , result , options , outer , index , count ) when index < count do
114
146
value = unpack_ext ( unquote ( quote ( do: type ) ) , unquote ( quote ( do: content ) ) , options )
115
- unpack ( rest , [ value | result ] , options , outer , index + 1 , count )
147
+ result = [ value | result ]
148
+ case index + 1 do
149
+ ^ count ->
150
+ unpack_continue ( rest , options , outer , result , count )
151
+ index ->
152
+ unpack ( rest , result , options , outer , index , count )
153
+ end
116
154
end
117
155
end
118
156
119
- defp unpack ( << buffer :: bits >> , [ value ] , _options , [ :root ] , count , count ) do
120
- { value , buffer }
121
- end
122
-
123
157
defp unpack ( << byte , _ :: bits >> , _result , _options , _outer , _index , _count ) do
124
158
throw { :bad_format , byte }
125
159
end
@@ -128,6 +162,20 @@ defmodule Msgpax.Unpacker do
128
162
throw :incomplete
129
163
end
130
164
165
+ defp unpack_continue ( << buffer :: bits >> , options , [ kind , index , length | outer ] , result , count ) do
166
+ result = build_collection ( result , count , kind )
167
+ case index + 1 do
168
+ ^ length ->
169
+ unpack_continue ( buffer , options , outer , result , length )
170
+ index ->
171
+ unpack ( buffer , result , options , outer , index , length )
172
+ end
173
+ end
174
+
175
+ defp unpack_continue ( << buffer :: bits >> , _options , [ :root ] , [ value ] , 1 ) do
176
+ { value , buffer }
177
+ end
178
+
131
179
defp unpack_binary ( content , % { binary: true } ) do
132
180
Msgpax.Bin . new ( content )
133
181
end
0 commit comments