On 11/20/2015 02:04 AM, Paolo Bonzini wrote: > JSON is LL(1) and our parser indeed needs only 1 token lookahead. > Saving the parser context is mostly unnecessary; we can replace it > with peeking at the next token, or remove it altogether when the > restore only happens on errors. The token list is destroyed anyway > on errors. > > The only interesting thing is that parse_keyword always eats > a TOKEN_KEYWORD, even if it is invalid, so it must come last in > parse_value (otherwise, NULL is returned, parse_literal is invoked > and it tries to peek beyond end of input). This is caught by > /errors/unterminated/literal, which actually checks for an unterminated > keyword. ಠ_ಠ > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > qobject/json-parser.c | 59 > ++++++++++++++++++--------------------------------- > 1 file changed, 21 insertions(+), 38 deletions(-) >
> @@ -578,17 +556,21 @@ out: > static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap) > { > QObject *token = NULL, *obj; > - JSONParserContext saved_ctxt = parser_context_save(ctxt); > > if (ap == NULL) { > goto out; > } > > - token = parser_context_pop_token(ctxt); > + token = parser_context_peek_token(ctxt); > if (token == NULL) { > goto out; > } > > + if (token_get_type(token) != JSON_ESCAPE) { > + goto out; > + } Could merge these two conditionals. Otherwise, makes sense to me, and a lot less complicated. Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature