From 2ccebb74c309c7ea4c4589b35893cdd6c996ac4b Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 21 May 2011 15:50:08 -0700 Subject: Add proof-of-concept C++ wrapper header. --- src/upb_handlers.c | 89 +++++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 44 deletions(-) (limited to 'src/upb_handlers.c') diff --git a/src/upb_handlers.c b/src/upb_handlers.c index 7be43ce..f4664a0 100644 --- a/src/upb_handlers.c +++ b/src/upb_handlers.c @@ -50,9 +50,9 @@ static upb_mhandlers *upb_mhandlers_new() { return m; } -static upb_fhandlers *_upb_mhandlers_newfield(upb_mhandlers *m, uint32_t n, - upb_fieldtype_t type, - bool repeated) { +static upb_fhandlers *_upb_mhandlers_newfhandlers(upb_mhandlers *m, uint32_t n, + upb_fieldtype_t type, + bool repeated) { uint32_t tag = n << 3 | upb_types[type].native_wire_type; upb_fhandlers *f = upb_inttable_lookup(&m->fieldtab, tag); if (f) abort(); @@ -69,25 +69,56 @@ static upb_fhandlers *_upb_mhandlers_newfield(upb_mhandlers *m, uint32_t n, return f; } -upb_fhandlers *upb_mhandlers_newfield(upb_mhandlers *m, uint32_t n, - upb_fieldtype_t type, bool repeated) { +upb_fhandlers *upb_mhandlers_newfhandlers(upb_mhandlers *m, uint32_t n, + upb_fieldtype_t type, bool repeated) { assert(type != UPB_TYPE(MESSAGE)); assert(type != UPB_TYPE(GROUP)); - return _upb_mhandlers_newfield(m, n, type, repeated); + return _upb_mhandlers_newfhandlers(m, n, type, repeated); } -upb_fhandlers *upb_mhandlers_newsubmsgfield(upb_mhandlers *m, uint32_t n, - upb_fieldtype_t type, bool repeated, - upb_mhandlers *subm) { +upb_fhandlers *upb_mhandlers_newfhandlers_subm(upb_mhandlers *m, uint32_t n, + upb_fieldtype_t type, + bool repeated, + upb_mhandlers *subm) { assert(type == UPB_TYPE(MESSAGE) || type == UPB_TYPE(GROUP)); assert(subm); - upb_fhandlers *f = _upb_mhandlers_newfield(m, n, type, repeated); + upb_fhandlers *f = _upb_mhandlers_newfhandlers(m, n, type, repeated); f->submsg = subm; if (type == UPB_TYPE(GROUP)) - _upb_mhandlers_newfield(subm, n, UPB_TYPE_ENDGROUP, false); + _upb_mhandlers_newfhandlers(subm, n, UPB_TYPE_ENDGROUP, false); return f; } + +/* upb_handlers ***************************************************************/ + +void upb_handlers_init(upb_handlers *h) { + h->msgs_len = 0; + h->msgs_size = 4; + h->msgs = malloc(h->msgs_size * sizeof(*h->msgs)); + h->should_jit = true; +} + +void upb_handlers_uninit(upb_handlers *h) { + for (int i = 0; i < h->msgs_len; i++) { + upb_mhandlers *mh = h->msgs[i]; + upb_inttable_free(&mh->fieldtab); + free(mh->tablearray); + free(mh); + } + free(h->msgs); +} + +upb_mhandlers *upb_handlers_newmhandlers(upb_handlers *h) { + if (h->msgs_len == h->msgs_size) { + h->msgs_size *= 2; + h->msgs = realloc(h->msgs, h->msgs_size * sizeof(*h->msgs)); + } + upb_mhandlers *mh = upb_mhandlers_new(); + h->msgs[h->msgs_len++] = mh; + return mh; +} + typedef struct { upb_strtable_entry e; upb_mhandlers *mh; @@ -97,7 +128,7 @@ static upb_mhandlers *upb_regmsg_dfs(upb_handlers *h, upb_msgdef *m, upb_onmsgreg *msgreg_cb, upb_onfieldreg *fieldreg_cb, void *closure, upb_strtable *mtab) { - upb_mhandlers *mh = upb_handlers_newmsg(h); + upb_mhandlers *mh = upb_handlers_newmhandlers(h); upb_mtab_ent e = {{m->base.fqname, 0}, mh}; upb_strtable_insert(mtab, &e.e); if (msgreg_cb) msgreg_cb(closure, mh, m); @@ -115,10 +146,10 @@ static upb_mhandlers *upb_regmsg_dfs(upb_handlers *h, upb_msgdef *m, sub_mh = upb_regmsg_dfs(h, upb_downcast_msgdef(f->def), msgreg_cb, fieldreg_cb, closure, mtab); } - fh = upb_mhandlers_newsubmsgfield( + fh = upb_mhandlers_newfhandlers_subm( mh, f->number, f->type, upb_isarray(f), sub_mh); } else { - fh = upb_mhandlers_newfield(mh, f->number, f->type, upb_isarray(f)); + fh = upb_mhandlers_newfhandlers(mh, f->number, f->type, upb_isarray(f)); } if (fieldreg_cb) fieldreg_cb(closure, fh, f); } @@ -138,36 +169,6 @@ upb_mhandlers *upb_handlers_regmsgdef(upb_handlers *h, upb_msgdef *m, } -/* upb_handlers ***************************************************************/ - -void upb_handlers_init(upb_handlers *h) { - h->msgs_len = 0; - h->msgs_size = 4; - h->msgs = malloc(h->msgs_size * sizeof(*h->msgs)); - h->should_jit = true; -} - -void upb_handlers_uninit(upb_handlers *h) { - for (int i = 0; i < h->msgs_len; i++) { - upb_mhandlers *mh = h->msgs[i]; - upb_inttable_free(&mh->fieldtab); - free(mh->tablearray); - free(mh); - } - free(h->msgs); -} - -upb_mhandlers *upb_handlers_newmsg(upb_handlers *h) { - if (h->msgs_len == h->msgs_size) { - h->msgs_size *= 2; - h->msgs = realloc(h->msgs, h->msgs_size * sizeof(*h->msgs)); - } - upb_mhandlers *mh = upb_mhandlers_new(); - h->msgs[h->msgs_len++] = mh; - return mh; -} - - /* upb_dispatcher *************************************************************/ static upb_fhandlers toplevel_f = { -- cgit v1.2.3