summaryrefslogtreecommitdiff
path: root/core/upb_stream_vtbl.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/upb_stream_vtbl.h')
-rw-r--r--core/upb_stream_vtbl.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/core/upb_stream_vtbl.h b/core/upb_stream_vtbl.h
index da3eac8..e1f9cb8 100644
--- a/core/upb_stream_vtbl.h
+++ b/core/upb_stream_vtbl.h
@@ -218,16 +218,19 @@ typedef struct {
struct _upb_dispatcher {
upb_dispatcher_frame stack[UPB_MAX_NESTING], *top, *limit;
+ bool supports_skip;
};
INLINE void upb_dispatcher_init(upb_dispatcher *d) {
d->limit = d->stack + sizeof(d->stack);
}
-INLINE void upb_dispatcher_reset(upb_dispatcher *d, upb_handlers *h) {
+INLINE void upb_dispatcher_reset(upb_dispatcher *d, upb_handlers *h,
+ bool supports_skip) {
d->top = d->stack;
d->top->depth = 1; // Never want to trigger end-of-delegation.
d->top->handlers = *h;
+ d->supports_skip = supports_skip;
}
INLINE upb_flow_t upb_dispatch_startmsg(upb_dispatcher *d) {
@@ -256,7 +259,7 @@ INLINE upb_flow_t upb_dispatch_startsubmsg(upb_dispatcher *d,
d->top->depth = 0;
ret = d->top->handlers.set->startmsg(d->top->handlers.closure);
}
- if (ret == UPB_CONTINUE) ++d->top->depth;
+ if (ret == UPB_CONTINUE || !d->supports_skip) ++d->top->depth;
upb_handlers_uninit(&handlers);
return ret;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback