|
|
|
@ -185,15 +185,16 @@ UPB_INLINE bool upb_sink_startsubmsg(upb_sink s, upb_selector_t sel, |
|
|
|
|
return sub->closure ? true : false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
UPB_INLINE bool upb_sink_endsubmsg(upb_sink s, upb_selector_t sel) { |
|
|
|
|
UPB_INLINE bool upb_sink_endsubmsg(upb_sink s, upb_sink sub, |
|
|
|
|
upb_selector_t sel) { |
|
|
|
|
typedef upb_endfield_handlerfunc func; |
|
|
|
|
func *endsubmsg; |
|
|
|
|
const void *hd; |
|
|
|
|
if (!s.handlers) return true; |
|
|
|
|
endsubmsg = (func*)upb_handlers_gethandler(s.handlers, sel, &hd); |
|
|
|
|
|
|
|
|
|
if (!endsubmsg) return s.closure; |
|
|
|
|
return endsubmsg(s.closure, hd); |
|
|
|
|
if (!endsubmsg) return true; |
|
|
|
|
return endsubmsg(sub.closure, hd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
@ -359,8 +360,8 @@ class upb::Sink { |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool EndSubMessage(HandlersPtr::Selector s) { |
|
|
|
|
return upb_sink_endsubmsg(sink_, s); |
|
|
|
|
bool EndSubMessage(HandlersPtr::Selector s, Sink sub) { |
|
|
|
|
return upb_sink_endsubmsg(sink_, sub.sink_, s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* For repeated fields of any type, the sequence of values must be wrapped in
|
|
|
|
|