From 4f9aeee6c7414bec2e1d8a9d3508dbd21f4d3394 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 14 Feb 2011 10:24:33 -0800 Subject: More completely fixed the 0-key thing. Unfortunately this degrades hash table lookup performance by about 8%, which affects the streaming benchmark for googlemessage1 by about 5%. We could get this back at the cost of some memory, but it would be nice to avoid that. --- src/upb_def.c | 6 ------ src/upb_table.c | 1 - src/upb_table.h | 3 +-- src/upbc.c | 1 + 4 files changed, 2 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/upb_def.c b/src/upb_def.c index 879f1e8..7e962c8 100644 --- a/src/upb_def.c +++ b/src/upb_def.c @@ -476,12 +476,6 @@ static upb_flow_t upb_enumdef_EnumValueDescriptorProto_value(void *_b, break; case GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_FIELDNUM: b->number = upb_value_getint32(val); - if (b->number == 0) { - upb_seterr(&b->status, UPB_ERROR, - "Enums with a value of 0 are currently broken; see " - "http://code.google.com/p/upb/issues/detail?id=1."); - return UPB_BREAK; - } b->saw_number = true; break; default: diff --git a/src/upb_table.c b/src/upb_table.c index 39b8f20..720cc62 100644 --- a/src/upb_table.c +++ b/src/upb_table.c @@ -129,7 +129,6 @@ static void intinsert(upb_inttable *t, upb_inttable_entry *e) void upb_inttable_insert(upb_inttable *t, upb_inttable_entry *e) { - assert(e->key != 0); if((double)(t->t.count + 1) / upb_inttable_size(t) > MAX_LOAD) { /* Need to resize. New table of double the size, add old elements to it. */ upb_inttable new_table; diff --git a/src/upb_table.h b/src/upb_table.h index 1918e20..e667f0d 100644 --- a/src/upb_table.h +++ b/src/upb_table.h @@ -100,12 +100,11 @@ INLINE uint32_t upb_inttable_bucket(upb_inttable *t, upb_inttable_key_t k) { * ability to optimize. */ INLINE void *upb_inttable_fastlookup(upb_inttable *t, uint32_t key, uint32_t entry_size) { - assert(key != 0); uint32_t bucket = upb_inttable_bucket(t, key); upb_inttable_entry *e; do { e = (upb_inttable_entry*)UPB_INDEX(t->t.entries, bucket-1, entry_size); - if(e->key == key) return e; + if(e->key == key && e->has_entry) return e; } while((bucket = e->next) != UPB_END_OF_CHAIN); return NULL; /* Not found. */ } diff --git a/src/upbc.c b/src/upbc.c index a636301..62f5afd 100644 --- a/src/upbc.c +++ b/src/upbc.c @@ -231,6 +231,7 @@ int main(int argc, char *argv[]) free(defs); upb_string_unref(descriptor); upb_symtab_unref(s); + upb_symtab_unref(s2); fclose(h_const_file); return 0; -- cgit v1.2.3