|
|
|
@ -822,12 +822,10 @@ static void set_bytecode_handlers(mgroup *g) { |
|
|
|
|
|
|
|
|
|
/* TODO(haberman): allow this to be constructed for an arbitrary set of dest
|
|
|
|
|
* handlers and other mgroups (but verify we have a transitive closure). */ |
|
|
|
|
const mgroup *mgroup_new(const upb_handlers *dest, bool allowjit, bool lazy) { |
|
|
|
|
const mgroup *mgroup_new(const upb_handlers *dest, bool lazy) { |
|
|
|
|
mgroup *g; |
|
|
|
|
compiler *c; |
|
|
|
|
|
|
|
|
|
UPB_UNUSED(allowjit); |
|
|
|
|
|
|
|
|
|
g = newgroup(); |
|
|
|
|
c = newcompiler(g, lazy); |
|
|
|
|
find_methods(c, dest); |
|
|
|
@ -872,7 +870,6 @@ upb_pbcodecache *upb_pbcodecache_new(upb_handlercache *dest) { |
|
|
|
|
if (!c) return NULL; |
|
|
|
|
|
|
|
|
|
c->dest = dest; |
|
|
|
|
c->allow_jit = true; |
|
|
|
|
c->lazy = false; |
|
|
|
|
|
|
|
|
|
c->arena = upb_arena_new(); |
|
|
|
@ -882,13 +879,12 @@ upb_pbcodecache *upb_pbcodecache_new(upb_handlercache *dest) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void upb_pbcodecache_free(upb_pbcodecache *c) { |
|
|
|
|
size_t i; |
|
|
|
|
upb_inttable_iter i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < upb_inttable_count(&c->groups); i++) { |
|
|
|
|
upb_value v; |
|
|
|
|
bool ok = upb_inttable_lookup(&c->groups, i, &v); |
|
|
|
|
UPB_ASSERT(ok); |
|
|
|
|
freegroup((void*)upb_value_getconstptr(v)); |
|
|
|
|
upb_inttable_begin(&i, &c->groups); |
|
|
|
|
for(; !upb_inttable_done(&i); upb_inttable_next(&i)) { |
|
|
|
|
upb_value val = upb_inttable_iter_value(&i); |
|
|
|
|
freegroup((void*)upb_value_getconstptr(val)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
upb_inttable_uninit(&c->groups); |
|
|
|
@ -896,15 +892,6 @@ void upb_pbcodecache_free(upb_pbcodecache *c) { |
|
|
|
|
upb_gfree(c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool upb_pbcodecache_allowjit(const upb_pbcodecache *c) { |
|
|
|
|
return c->allow_jit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void upb_pbcodecache_setallowjit(upb_pbcodecache *c, bool allow) { |
|
|
|
|
UPB_ASSERT(upb_inttable_count(&c->groups) == 0); |
|
|
|
|
c->allow_jit = allow; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void upb_pbdecodermethodopts_setlazy(upb_pbcodecache *c, bool lazy) { |
|
|
|
|
UPB_ASSERT(upb_inttable_count(&c->groups) == 0); |
|
|
|
|
c->lazy = lazy; |
|
|
|
@ -917,11 +904,14 @@ const upb_pbdecodermethod *upb_pbcodecache_get(upb_pbcodecache *c, |
|
|
|
|
const upb_handlers *h; |
|
|
|
|
const mgroup *g; |
|
|
|
|
|
|
|
|
|
/* Right now we build a new DecoderMethod every time.
|
|
|
|
|
* TODO(haberman): properly cache methods by their true key. */ |
|
|
|
|
h = upb_handlercache_get(c->dest, md); |
|
|
|
|
g = mgroup_new(h, c->allow_jit, c->lazy); |
|
|
|
|
upb_inttable_push(&c->groups, upb_value_constptr(g)); |
|
|
|
|
if (upb_inttable_lookupptr(&c->groups, md, &v)) { |
|
|
|
|
g = upb_value_getconstptr(v); |
|
|
|
|
} else { |
|
|
|
|
g = mgroup_new(h, c->lazy); |
|
|
|
|
ok = upb_inttable_insertptr(&c->groups, md, upb_value_constptr(g)); |
|
|
|
|
UPB_ASSERT(ok); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ok = upb_inttable_lookupptr(&g->methods, h, &v); |
|
|
|
|
UPB_ASSERT(ok); |
|
|
|
|