Skip to content

Commit be19258

Browse files
committed
WIP (Move index limit matching to the bottom)
1 parent 28947f9 commit be19258

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

lib/msgpax/unpacker.ex

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,8 @@ defmodule Msgpax.Unpacker do
121121
unpack_list(buffer, result, options, outer, 0, length)
122122
end
123123

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-
129124
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
131126
unpack_list(rest, [unquote(value) | result], options, outer, index + 1, length)
132127
end
133128
end
@@ -137,27 +132,27 @@ defmodule Msgpax.Unpacker do
137132
result = Macro.var(:result, nil)
138133
options = Macro.var(:options, nil)
139134
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
141136
outer = [{index, length} | outer]
142137
unquote(pipe(rest, pipe(result, pipe(options, pipe(outer, call, 0), 0), 0), 0))
143138
end
144139
end
145140

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)
148144
end
149145

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)
153148
end
154149

155150
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
157152
unpack_map(rest, [unquote(value) | result], options, outer, index, length, :value)
158153
end
159154

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
161156
unpack_map(rest, [{key, unquote(value)} | result], options, outer, index + 1, length, :key)
162157
end
163158
end
@@ -167,12 +162,17 @@ defmodule Msgpax.Unpacker do
167162
result = Macro.var(:result, nil)
168163
options = Macro.var(:options, nil)
169164
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
171166
outer = [{index, length, type} | outer]
172167
unquote(pipe(rest, pipe(result, pipe(options, pipe(outer, call, 0), 0), 0), 0))
173168
end
174169
end
175170

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+
176176
defp unpack_ext(<<buffer::bits>>, result, options, outer, type, data) do
177177
if type in 0..127 do
178178
unpack_continue(buffer, [unpack_ext(type, data, options) | result], options, outer)

0 commit comments

Comments
 (0)