diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2011-05-10 21:59:46 -0700 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2011-05-10 21:59:46 -0700 |
commit | 3231fd0fdd64bc6355bce921a988713524726f23 (patch) | |
tree | 326d6c6d334d14005db80c448fca485f641ed516 /src/upb_msg.c | |
parent | ea2a80840e08887e6e5ea59bce1f56a3c69bd38c (diff) |
Vastly improved/simplified the upb_handlers API.
Diffstat (limited to 'src/upb_msg.c')
-rw-r--r-- | src/upb_msg.c | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/src/upb_msg.c b/src/upb_msg.c index 98147c8..1115673 100644 --- a/src/upb_msg.c +++ b/src/upb_msg.c @@ -461,55 +461,49 @@ upb_sflow_t upb_msgsink_startsubmsg_r(void *_m, upb_value _fval) { return UPB_CONTINUE_WITH(upb_msg_appendmsg(m, &f, &md)); } -void upb_msg_regdhandlers(upb_handlers *h) { - upb_register_all(h, NULL, NULL, NULL, NULL, NULL); - for (int i = 0; i < h->msgs_len; i++) { - upb_mhandlers *m = &h->msgs[i]; - upb_inttable_iter iter = upb_inttable_begin(&m->fieldtab); - for(; !upb_inttable_done(iter); - iter = upb_inttable_next(&m->fieldtab, iter)) { - upb_fhandlers *fe = upb_inttable_iter_value(iter); - if (fe->type == UPB_TYPE_ENDGROUP) continue; - upb_fielddef *f = upb_value_getfielddef(fe->fval); - uint16_t msg_size = 0; - uint8_t set_flags_bytes = 0; - if (upb_issubmsg(f)) { - upb_msgdef *md = upb_downcast_msgdef(f->def); - msg_size = md->size; - set_flags_bytes = md->set_flags_bytes; - } - upb_value_setuint64(&fe->fval, - upb_msgsink_packfval(f->set_bit_offset, f->set_bit_mask, - f->byte_offset, msg_size, set_flags_bytes)); +INLINE void upb_msg_onfreg(void *c, upb_fhandlers *fh, upb_fielddef *f) { + (void)c; + uint16_t msg_size = 0; + uint8_t set_flags_bytes = 0; + if (upb_issubmsg(f)) { + upb_msgdef *md = upb_downcast_msgdef(f->def); + msg_size = md->size; + set_flags_bytes = md->set_flags_bytes; + } + upb_value_setuint64(&fh->fval, + upb_msgsink_packfval(f->set_bit_offset, f->set_bit_mask, + f->byte_offset, msg_size, set_flags_bytes)); #define CASE(upb_type, type) \ - case UPB_TYPE(upb_type): \ - fe->cb.value = upb_isarray(f) ? \ - upb_msgsink_ ## type ## value_r : upb_msgsink_ ## type ## value; \ - break; - switch (f->type) { - CASE(DOUBLE, double) - CASE(FLOAT, float) - CASE(INT32, int32) - CASE(INT64, int64) - CASE(UINT32, uint32) - CASE(UINT64, uint64) - CASE(SINT32, int32) - CASE(SINT64, int64) - CASE(FIXED32, uint32) - CASE(FIXED64, uint64) - CASE(SFIXED32, int32) - CASE(SFIXED64, int64) - CASE(BOOL, bool) - CASE(ENUM, int32) - CASE(STRING, str) - CASE(BYTES, str) +case UPB_TYPE(upb_type): \ + fh->value = upb_isarray(f) ? \ + upb_msgsink_ ## type ## value_r : upb_msgsink_ ## type ## value; \ + break; + switch (f->type) { + CASE(DOUBLE, double) + CASE(FLOAT, float) + CASE(INT32, int32) + CASE(INT64, int64) + CASE(UINT32, uint32) + CASE(UINT64, uint64) + CASE(SINT32, int32) + CASE(SINT64, int64) + CASE(FIXED32, uint32) + CASE(FIXED64, uint64) + CASE(SFIXED32, int32) + CASE(SFIXED64, int64) + CASE(BOOL, bool) + CASE(ENUM, int32) + CASE(STRING, str) + CASE(BYTES, str) #undef CASE - case UPB_TYPE(MESSAGE): - case UPB_TYPE(GROUP): - fe->cb.startsubmsg = - upb_isarray(f) ? upb_msgsink_startsubmsg_r : upb_msgsink_startsubmsg; - break; - } - } + case UPB_TYPE(MESSAGE): + case UPB_TYPE(GROUP): + fh->startsubmsg = + upb_isarray(f) ? upb_msgsink_startsubmsg_r : upb_msgsink_startsubmsg; + break; } } + +upb_mhandlers *upb_msg_reghandlers(upb_handlers *h, upb_msgdef *m) { + return upb_handlers_regmsgdef(h, m, NULL, &upb_msg_onfreg, NULL); +} |