From 7485261370ad0bb691c801a4128712d962cdd7d3 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sun, 2 Jun 2019 21:09:33 -0700 Subject: [PATCH] WIP. --- upb/decode.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/upb/decode.c b/upb/decode.c index 17733d33d1..8d3b3985a7 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -30,20 +30,26 @@ const uint8_t upb_desctype_to_fieldtype[] = { /* Data pertaining to the parse. */ typedef struct { - /* Current decoding pointer. Points to the beginning of a field until we - * have finished decoding the whole field. */ - const char *ptr; + /* Parsing limit: either end of delimited region or end of buffer. */ + const char *limit; + + /* Signals how the parse ended: + * - when 0: parse ended at delimited limit. + * - when 1: parse ended due to end-of-stream. + * - otherwise: parse ended due to a terminating tag (either 0 or END_GROUP). + * + * In the last case, tag-1 is stored, to avoid conflicting with case 0. */ + uint32_t parse_status; + upb_arena *arena; } upb_decstate; -/* Data pertaining to a single message frame. */ +/* Data passed by value to each parsing function. */ typedef struct { - const char *limit; - int32_t group_number; /* 0 if we are not parsing a group. */ - - /* These members are unset for an unknown group frame. */ + const char *ptr, char *msg; const upb_msglayout *m; + upb_decstate *state; } upb_decframe; #define CHK(x) if (!(x)) { return false; } @@ -133,7 +139,7 @@ static void upb_set32(void *msg, size_t ofs, uint32_t val) { static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame, const char *start) { - upb_msg_addunknown(frame->msg, start, d->ptr - start); + upb_msg_addunknown(frame->msg, start, d->ptr - start, d->arena); return true; }