From 0b7904e18cad70e17a2dbed5f1362ccdc62fd385 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 19 Sep 2017 14:23:36 -0700 Subject: Reserve unknown fields in upb 1. For decoding, an unknownfields will be lazily created on message, which contains bytes of unknown fields. 2. For encoding, if the unknownfields is present on message, all bytes contained in it will be serialized. --- upb/pb/decoder.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'upb/pb/decoder.c') diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 182ecc9..79142bf 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -543,6 +543,9 @@ UPB_NOINLINE int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d, int32_t upb_pbdecoder_skipunknown(upb_pbdecoder *d, int32_t fieldnum, uint8_t wire_type) { + upb_addunknown_handlerfunc *addunknown; + const void* hd; + if (fieldnum >= 0) goto have_tag; @@ -596,6 +599,14 @@ have_tag: } if (d->top->groupnum >= 0) { + addunknown = (upb_addunknown_handlerfunc *)upb_handlers_gethandler( + (d->top->sink).handlers, UPB_UNKNOWN_SELECTOR); + if (addunknown != NULL) { + hd = upb_handlers_gethandlerdata((d->top->sink).handlers, + UPB_UNKNOWN_SELECTOR); + addunknown((d->top->sink).closure, hd, d->checkpoint, + d->ptr - d->checkpoint); + } return DECODE_OK; } -- cgit v1.2.3 From dc9d15084fa02c69c277cd730862e49ec10cd38e Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 19 Sep 2017 16:22:32 -0700 Subject: Remove upb_addunknown_handlerfunc and upb_handlers_setaddunknown --- upb/handlers.c | 7 ------- upb/handlers.h | 3 --- upb/pb/decoder.c | 4 ++-- 3 files changed, 2 insertions(+), 12 deletions(-) (limited to 'upb/pb/decoder.c') diff --git a/upb/handlers.c b/upb/handlers.c index b9dc8f3..8799ed0 100644 --- a/upb/handlers.c +++ b/upb/handlers.c @@ -372,13 +372,6 @@ SETTER(endseq, upb_endfield_handlerfunc*, UPB_HANDLER_ENDSEQ) #undef SETTER -bool upb_handlers_setaddunknown(upb_handlers *h, - upb_addunknown_handlerfunc *func, - upb_handlerattr *attr) { - return doset(h, UPB_UNKNOWN_SELECTOR, NULL, UPB_HANDLER_INT32, - (upb_func *)func, attr); -} - bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func, upb_handlerattr *attr) { return doset(h, UPB_UNKNOWN_SELECTOR, NULL, UPB_HANDLER_INT32, diff --git a/upb/handlers.h b/upb/handlers.h index 0f28f19..33cdf86 100644 --- a/upb/handlers.h +++ b/upb/handlers.h @@ -691,9 +691,6 @@ const upb_status *upb_handlers_status(upb_handlers *h); void upb_handlers_clearerr(upb_handlers *h); const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h); bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *hfree); -bool upb_handlers_setaddunknown(upb_handlers *h, - upb_addunknown_handlerfunc *func, - upb_handlerattr *attr); bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func, upb_handlerattr *attr); diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 79142bf..32509b5 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -543,7 +543,7 @@ UPB_NOINLINE int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d, int32_t upb_pbdecoder_skipunknown(upb_pbdecoder *d, int32_t fieldnum, uint8_t wire_type) { - upb_addunknown_handlerfunc *addunknown; + upb_unknown_handlerfunc *addunknown; const void* hd; if (fieldnum >= 0) @@ -599,7 +599,7 @@ have_tag: } if (d->top->groupnum >= 0) { - addunknown = (upb_addunknown_handlerfunc *)upb_handlers_gethandler( + addunknown = (upb_unknown_handlerfunc *)upb_handlers_gethandler( (d->top->sink).handlers, UPB_UNKNOWN_SELECTOR); if (addunknown != NULL) { hd = upb_handlers_gethandlerdata((d->top->sink).handlers, -- cgit v1.2.3 From 5aa27d91c6f25705c89ec56c5a33f6bd20d9c124 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 19 Sep 2017 16:45:55 -0700 Subject: Use upb_sink_putunknown for reserve unknown --- upb/pb/decoder.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'upb/pb/decoder.c') diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 32509b5..30a1945 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -599,14 +599,7 @@ have_tag: } if (d->top->groupnum >= 0) { - addunknown = (upb_unknown_handlerfunc *)upb_handlers_gethandler( - (d->top->sink).handlers, UPB_UNKNOWN_SELECTOR); - if (addunknown != NULL) { - hd = upb_handlers_gethandlerdata((d->top->sink).handlers, - UPB_UNKNOWN_SELECTOR); - addunknown((d->top->sink).closure, hd, d->checkpoint, - d->ptr - d->checkpoint); - } + upb_sink_putunknown(&d->top->sink, d->checkpoint, d->ptr - d->checkpoint); return DECODE_OK; } -- cgit v1.2.3 From 6a6e192375076aa1fdc9f08c1a8b5ca98fdc04f9 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Tue, 19 Sep 2017 16:51:38 -0700 Subject: Remove unused declaration. --- upb/pb/decoder.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'upb/pb/decoder.c') diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 30a1945..94fa031 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -543,9 +543,6 @@ UPB_NOINLINE int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d, int32_t upb_pbdecoder_skipunknown(upb_pbdecoder *d, int32_t fieldnum, uint8_t wire_type) { - upb_unknown_handlerfunc *addunknown; - const void* hd; - if (fieldnum >= 0) goto have_tag; -- cgit v1.2.3 From 0a9681874ee9ec1e3104b4bdb8e6b2396561ccb6 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Mon, 25 Sep 2017 17:09:24 -0700 Subject: Modify TODO --- upb/pb/decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'upb/pb/decoder.c') diff --git a/upb/pb/decoder.c b/upb/pb/decoder.c index 94fa031..0cae05b 100644 --- a/upb/pb/decoder.c +++ b/upb/pb/decoder.c @@ -558,7 +558,6 @@ have_tag: return upb_pbdecoder_suspend(d); } - /* TODO: deliver to unknown field callback. */ switch (wire_type) { case UPB_WIRE_TYPE_32BIT: CHECK_RETURN(skip(d, 4)); @@ -596,6 +595,7 @@ have_tag: } if (d->top->groupnum >= 0) { + /* TODO: More code needed for handling unknown groups. */ upb_sink_putunknown(&d->top->sink, d->checkpoint, d->ptr - d->checkpoint); return DECODE_OK; } -- cgit v1.2.3