diff options
author | Joshua Haberman <joshua@reverberate.org> | 2011-02-24 00:09:27 -0800 |
---|---|---|
committer | Joshua Haberman <joshua@reverberate.org> | 2011-02-24 00:09:27 -0800 |
commit | abfc897b50532e5ed64f7f5497f80ef56abd3b26 (patch) | |
tree | 003c19da802085acb293d0b7d30026e9ad1adc56 /src/upb_decoder.c | |
parent | 4d6585290955613b23e5ade89794fb465cb7ec3a (diff) |
Pass the upb_fielddef* to the endmsg callback.
Diffstat (limited to 'src/upb_decoder.c')
-rw-r--r-- | src/upb_decoder.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/upb_decoder.c b/src/upb_decoder.c index 7db8243..f028297 100644 --- a/src/upb_decoder.c +++ b/src/upb_decoder.c @@ -197,9 +197,8 @@ static upb_flow_t upb_push(upb_decoder *d, upb_fielddef *f, UPB_GROUP_END_OFFSET : d->buf_stream_offset + (d->ptr - upb_string_getrobuf(d->buf)) + upb_value_getint32(submsg_len); - upb_msgdef *md = upb_downcast_msgdef(f->def); - d->top->msgdef = md; - d->msgdef = md; + d->top->f = f; + d->msgdef = upb_downcast_msgdef(f->def); upb_dstate_setmsgend(d); upb_flow_t ret = upb_dispatch_startsubmsg(&d->dispatcher, f); if (ret == UPB_SKIPSUBMSG) { @@ -217,9 +216,9 @@ static upb_flow_t upb_push(upb_decoder *d, upb_fielddef *f, static upb_flow_t upb_pop(upb_decoder *d) { --d->top; + d->msgdef = upb_downcast_msgdef(d->top->f->def); upb_dstate_setmsgend(d); - d->msgdef = d->top->msgdef; - return upb_dispatch_endsubmsg(&d->dispatcher); + return upb_dispatch_endsubmsg(&d->dispatcher, d->top->f); } void upb_decoder_run(upb_src *src, upb_status *status) { @@ -228,7 +227,7 @@ void upb_decoder_run(upb_src *src, upb_status *status) { d->ptr = NULL; d->end = NULL; // Force a buffer pull. d->submsg_end = (void*)0x1; // But don't let end-of-message get triggered. - d->msgdef = d->top->msgdef; + d->msgdef = upb_downcast_msgdef(d->top->f->def); // TODO: handle UPB_SKIPSUBMSG #define CHECK_FLOW(expr) if ((expr) == UPB_BREAK) { /*assert(!upb_ok(status));*/ goto callback_err; } @@ -373,9 +372,6 @@ void upb_decoder_sethandlers(upb_src *src, upb_handlers *handlers) { upb_dispatcher_reset(&d->dispatcher, handlers, true); d->top = d->stack; d->buf_stream_offset = 0; - // The top-level message is not delimited (we can keep receiving data for it - // indefinitely), so we treat it like a group. - d->top->end_offset = 0; } void upb_decoder_init(upb_decoder *d, upb_msgdef *msgdef) { @@ -385,7 +381,9 @@ void upb_decoder_init(upb_decoder *d, upb_msgdef *msgdef) { }; upb_src_init(&d->src, &vtbl); upb_dispatcher_init(&d->dispatcher); - d->stack[0].msgdef = msgdef; + d->f.def = UPB_UPCAST(msgdef); + d->stack[0].f = &d->f; + // Never want to end top-level message, so treat it like a group. d->stack[0].end_offset = UPB_GROUP_END_OFFSET; d->limit = &d->stack[UPB_MAX_NESTING]; d->buf = NULL; |