From 844ee2407fc7594c4b5ddf8f1d7cc1ab00c6a8e6 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Wed, 21 Nov 2012 23:35:15 -0800 Subject: [PATCH] previously, unambiguously incomplete input was sometimes treated as ambiguous. the 'incomplete_input' flag is no longer needed to parse this input correctly --- src/jsx.erl | 75 +++++++++++++++++++++++++++++++++++++++++++++ src/jsx_decoder.erl | 16 +++++----- 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/src/jsx.erl b/src/jsx.erl index 84e19b5..6bfec15 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -179,6 +179,81 @@ encoder_decoder_equiv_test_() -> ]. +partial_numbers_test_() -> + [ + {"partial integer", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"integer\": 12345">>), + F(<<"67890}">>) + end =:= [{<<"integer">>, 1234567890}] + ) + }, + {"partial integer", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"integer\": 1234567890">>), + F(<<"}">>) + end =:= [{<<"integer">>, 1234567890}] + ) + }, + {"partial float", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"float\": 1.">>), + F(<<"23}">>) + end =:= [{<<"float">>, 1.23}] + ) + }, + {"partial float", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"float\": 1.2">>), + F(<<"3}">>) + end =:= [{<<"float">>, 1.23}] + ) + }, + {"partial float", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"float\": 1.23">>), + F(<<"}">>) + end =:= [{<<"float">>, 1.23}] + ) + }, + {"partial exp", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"exp\": 1.0e">>), + F(<<"1}">>) + end =:= [{<<"exp">>, 10.0}] + ) + }, + {"partial exp", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"exp\": 1.0e1">>), + F(<<"2}">>) + end =:= [{<<"exp">>, 1.0e12}] + ) + }, + {"partial exp", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"exp\": 1.0e1">>), + F(<<"}">>) + end =:= [{<<"exp">>, 10.0}] + ) + }, + {"partial zero", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"zero\": 0">>), + F(<<".0}">>) + end =:= [{<<"zero">>, 0.0}] + ) + }, + {"partial zero", + ?_assert(begin + {incomplete, F} = jsx:decode(<<"{\"zero\": 0">>), + F(<<"}">>) + end =:= [{<<"zero">>, 0}] + ) + } + ]. + + single_quoted_strings_test_() -> [ {"single quoted keys", diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index c3fe26b..e67d1b0 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -748,8 +748,8 @@ zero(<>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) -> maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); zero(<>, Handler, [Acc|Stack], Opts=#opts{comments=true}) -> comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts); -zero(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) -> - maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); +zero(<<>>, Handler, [Acc|[]], Opts = #opts{explicit_end=false}) -> + maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), [], Opts); zero(<<>>, Handler, Stack, Opts) -> ?incomplete(zero, <<>>, Handler, Stack, Opts); zero(Bin, Handler, Stack, Opts) -> @@ -776,8 +776,8 @@ integer(<>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) - maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); integer(<>, Handler, [Acc|Stack], Opts=#opts{comments=true}) -> comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts); -integer(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) -> - maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); +integer(<<>>, Handler, [Acc|[]], Opts = #opts{explicit_end=false}) -> + maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), [], Opts); integer(<<>>, Handler, Stack, Opts) -> ?incomplete(integer, <<>>, Handler, Stack, Opts); integer(Bin, Handler, Stack, Opts) -> @@ -809,8 +809,8 @@ decimal(<>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) - maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); decimal(<>, Handler, [Acc|Stack], Opts=#opts{comments=true}) -> comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts); -decimal(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) -> - maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); +decimal(<<>>, Handler, [Acc|[]], Opts = #opts{explicit_end=false}) -> + maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), [], Opts); decimal(<<>>, Handler, Stack, Opts) -> ?incomplete(decimal, <<>>, Handler, Stack, Opts); decimal(Bin, Handler, Stack, Opts) -> @@ -849,8 +849,8 @@ exp(<>, Handler, [Acc|Stack], Opts) when ?is_whitespace(S) -> maybe_done(Rest, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); exp(<>, Handler, [Acc|Stack], Opts=#opts{comments=true}) -> comment(Rest, handle_event(format_number(Acc), Handler, Opts), [maybe_done|Stack], Opts); -exp(<<>>, Handler, [Acc|Stack], Opts = #opts{explicit_end=false}) -> - maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), Stack, Opts); +exp(<<>>, Handler, [Acc|[]], Opts = #opts{explicit_end=false}) -> + maybe_done(<<>>, handle_event(format_number(Acc), Handler, Opts), [], Opts); exp(<<>>, Handler, Stack, Opts) -> ?incomplete(exp, <<>>, Handler, Stack, Opts); exp(Bin, Handler, Stack, Opts) ->