Patchwork JSON: add %I64d support (Was: Re: [Qemu-devel] system_reset command cause assert failed)

login
register
mail settings
Submitter Roy Tam
Date Feb. 4, 2010, 2:30 a.m.
Message ID <473191351002031830w7876c367vf534508e292c4f04@mail.gmail.com>
Download mbox | patch
Permalink /patch/44446/
State New
Headers show

Comments

Roy Tam - Feb. 4, 2010, 2:30 a.m.
2010/2/4 Roy Tam <roytam@gmail.com>:
> 2010/2/3 Luiz Capitulino <lcapitulino@redhat.com>:

OK we are fooled by the json lexer and parser. As we use %I64d to
print 'long long' variables in Win32, but lexer and parser only deal
with %lld but not %I64d, this patch add support for %I64d and solve
'info pci', 'powser_reset' and 'power_powerdown' assert failure in
Win32.

P.S.: an assert(state.result != NULL) statement in
qobject_from_jsonv() will be good for asserting failure of parsing
JSON strings.

     } else if (token_is_escape(token, "%s")) {
         obj = QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
Luiz Capitulino - Feb. 4, 2010, 2:24 p.m.
On Thu, 4 Feb 2010 10:30:30 +0800
Roy Tam <roytam@gmail.com> wrote:

> 2010/2/4 Roy Tam <roytam@gmail.com>:
> > 2010/2/3 Luiz Capitulino <lcapitulino@redhat.com>:
> 
> OK we are fooled by the json lexer and parser. As we use %I64d to
> print 'long long' variables in Win32, but lexer and parser only deal
> with %lld but not %I64d, this patch add support for %I64d and solve
> 'info pci', 'powser_reset' and 'power_powerdown' assert failure in
> Win32.

 Hm, I guess this has been suggested before... Anthony?

> P.S.: an assert(state.result != NULL) statement in
> qobject_from_jsonv() will be good for asserting failure of parsing
> JSON strings.

 Yes, this change is already in a series I plan to send shortly.

 Thanks a lot for tracking this down.
Roy Tam - Feb. 4, 2010, 4:59 p.m.
2010/2/4 Luiz Capitulino <lcapitulino@redhat.com>:
> On Thu, 4 Feb 2010 10:30:30 +0800
> Roy Tam <roytam@gmail.com> wrote:
>
>> 2010/2/4 Roy Tam <roytam@gmail.com>:
>> > 2010/2/3 Luiz Capitulino <lcapitulino@redhat.com>:
>>
>> OK we are fooled by the json lexer and parser. As we use %I64d to
>> print 'long long' variables in Win32, but lexer and parser only deal
>> with %lld but not %I64d, this patch add support for %I64d and solve
>> 'info pci', 'powser_reset' and 'power_powerdown' assert failure in
>> Win32.
>
>  Hm, I guess this has been suggested before... Anthony?
>

OK I just missed this. And the wheel was reinvented. :-S
http://www.mail-archive.com/qemu-devel@nongnu.org/msg23983.html

>> P.S.: an assert(state.result != NULL) statement in
>> qobject_from_jsonv() will be good for asserting failure of parsing
>> JSON strings.
>
>  Yes, this change is already in a series I plan to send shortly.
>
>  Thanks a lot for tracking this down.
>
Anthony Liguori - Feb. 8, 2010, 4:21 p.m.
On 02/04/2010 10:59 AM, Roy Tam wrote:
> 2010/2/4 Luiz Capitulino<lcapitulino@redhat.com>:
>    
>> On Thu, 4 Feb 2010 10:30:30 +0800
>> Roy Tam<roytam@gmail.com>  wrote:
>>
>>      
>>> 2010/2/4 Roy Tam<roytam@gmail.com>:
>>>        
>>>> 2010/2/3 Luiz Capitulino<lcapitulino@redhat.com>:
>>>>          
>>> OK we are fooled by the json lexer and parser. As we use %I64d to
>>> print 'long long' variables in Win32, but lexer and parser only deal
>>> with %lld but not %I64d, this patch add support for %I64d and solve
>>> 'info pci', 'powser_reset' and 'power_powerdown' assert failure in
>>> Win32.
>>>        
>>   Hm, I guess this has been suggested before... Anthony?
>>
>>      
> OK I just missed this. And the wheel was reinvented. :-S
> http://www.mail-archive.com/qemu-devel@nongnu.org/msg23983.html
>    

I asked for the json parser changes to be split from the PRId64 
changes.  It was never resubmitted.  I'll apply your patch.

Regards,

Anthony Liguori
Anthony Liguori - Feb. 10, 2010, 7:28 p.m.
On 02/03/2010 08:30 PM, Roy Tam wrote:
> 2010/2/4 Roy Tam<roytam@gmail.com>:
>    
>> 2010/2/3 Luiz Capitulino<lcapitulino@redhat.com>:
>>      
> OK we are fooled by the json lexer and parser. As we use %I64d to
> print 'long long' variables in Win32, but lexer and parser only deal
> with %lld but not %I64d, this patch add support for %I64d and solve
> 'info pci', 'powser_reset' and 'power_powerdown' assert failure in
> Win32.
>
> P.S.: an assert(state.result != NULL) statement in
> qobject_from_jsonv() will be good for asserting failure of parsing
> JSON strings.
>    


Applied.  Thanks.

Regards,

Anthony Liguori

> diff --git a/json-lexer.c b/json-lexer.c
> index 53697c5..9d64920 100644
> --- a/json-lexer.c
> +++ b/json-lexer.c
> @@ -54,6 +54,9 @@ enum json_lexer_state {
>       IN_ESCAPE,
>       IN_ESCAPE_L,
>       IN_ESCAPE_LL,
> +    IN_ESCAPE_I,
> +    IN_ESCAPE_I6,
> +    IN_ESCAPE_I64,
>       IN_ESCAPE_DONE,
>       IN_WHITESPACE,
>       IN_OPERATOR_DONE,
> @@ -223,6 +226,18 @@ static const uint8_t json_lexer[][256] =  {
>           ['l'] = IN_ESCAPE_LL,
>       },
>
> +    [IN_ESCAPE_I64] = {
> +        ['d'] = IN_ESCAPE_DONE,
> +    },
> +
> +    [IN_ESCAPE_I6] = {
> +        ['4'] = IN_ESCAPE_I64,
> +    },
> +
> +    [IN_ESCAPE_I] = {
> +        ['6'] = IN_ESCAPE_I6,
> +    },
> +
>       [IN_ESCAPE] = {
>           ['d'] = IN_ESCAPE_DONE,
>           ['i'] = IN_ESCAPE_DONE,
> @@ -230,6 +245,7 @@ static const uint8_t json_lexer[][256] =  {
>           ['s'] = IN_ESCAPE_DONE,
>           ['f'] = IN_ESCAPE_DONE,
>           ['l'] = IN_ESCAPE_L,
> +        ['I'] = IN_ESCAPE_I,
>       },
>
>       /* top level rule */
> diff --git a/json-parser.c b/json-parser.c
> index e04932f..40a5d15 100644
> --- a/json-parser.c
> +++ b/json-parser.c
> @@ -474,7 +474,7 @@ static QObject *parse_escape(JSONParserContext
> *ctxt, QList **tokens, va_list *a
>           obj = QOBJECT(qint_from_int(va_arg(*ap, int)));
>       } else if (token_is_escape(token, "%ld")) {
>           obj = QOBJECT(qint_from_int(va_arg(*ap, long)));
> -    } else if (token_is_escape(token, "%lld")) {
> +    } else if (token_is_escape(token, "%lld") ||
> token_is_escape(token, "%I64d")) {
>           obj = QOBJECT(qint_from_int(va_arg(*ap, long long)));
>       } else if (token_is_escape(token, "%s")) {
>           obj = QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
>
>
>
>

Patch

diff --git a/json-lexer.c b/json-lexer.c
index 53697c5..9d64920 100644
--- a/json-lexer.c
+++ b/json-lexer.c
@@ -54,6 +54,9 @@  enum json_lexer_state {
     IN_ESCAPE,
     IN_ESCAPE_L,
     IN_ESCAPE_LL,
+    IN_ESCAPE_I,
+    IN_ESCAPE_I6,
+    IN_ESCAPE_I64,
     IN_ESCAPE_DONE,
     IN_WHITESPACE,
     IN_OPERATOR_DONE,
@@ -223,6 +226,18 @@  static const uint8_t json_lexer[][256] =  {
         ['l'] = IN_ESCAPE_LL,
     },

+    [IN_ESCAPE_I64] = {
+        ['d'] = IN_ESCAPE_DONE,
+    },
+
+    [IN_ESCAPE_I6] = {
+        ['4'] = IN_ESCAPE_I64,
+    },
+
+    [IN_ESCAPE_I] = {
+        ['6'] = IN_ESCAPE_I6,
+    },
+
     [IN_ESCAPE] = {
         ['d'] = IN_ESCAPE_DONE,
         ['i'] = IN_ESCAPE_DONE,
@@ -230,6 +245,7 @@  static const uint8_t json_lexer[][256] =  {
         ['s'] = IN_ESCAPE_DONE,
         ['f'] = IN_ESCAPE_DONE,
         ['l'] = IN_ESCAPE_L,
+        ['I'] = IN_ESCAPE_I,
     },

     /* top level rule */
diff --git a/json-parser.c b/json-parser.c
index e04932f..40a5d15 100644
--- a/json-parser.c
+++ b/json-parser.c
@@ -474,7 +474,7 @@  static QObject *parse_escape(JSONParserContext
*ctxt, QList **tokens, va_list *a
         obj = QOBJECT(qint_from_int(va_arg(*ap, int)));
     } else if (token_is_escape(token, "%ld")) {
         obj = QOBJECT(qint_from_int(va_arg(*ap, long)));
-    } else if (token_is_escape(token, "%lld")) {
+    } else if (token_is_escape(token, "%lld") ||
token_is_escape(token, "%I64d")) {
         obj = QOBJECT(qint_from_int(va_arg(*ap, long long)));