@@ -62,10 +62,6 @@ defmodule Poison.Parser do
62
62
@ compile { :inline_size , 150 }
63
63
@ compile { :inline_unroll , 3 }
64
64
65
- if Application . get_env ( :poison , :native ) do
66
- @ compile [ :native , { :hipe , [ :o3 ] } ]
67
- end
68
-
69
65
use Bitwise
70
66
71
67
alias Poison . { Decoder , ParseError }
@@ -81,14 +77,6 @@ defmodule Poison.Parser do
81
77
whitespace = '\s \t \n \r '
82
78
digits = ?0 .. ?9
83
79
84
- defmacrop stacktrace do
85
- if Version . compare ( System . version ( ) , "1.7.0" ) != :lt do
86
- quote do: __STACKTRACE__
87
- else
88
- quote do: System . stacktrace ( )
89
- end
90
- end
91
-
92
80
defmacrop syntax_error ( skip ) do
93
81
quote do
94
82
raise ParseError , skip: unquote ( skip )
@@ -99,12 +87,16 @@ defmodule Poison.Parser do
99
87
def parse! ( value , options \\ % { } )
100
88
101
89
def parse! ( data , options ) when is_bitstring ( data ) do
102
- [ value | skip ] = value ( data , data , :maps . get ( :keys , options , nil ) , :maps . get ( :decimal , options , nil ) , 0 )
90
+ [ value | skip ] =
91
+ value ( data , data , :maps . get ( :keys , options , nil ) , :maps . get ( :decimal , options , nil ) , 0 )
92
+
103
93
<< _ :: binary - size ( skip ) , rest :: bits >> = data
104
94
skip_whitespace ( rest , skip , value )
105
95
rescue
106
96
exception in ParseError ->
107
- reraise ParseError , [ data: data , skip: exception . skip , value: exception . value ] , stacktrace ( )
97
+ reraise ParseError ,
98
+ [ data: data , skip: exception . skip , value: exception . value ] ,
99
+ __STACKTRACE__
108
100
end
109
101
110
102
def parse! ( iodata , options ) do
@@ -175,22 +167,22 @@ defmodule Poison.Parser do
175
167
## Objects
176
168
177
169
defmacrop object_name ( keys , skip , name ) do
178
- quote do
179
- case unquote ( keys ) do
170
+ quote bind_quoted: [ keys: keys , skip: skip , name: name ] do
171
+ case keys do
180
172
:atoms! ->
181
173
try do
182
- String . to_existing_atom ( unquote ( name ) )
174
+ String . to_existing_atom ( name )
183
175
rescue
184
176
ArgumentError ->
185
- reraise ParseError , [ skip: unquote ( skip ) , value: unquote ( name ) ] , stacktrace ( )
177
+ reraise ParseError , [ skip: skip , value: name ] , __STACKTRACE__
186
178
end
187
179
188
180
:atoms ->
189
181
# credo:disable-for-next-line Credo.Check.Warning.UnsafeToAtom
190
- String . to_atom ( unquote ( name ) )
182
+ String . to_atom ( name )
191
183
192
184
_keys ->
193
- unquote ( name )
185
+ name
194
186
end
195
187
end
196
188
end
@@ -200,12 +192,14 @@ defmodule Poison.Parser do
200
192
defp object_pairs ( << ?" , rest :: bits >> , data , keys , decimal , skip , acc ) do
201
193
start = skip + 1
202
194
[ name | skip ] = string_continue ( rest , data , start )
203
-
204
195
<< _ :: binary - size ( skip ) , rest :: bits >> = data
205
- [ value | skip ] = object_value ( rest , data , keys , decimal , skip )
206
196
197
+ [ value | skip ] = object_value ( rest , data , keys , decimal , skip )
207
198
<< _ :: binary - size ( skip ) , rest :: bits >> = data
208
- object_pairs_continue ( rest , data , keys , decimal , skip , [ { object_name ( keys , start , name ) , value } | acc ] )
199
+
200
+ object_pairs_continue ( rest , data , keys , decimal , skip , [
201
+ { object_name ( keys , start , name ) , value } | acc
202
+ ] )
209
203
end
210
204
211
205
defp object_pairs ( << ?} , _rest :: bits >> , _data , _keys , _decimal , skip , [ ] ) do
@@ -274,19 +268,15 @@ defmodule Poison.Parser do
274
268
275
269
defp array_values ( rest , data , keys , decimal , skip , acc ) do
276
270
[ value | skip ] = value ( rest , data , keys , decimal , skip )
277
-
278
271
<< _ :: binary - size ( skip ) , rest :: bits >> = data
279
-
280
272
array_values_continue ( rest , data , keys , decimal , skip , [ value | acc ] )
281
273
end
282
274
283
275
@ compile { :inline , array_values_continue: 6 }
284
276
285
277
defp array_values_continue ( << ?, , rest :: bits >> , data , keys , decimal , skip , acc ) do
286
278
[ value | skip ] = value ( rest , data , keys , decimal , skip + 1 )
287
-
288
279
<< _ :: binary - size ( skip ) , rest :: bits >> = data
289
-
290
280
array_values_continue ( rest , data , keys , decimal , skip , [ value | acc ] )
291
281
end
292
282
@@ -427,25 +417,31 @@ defmodule Poison.Parser do
427
417
end
428
418
429
419
defp number_complete ( _decimal , skip , sign , coef , 0 ) do
430
- [ sign * coef | skip ]
420
+ [ coef * sign | skip ]
431
421
end
432
422
433
423
max_sig = 1 <<< 53
434
424
435
425
# See: https://arxiv.org/pdf/2101.11408.pdf
436
- defp number_complete ( _decimal , skip , sign , coef , exp ) when exp in - 10 .. 10 and coef <= unquote ( max_sig ) do
426
+ defp number_complete ( _decimal , skip , sign , coef , exp )
427
+ when exp in - 10 .. 10 and coef <= unquote ( max_sig ) do
437
428
if exp < 0 do
438
- [ sign * coef / pow10 ( - exp ) | skip ]
429
+ [ coef / pow10 ( - exp ) * sign | skip ]
439
430
else
440
- [ sign * coef * pow10 ( exp ) | skip ]
431
+ [ coef * pow10 ( exp ) * sign | skip ]
441
432
end
442
433
end
443
434
444
435
defp number_complete ( _decimal , skip , sign , coef , exp ) do
445
- [ String . to_float ( << Integer . to_string ( sign * coef ) :: bits , ".0e" :: bits , Integer . to_string ( exp ) :: bits >> ) | skip ]
436
+ [
437
+ String . to_float (
438
+ << Integer . to_string ( coef * sign ) :: bits , ".0e" :: bits , Integer . to_string ( exp ) :: bits >>
439
+ )
440
+ | skip
441
+ ]
446
442
rescue
447
443
ArithmeticError ->
448
- reraise ParseError , [ skip: skip , value: "#{ sign * coef } e#{ exp } " ] , stacktrace ( )
444
+ reraise ParseError , [ skip: skip , value: "#{ coef * sign } e#{ exp } " ] , __STACKTRACE__
449
445
end
450
446
451
447
@ compile { :inline , pow10: 1 }
@@ -459,10 +455,10 @@ defmodule Poison.Parser do
459
455
## Strings
460
456
461
457
defmacrop string_codepoint_size ( codepoint ) do
462
- quote do
458
+ quote bind_quoted: [ codepoint: codepoint ] do
463
459
cond do
464
- unquote ( codepoint ) <= 0x7FF -> 2
465
- unquote ( codepoint ) <= 0xFFFF -> 3
460
+ codepoint <= 0x7FF -> 2
461
+ codepoint <= 0xFFFF -> 3
466
462
true -> 4
467
463
end
468
464
end
@@ -490,7 +486,10 @@ defmodule Poison.Parser do
490
486
end
491
487
492
488
unicode ->
493
- [ :unicode . characters_to_binary ( [ acc | binary_part ( data , skip , len ) ] , :utf8 ) | skip + len + 1 ]
489
+ [
490
+ :unicode . characters_to_binary ( [ acc | binary_part ( data , skip , len ) ] , :utf8 )
491
+ | skip + len + 1
492
+ ]
494
493
495
494
true ->
496
495
[ IO . iodata_to_binary ( [ acc | binary_part ( data , skip , len ) ] ) | skip + len + 1 ]
@@ -505,7 +504,8 @@ defmodule Poison.Parser do
505
504
string_continue ( rest , data , skip , unicode , len + 1 , acc )
506
505
end
507
506
508
- defp string_continue ( << codepoint :: utf8 , rest :: bits >> , data , skip , _unicode , len , acc ) when codepoint > 0x80 do
507
+ defp string_continue ( << codepoint :: utf8 , rest :: bits >> , data , skip , _unicode , len , acc )
508
+ when codepoint > 0x80 do
509
509
string_continue ( rest , data , skip , true , len + string_codepoint_size ( codepoint ) , acc )
510
510
end
511
511
@@ -540,12 +540,12 @@ defmodule Poison.Parser do
540
540
defguardp is_surrogate_pair ( hi , lo ) when hi in 0xD800 .. 0xDBFF and lo in 0xDC00 .. 0xDFFF
541
541
542
542
defmacrop get_codepoint ( seq , skip ) do
543
- quote do
543
+ quote bind_quoted: [ seq: seq , skip: skip ] do
544
544
try do
545
- String . to_integer ( unquote ( seq ) , 16 )
545
+ String . to_integer ( seq , 16 )
546
546
rescue
547
547
ArgumentError ->
548
- reraise ParseError , [ skip: unquote ( skip ) , value: "\\ u#{ unquote ( seq ) } " ] , stacktrace ( )
548
+ reraise ParseError , [ skip: skip , value: "\\ u#{ seq } " ] , __STACKTRACE__
549
549
end
550
550
end
551
551
end
0 commit comments