diff --git a/python/extension_dict.c b/python/extension_dict.c index daf80e4a90..350b5f42cf 100644 --- a/python/extension_dict.c +++ b/python/extension_dict.c @@ -74,7 +74,7 @@ static PyObject* PyUpb_ExtensionDict_FindExtensionByNumber(PyObject* _self, const upb_ExtensionRegistry* reg = upb_DefPool_ExtensionRegistry(symtab); int64_t number = PyLong_AsLong(arg); const upb_MiniTable_Extension* ext = - (upb_MiniTable_Extension*)_upb_extreg_get(reg, l, number); + (upb_MiniTable_Extension*)upb_ExtensionRegistry_Lookup(reg, l, number); if (ext) { const upb_FieldDef* f = upb_DefPool_FindExtensionByMiniTable(symtab, ext); return PyUpb_FieldDescriptor_Get(f); diff --git a/upb/decode.c b/upb/decode.c index d5b9317380..f67579b29e 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -795,11 +795,11 @@ static void upb_Decoder_AddUnknownMessageSetItem(upb_Decoder* d, } static void upb_Decoder_AddMessageSetItem(upb_Decoder* d, upb_Message* msg, - const upb_MiniTable* layout, + const upb_MiniTable* t, uint32_t type_id, const char* data, uint32_t size) { const upb_MiniTable_Extension* item_mt = - _upb_extreg_get(d->extreg, layout, type_id); + upb_ExtensionRegistry_Lookup(d->extreg, t, type_id); if (item_mt) { upb_Decoder_AddKnownMessageSetItem(d, msg, item_mt, data, size); } else { @@ -861,40 +861,40 @@ static const char* upb_Decoder_DecodeMessageSetItem( } static const upb_MiniTable_Field* _upb_Decoder_FindField( - upb_Decoder* d, const upb_MiniTable* l, uint32_t field_number, + upb_Decoder* d, const upb_MiniTable* t, uint32_t field_number, int* last_field_index) { static upb_MiniTable_Field none = { 0, 0, 0, 0, kUpb_FakeFieldType_FieldNotFound, 0}; - if (l == NULL) return &none; + if (t == NULL) return &none; size_t idx = ((size_t)field_number) - 1; // 0 wraps to SIZE_MAX - if (idx < l->dense_below) { + if (idx < t->dense_below) { /* Fastest case: index into dense fields. */ goto found; } - if (l->dense_below < l->field_count) { + if (t->dense_below < t->field_count) { /* Linear search non-dense fields. Resume scanning from last_field_index * since fields are usually in order. */ int last = *last_field_index; - for (idx = last; idx < l->field_count; idx++) { - if (l->fields[idx].number == field_number) { + for (idx = last; idx < t->field_count; idx++) { + if (t->fields[idx].number == field_number) { goto found; } } - for (idx = l->dense_below; idx < last; idx++) { - if (l->fields[idx].number == field_number) { + for (idx = t->dense_below; idx < last; idx++) { + if (t->fields[idx].number == field_number) { goto found; } } } if (d->extreg) { - switch (l->ext) { + switch (t->ext) { case kUpb_ExtMode_Extendable: { const upb_MiniTable_Extension* ext = - _upb_extreg_get(d->extreg, l, field_number); + upb_ExtensionRegistry_Lookup(d->extreg, t, field_number); if (ext) return &ext->field; break; } @@ -911,9 +911,9 @@ static const upb_MiniTable_Field* _upb_Decoder_FindField( return &none; /* Unknown field. */ found: - UPB_ASSERT(l->fields[idx].number == field_number); + UPB_ASSERT(t->fields[idx].number == field_number); *last_field_index = idx; - return &l->fields[idx]; + return &t->fields[idx]; } int _upb_Decoder_GetVarintOp(const upb_MiniTable_Field* field) { diff --git a/upb/extension_registry.c b/upb/extension_registry.c index f811eddf8c..211652a678 100644 --- a/upb/extension_registry.c +++ b/upb/extension_registry.c @@ -54,8 +54,9 @@ upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena) { return r; } -bool _upb_extreg_add(upb_ExtensionRegistry* r, - const upb_MiniTable_Extension** e, size_t count) { +bool upb_ExtensionRegistry_AddArray(upb_ExtensionRegistry* r, + const upb_MiniTable_Extension** e, + size_t count) { char buf[EXTREG_KEY_SIZE]; const upb_MiniTable_Extension** start = e; const upb_MiniTable_Extension** end = UPB_PTRADD(e, count); @@ -81,12 +82,11 @@ failure: return false; } -const upb_MiniTable_Extension* _upb_extreg_get(const upb_ExtensionRegistry* r, - const upb_MiniTable* l, - uint32_t num) { +const upb_MiniTable_Extension* upb_ExtensionRegistry_Lookup( + const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num) { char buf[EXTREG_KEY_SIZE]; upb_value v; - extreg_key(buf, l, num); + extreg_key(buf, t, num); if (upb_strtable_lookup2(&r->exts, buf, EXTREG_KEY_SIZE, &v)) { return upb_value_getconstptr(v); } else { diff --git a/upb/extension_registry.h b/upb/extension_registry.h index 10d6ad52cb..84eabca358 100644 --- a/upb/extension_registry.h +++ b/upb/extension_registry.h @@ -73,27 +73,23 @@ extern "C" { */ typedef struct upb_ExtensionRegistry upb_ExtensionRegistry; +typedef struct upb_MiniTable_Extension upb_MiniTable_Extension; // Creates a upb_ExtensionRegistry in the given arena. // The arena must outlive any use of the extreg. upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena); -// EVERYTHING BELOW THIS LINE IS INTERNAL - DO NOT USE ///////////////////////// - -typedef struct upb_MiniTable_Extension upb_MiniTable_Extension; - -// Adds the given extension info for message type |l| and field number |num| -// into the registry. Returns false if this message type and field number were -// already in the map, or if memory allocation fails. -bool _upb_extreg_add(upb_ExtensionRegistry* r, - const upb_MiniTable_Extension** e, size_t count); +// Adds the given extension info for the array |e| of size |count| into the +// registry. If there are any errors, the entire array is backed out. +// The extensions must outlive the registry. +bool upb_ExtensionRegistry_AddArray(upb_ExtensionRegistry* r, + const upb_MiniTable_Extension** e, + size_t count); -// Looks up the extension (if any) defined for message type |l| and field -// number |num|. If an extension was found, copies the field info into |*ext| -// and returns true. Otherwise returns false. -const upb_MiniTable_Extension* _upb_extreg_get(const upb_ExtensionRegistry* r, - const upb_MiniTable* l, - uint32_t num); +// Looks up the extension (if any) defined for message type |t| and field +// number |num|. Returns the extension if found, otherwise NULL. +const upb_MiniTable_Extension* upb_ExtensionRegistry_Lookup( + const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num); #ifdef __cplusplus } /* extern "C" */ diff --git a/upb/fuzz_test_util.cc b/upb/fuzz_test_util.cc index 219e4a3294..3ca4e89f31 100644 --- a/upb/fuzz_test_util.cc +++ b/upb/fuzz_test_util.cc @@ -144,9 +144,10 @@ void Builder::BuildExtensions(upb_ExtensionRegistry** exts) { status.ptr()); if (!ptr) break; if (!LinkExtension(ext)) continue; - if (_upb_extreg_get(*exts, ext->extendee, ext->field.number)) continue; - _upb_extreg_add(*exts, const_cast(&ext), - 1); + if (upb_ExtensionRegistry_Lookup(*exts, ext->extendee, ext->field.number)) + continue; + upb_ExtensionRegistry_AddArray( + *exts, const_cast(&ext), 1); } } } diff --git a/upb/reflection/def_pool.c b/upb/reflection/def_pool.c index 44679f3f8d..025cde8a80 100644 --- a/upb/reflection/def_pool.c +++ b/upb/reflection/def_pool.c @@ -411,8 +411,9 @@ const upb_FieldDef* upb_DefPool_FindExtensionByMiniTable( const upb_FieldDef* upb_DefPool_FindExtensionByNumber(const upb_DefPool* s, const upb_MessageDef* m, int32_t fieldnum) { - const upb_MiniTable* l = upb_MessageDef_MiniTable(m); - const upb_MiniTable_Extension* ext = _upb_extreg_get(s->extreg, l, fieldnum); + const upb_MiniTable* t = upb_MessageDef_MiniTable(m); + const upb_MiniTable_Extension* ext = + upb_ExtensionRegistry_Lookup(s->extreg, t, fieldnum); return ext ? upb_DefPool_FindExtensionByMiniTable(s, ext) : NULL; } diff --git a/upb/reflection/file_def.c b/upb/reflection/file_def.c index 0e6a8c1ab4..b0a8f63b33 100644 --- a/upb/reflection/file_def.c +++ b/upb/reflection/file_def.c @@ -338,8 +338,8 @@ void _upb_FileDef_Create(upb_DefBuilder* ctx, } if (file->ext_count) { - bool ok = _upb_extreg_add(_upb_DefPool_ExtReg(ctx->symtab), - file->ext_layouts, file->ext_count); + bool ok = upb_ExtensionRegistry_AddArray( + _upb_DefPool_ExtReg(ctx->symtab), file->ext_layouts, file->ext_count); if (!ok) _upb_DefBuilder_OomErr(ctx); } }