[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 08/18] json-parser: simplify and avoid JSONPa
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 08/18] json-parser: simplify and avoid JSONParserContext allocation |
Date: |
Fri, 20 Jul 2018 08:28:53 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Marc-André Lureau <address@hidden> writes:
> parser_context_new/free() are only used from json_parser_parse(). We
> can fold the code there and avoid an allocation altogether.
>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
> qobject/json-parser.c | 41 +++++++++--------------------------------
> 1 file changed, 9 insertions(+), 32 deletions(-)
>
> diff --git a/qobject/json-parser.c b/qobject/json-parser.c
> index 9a7004e680..6baf73b4b9 100644
> --- a/qobject/json-parser.c
> +++ b/qobject/json-parser.c
> @@ -244,33 +244,6 @@ static JSONToken
> *parser_context_peek_token(JSONParserContext *ctxt)
> return g_queue_peek_head(ctxt->buf);
> }
>
> -static JSONParserContext *parser_context_new(GQueue *tokens)
> -{
> - JSONParserContext *ctxt;
> -
> - if (!tokens) {
> - return NULL;
> - }
> -
> - ctxt = g_malloc0(sizeof(JSONParserContext));
> - ctxt->buf = tokens;
> -
> - return ctxt;
> -}
> -
> -/* to support error propagation, ctxt->err must be freed separately */
> -static void parser_context_free(JSONParserContext *ctxt)
> -{
> - if (ctxt) {
> - while (!g_queue_is_empty(ctxt->buf)) {
> - parser_context_pop_token(ctxt);
> - }
> - g_free(ctxt->current);
> - g_queue_free(ctxt->buf);
> - g_free(ctxt);
> - }
> -}
> -
> /**
> * Parsing rules
> */
> @@ -577,18 +550,22 @@ static QObject *parse_value(JSONParserContext *ctxt,
> va_list *ap)
>
> QObject *json_parser_parse(GQueue *tokens, va_list *ap, Error **errp)
> {
> - JSONParserContext *ctxt = parser_context_new(tokens);
> + JSONParserContext ctxt = { .buf = tokens };
> QObject *result;
>
> - if (!ctxt) {
> + if (!tokens) {
> return NULL;
> }
>
> - result = parse_value(ctxt, ap);
> + result = parse_value(&ctxt, ap);
>
> - error_propagate(errp, ctxt->err);
> + error_propagate(errp, ctxt.err);
>
> - parser_context_free(ctxt);
> + while (!g_queue_is_empty(ctxt.buf)) {
> + parser_context_pop_token(&ctxt);
> + }
> + g_free(ctxt.current);
> + g_queue_free(ctxt.buf);
>
> return result;
> }
A lovely simplification.
Reviewed-by: Markus Armbruster <address@hidden>
- [Qemu-devel] [PATCH v2 00/18] monitor: various code simplification and fixes, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 03/18] qmp: constify qmp_is_oob(), Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 01/18] tests: change /0.15/* tests to /qmp/*, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 02/18] monitor: consitify qmp_send_response() QDict argument, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 04/18] Revert "qmp: isolate responses into io thread", Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 05/18] monitor: no need to save need_resume, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 11/18] qjson: report error on unterminated string, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 08/18] json-parser: simplify and avoid JSONParserContext allocation, Marc-André Lureau, 2018/07/19
- Re: [Qemu-devel] [PATCH v2 08/18] json-parser: simplify and avoid JSONParserContext allocation,
Markus Armbruster <=
- [Qemu-devel] [PATCH v2 10/18] qjson: report an error if there are multiple results, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 09/18] json-parser: further simplify freeing JSONParserContext, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 06/18] qga: process_event() simplification and leak fix, Marc-André Lureau, 2018/07/19
- [Qemu-devel] [PATCH v2 07/18] qmp: drop json_parser_parse() wrapper, Marc-André Lureau, 2018/07/19