mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:17 +00:00
json-parser: add location to JSON parsing errors
Now that all calls to parse_error have a token, add the line and column to the message. As far as I can see the two important TODOs (better errors and better EOI handling) are done, and the others (token range information and "parsed size"?) do not really matter or are handled better by json-streamer.c. So remove the list, which had sat unchanged since 2009. This needs some adjustments to provide a good x and y for error messages. First of all, they switch from zero-based to one-based, which is safe because they were both sitting unused. Second, right now the x and y are those of the *last* character in the token. Modify json-lexer.c to freeze tok->x and tok->y at the first character added to the GString. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20260626101727.1727389-7-pbonzini@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
committed by
Markus Armbruster
parent
55320a2983
commit
b6368e7c77
@@ -277,7 +277,8 @@ void json_lexer_init(JSONLexer *lexer, bool enable_interpolation)
|
||||
lexer->start_state = lexer->state = enable_interpolation
|
||||
? IN_START_INTERP : IN_START;
|
||||
lexer->token = g_string_sized_new(3);
|
||||
lexer->x = lexer->y = 0;
|
||||
lexer->cur_x = lexer->cur_y = 1;
|
||||
lexer->x = lexer->y = 1;
|
||||
}
|
||||
|
||||
static void json_lexer_feed_char(JSONLexer *lexer, char ch, bool flush)
|
||||
@@ -285,10 +286,10 @@ static void json_lexer_feed_char(JSONLexer *lexer, char ch, bool flush)
|
||||
int new_state;
|
||||
bool char_consumed = false;
|
||||
|
||||
lexer->x++;
|
||||
lexer->cur_x++;
|
||||
if (ch == '\n') {
|
||||
lexer->x = 0;
|
||||
lexer->y++;
|
||||
lexer->cur_x = 1;
|
||||
lexer->cur_y++;
|
||||
}
|
||||
|
||||
while (flush ? lexer->state != lexer->start_state : !char_consumed) {
|
||||
@@ -316,6 +317,8 @@ static void json_lexer_feed_char(JSONLexer *lexer, char ch, bool flush)
|
||||
case IN_START:
|
||||
g_string_truncate(lexer->token, 0);
|
||||
new_state = lexer->start_state;
|
||||
lexer->x = lexer->cur_x;
|
||||
lexer->y = lexer->cur_y;
|
||||
break;
|
||||
case JSON_ERROR:
|
||||
json_message_process_token(lexer, lexer->token, JSON_ERROR,
|
||||
|
||||
@@ -133,15 +133,6 @@ typedef struct JSONParserStackEntry {
|
||||
|
||||
#define BUG_ON(cond) assert(!(cond))
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*
|
||||
* 0) make errors meaningful again
|
||||
* 1) add geometry information to tokens
|
||||
* 3) should we return a parsed size?
|
||||
* 4) deal with premature EOI
|
||||
*/
|
||||
|
||||
static inline JSONParserStackEntry *current_entry(JSONParserContext *ctxt)
|
||||
{
|
||||
return g_queue_peek_tail(ctxt->stack);
|
||||
@@ -180,7 +171,8 @@ static void G_GNUC_PRINTF(3, 4) parse_error(JSONParserContext *ctxt,
|
||||
va_start(ap, msg);
|
||||
vsnprintf(message, sizeof(message), msg, ap);
|
||||
va_end(ap);
|
||||
error_setg(&ctxt->err, "JSON parse error, %s", message);
|
||||
error_setg(&ctxt->err, "%d:%d: JSON parse error, %s",
|
||||
token->y, token->x, message);
|
||||
}
|
||||
|
||||
static int cvt4hex(const char *s)
|
||||
|
||||
Reference in New Issue
Block a user