From 8a35fdd8f549ba0e777ca49ce3444fd709ef445b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sat, 20 May 2017 12:24:13 +0200 Subject: [PATCH] :hammer: overworked accept() function Fixed to make sure no token is "overlooked". --- src/json.hpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/json.hpp b/src/json.hpp index f522dea56..02f0e7b5a 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -12556,7 +12556,7 @@ scan_number_done: return false; } - if (strict and last_token != lexer::token_type::end_of_input) + if (strict and get_token() != lexer::token_type::end_of_input) { return false; } @@ -12787,6 +12787,14 @@ scan_number_done: /*! @brief the acutal acceptor + + @invariant 1. The last token is not yet processed. Therefore, the + caller of this function must make sure a token has + been read. + 2. When this function returns, the last token is processed. + That is, the last read character was already considered. + + This invariant makes sure that no token needs to be "unput". */ bool accept_internal() { @@ -12800,7 +12808,6 @@ scan_number_done: // closing } -> we are done if (last_token == lexer::token_type::end_object) { - get_token(); return true; } @@ -12828,6 +12835,7 @@ scan_number_done: } // comma -> next value + get_token(); if (last_token == lexer::token_type::value_separator) { get_token(); @@ -12840,7 +12848,6 @@ scan_number_done: return false; } - get_token(); return true; } } @@ -12853,7 +12860,6 @@ scan_number_done: // closing ] -> we are done if (last_token == lexer::token_type::end_array) { - get_token(); return true; } @@ -12867,6 +12873,7 @@ scan_number_done: } // comma -> next value + get_token(); if (last_token == lexer::token_type::value_separator) { get_token(); @@ -12879,20 +12886,18 @@ scan_number_done: return false; } - get_token(); return true; } } - case lexer::token_type::literal_null: - case lexer::token_type::value_string: - case lexer::token_type::literal_true: case lexer::token_type::literal_false: - case lexer::token_type::value_unsigned: - case lexer::token_type::value_integer: + case lexer::token_type::literal_null: + case lexer::token_type::literal_true: case lexer::token_type::value_float: + case lexer::token_type::value_integer: + case lexer::token_type::value_string: + case lexer::token_type::value_unsigned: { - get_token(); return true; }