pull/13171/head
Joshua Haberman 6 years ago
parent 583f24fec1
commit 7485261370
  1. 24
      upb/decode.c

@ -30,20 +30,26 @@ const uint8_t upb_desctype_to_fieldtype[] = {
/* Data pertaining to the parse. */ /* Data pertaining to the parse. */
typedef struct { typedef struct {
/* Current decoding pointer. Points to the beginning of a field until we /* Parsing limit: either end of delimited region or end of buffer. */
* have finished decoding the whole field. */ const char *limit;
const char *ptr;
/* 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_arena *arena;
} upb_decstate; } upb_decstate;
/* Data pertaining to a single message frame. */ /* Data passed by value to each parsing function. */
typedef struct { typedef struct {
const char *limit; const char *ptr,
int32_t group_number; /* 0 if we are not parsing a group. */
/* These members are unset for an unknown group frame. */
char *msg; char *msg;
const upb_msglayout *m; const upb_msglayout *m;
upb_decstate *state;
} upb_decframe; } upb_decframe;
#define CHK(x) if (!(x)) { return false; } #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, static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame,
const char *start) { 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; return true;
} }

Loading…
Cancel
Save