summaryrefslogtreecommitdiff
path: root/upb/sink.c
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2013-05-28 13:44:50 -0700
committerJosh Haberman <jhaberman@gmail.com>2013-05-28 13:44:50 -0700
commitbada1e94f472e7507a97e7565369841b3d25c9b0 (patch)
tree1fe0882b497206db03e21eb87c975d5e400fe097 /upb/sink.c
parentee3a3191cda5faae5dcc9cd1526292c57f2be343 (diff)
Merge from Google-internal development.
- Better error reporting for upb::Def setters. - error reporting for upb::Handlers setters. - made the start/endmsg handlers a little less special-cased.
Diffstat (limited to 'upb/sink.c')
-rw-r--r--upb/sink.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/upb/sink.c b/upb/sink.c
index 0ffb63a..59134d3 100644
--- a/upb/sink.c
+++ b/upb/sink.c
@@ -220,16 +220,27 @@ void *upb_sink_getobj(const upb_sink *s) {
bool upb_sink_startmsg(upb_sink *s) {
const upb_handlers *h = s->top->h;
- upb_startmsg_handler *startmsg = upb_handlers_getstartmsg(h);
- return startmsg ? startmsg(s->top->closure) : true;
+ upb_startmsg_handler *startmsg =
+ (upb_startmsg_handler *)upb_handlers_gethandler(h, UPB_STARTMSG_SELECTOR);
+ if (startmsg) {
+ const void *hd = upb_handlers_gethandlerdata(h, UPB_STARTMSG_SELECTOR);
+ bool ok = startmsg(s->top->closure, hd);
+ if (!ok) return false;
+ }
+ return true;
}
-void upb_sink_endmsg(upb_sink *s) {
+bool upb_sink_endmsg(upb_sink *s) {
assert(s->top == s->stack);
- upb_endmsg_handler *endmsg = upb_handlers_getendmsg(s->top->h);
+ const upb_handlers *h = s->top->h;
+ upb_endmsg_handler *endmsg =
+ (upb_endmsg_handler *)upb_handlers_gethandler(h, UPB_ENDMSG_SELECTOR);
if (endmsg) {
- endmsg(s->top->closure, &s->pipeline_->status_);
+ const void *hd = upb_handlers_gethandlerdata(h, UPB_ENDMSG_SELECTOR);
+ bool ok = endmsg(s->top->closure, hd, &s->pipeline_->status_);
+ if (!ok) return false;
}
+ return true;
}
#define PUTVAL(type, ctype) \
@@ -380,10 +391,13 @@ bool upb_sink_startsubmsg(upb_sink *s, upb_selector_t sel) {
}
bool upb_sink_endsubmsg(upb_sink *s, upb_selector_t sel) {
- upb_endmsg_handler *endmsg = upb_handlers_getendmsg(s->top->h);
+ upb_endmsg_handler *endmsg = (upb_endmsg_handler *)upb_handlers_gethandler(
+ s->top->h, UPB_ENDMSG_SELECTOR);
if (endmsg) {
// TODO(haberman): check return value.
- endmsg(s->top->closure, &s->pipeline_->status_);
+ const void *hd =
+ upb_handlers_gethandlerdata(s->top->h, UPB_ENDMSG_SELECTOR);
+ endmsg(s->top->closure, hd, &s->pipeline_->status_);
}
--s->top;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback