diff --git a/upb/mini_table/file.h b/upb/mini_table/file.h index 590164f72f..db8d22cf76 100644 --- a/upb/mini_table/file.h +++ b/upb/mini_table/file.h @@ -12,4 +12,45 @@ typedef struct upb_MiniTableFile upb_MiniTableFile; +// Must be last. +#include "upb/port/def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +UPB_API_INLINE const struct upb_MiniTableEnum* upb_MiniTableFile_Enum( + const upb_MiniTableFile* f, int i) { + return UPB_PRIVATE(_upb_MiniTableFile_Enum)(f, i); +} + +UPB_API_INLINE int upb_MiniTableFile_EnumCount(const upb_MiniTableFile* f) { + return UPB_PRIVATE(_upb_MiniTableFile_EnumCount)(f); +} + +UPB_API_INLINE const struct upb_MiniTableExtension* upb_MiniTableFile_Extension( + const upb_MiniTableFile* f, int i) { + return UPB_PRIVATE(_upb_MiniTableFile_Extension)(f, i); +} + +UPB_API_INLINE int upb_MiniTableFile_ExtensionCount( + const upb_MiniTableFile* f) { + return UPB_PRIVATE(_upb_MiniTableFile_ExtensionCount)(f); +} + +UPB_API_INLINE const struct upb_MiniTable* upb_MiniTableFile_Message( + const upb_MiniTableFile* f, int i) { + return UPB_PRIVATE(_upb_MiniTableFile_Message)(f, i); +} + +UPB_API_INLINE int upb_MiniTableFile_MessageCount(const upb_MiniTableFile* f) { + return UPB_PRIVATE(_upb_MiniTableFile_MessageCount)(f); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port/undef.inc" + #endif /* UPB_MINI_TABLE_FILE_H_ */ diff --git a/upb/mini_table/internal/file.h b/upb/mini_table/internal/file.h index a8a3343197..0afabcf1b3 100644 --- a/upb/mini_table/internal/file.h +++ b/upb/mini_table/internal/file.h @@ -12,14 +12,55 @@ #include "upb/port/def.inc" struct upb_MiniTableFile { - const struct upb_MiniTable** msgs; - const struct upb_MiniTableEnum** enums; - const struct upb_MiniTableExtension** exts; - int msg_count; - int enum_count; - int ext_count; + const struct upb_MiniTable** UPB_PRIVATE(msgs); + const struct upb_MiniTableEnum** UPB_PRIVATE(enums); + const struct upb_MiniTableExtension** UPB_PRIVATE(exts); + int UPB_PRIVATE(msg_count); + int UPB_PRIVATE(enum_count); + int UPB_PRIVATE(ext_count); }; +#ifdef __cplusplus +extern "C" { +#endif + +UPB_INLINE int UPB_PRIVATE(_upb_MiniTableFile_EnumCount)( + const struct upb_MiniTableFile* f) { + return f->UPB_PRIVATE(enum_count); +} + +UPB_INLINE int UPB_PRIVATE(_upb_MiniTableFile_ExtensionCount)( + const struct upb_MiniTableFile* f) { + return f->UPB_PRIVATE(ext_count); +} + +UPB_INLINE int UPB_PRIVATE(_upb_MiniTableFile_MessageCount)( + const struct upb_MiniTableFile* f) { + return f->UPB_PRIVATE(msg_count); +} + +UPB_INLINE const struct upb_MiniTableEnum* UPB_PRIVATE(_upb_MiniTableFile_Enum)( + const struct upb_MiniTableFile* f, int i) { + UPB_ASSERT(i < f->UPB_PRIVATE(enum_count)); + return f->UPB_PRIVATE(enums)[i]; +} + +UPB_INLINE const struct upb_MiniTableExtension* UPB_PRIVATE( + _upb_MiniTableFile_Extension)(const struct upb_MiniTableFile* f, int i) { + UPB_ASSERT(i < f->UPB_PRIVATE(ext_count)); + return f->UPB_PRIVATE(exts)[i]; +} + +UPB_INLINE const struct upb_MiniTable* UPB_PRIVATE(_upb_MiniTableFile_Message)( + const struct upb_MiniTableFile* f, int i) { + UPB_ASSERT(i < f->UPB_PRIVATE(msg_count)); + return f->UPB_PRIVATE(msgs)[i]; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + #include "upb/port/undef.inc" #endif /* UPB_MINI_TABLE_INTERNAL_FILE_H_ */ diff --git a/upb/reflection/BUILD b/upb/reflection/BUILD index f6ea369d06..4880c23727 100644 --- a/upb/reflection/BUILD +++ b/upb/reflection/BUILD @@ -140,6 +140,7 @@ bootstrap_cc_library( "//upb:mini_descriptor", "//upb:mini_descriptor_internal", "//upb:mini_table", + "//upb:mini_table_internal", "//upb:port", "//upb/base:internal", ], diff --git a/upb/reflection/enum_def.c b/upb/reflection/enum_def.c index 2b44fd05fc..de85cbd9b1 100644 --- a/upb/reflection/enum_def.c +++ b/upb/reflection/enum_def.c @@ -7,16 +7,27 @@ #include "upb/reflection/internal/enum_def.h" +#include +#include +#include + +#include "upb/base/status.h" +#include "upb/base/string_view.h" +#include "upb/hash/common.h" #include "upb/hash/int_table.h" #include "upb/hash/str_table.h" +#include "upb/mem/arena.h" #include "upb/mini_descriptor/decode.h" +#include "upb/mini_descriptor/internal/encode.h" +#include "upb/mini_table/enum.h" +#include "upb/mini_table/file.h" +#include "upb/reflection/def.h" #include "upb/reflection/def_type.h" #include "upb/reflection/internal/def_builder.h" #include "upb/reflection/internal/desc_state.h" #include "upb/reflection/internal/enum_reserved_range.h" #include "upb/reflection/internal/enum_value_def.h" #include "upb/reflection/internal/file_def.h" -#include "upb/reflection/internal/message_def.h" #include "upb/reflection/internal/strdup2.h" // Must be last. @@ -274,8 +285,7 @@ static void create_enumdef(upb_DefBuilder* ctx, const char* prefix, if (upb_EnumDef_IsClosed(e)) { if (ctx->layout) { - UPB_ASSERT(ctx->enum_count < ctx->layout->enum_count); - e->layout = ctx->layout->enums[ctx->enum_count++]; + e->layout = upb_MiniTableFile_Enum(ctx->layout, ctx->enum_count++); } else { e->layout = create_enumlayout(ctx, e); } diff --git a/upb/reflection/file_def.c b/upb/reflection/file_def.c index 6b836f83a6..e287d7efa3 100644 --- a/upb/reflection/file_def.c +++ b/upb/reflection/file_def.c @@ -8,9 +8,16 @@ #include "upb/reflection/internal/file_def.h" #include - -#include "upb/reflection/def_pool.h" +#include +#include + +#include "upb/base/string_view.h" +#include "upb/mini_table/extension.h" +#include "upb/mini_table/extension_registry.h" +#include "upb/mini_table/file.h" +#include "upb/reflection/def.h" #include "upb/reflection/internal/def_builder.h" +#include "upb/reflection/internal/def_pool.h" #include "upb/reflection/internal/enum_def.h" #include "upb/reflection/internal/field_def.h" #include "upb/reflection/internal/message_def.h" @@ -258,11 +265,12 @@ void _upb_FileDef_Create(upb_DefBuilder* ctx, if (ctx->layout) { // We are using the ext layouts that were passed in. - file->ext_layouts = ctx->layout->exts; - if (ctx->layout->ext_count != file->ext_count) { + file->ext_layouts = ctx->layout->UPB_PRIVATE(exts); + const int mt_ext_count = upb_MiniTableFile_ExtensionCount(ctx->layout); + if (mt_ext_count != file->ext_count) { _upb_DefBuilder_Errf(ctx, "Extension count did not match layout (%d vs %d)", - ctx->layout->ext_count, file->ext_count); + mt_ext_count, file->ext_count); } } else { // We are building ext layouts from scratch. diff --git a/upb/reflection/message_def.c b/upb/reflection/message_def.c index a51481a76b..2d5497acab 100644 --- a/upb/reflection/message_def.c +++ b/upb/reflection/message_def.c @@ -7,13 +7,22 @@ #include "upb/reflection/internal/message_def.h" +#include +#include +#include + #include "upb/base/descriptor_constants.h" +#include "upb/base/string_view.h" +#include "upb/hash/common.h" #include "upb/hash/int_table.h" #include "upb/hash/str_table.h" +#include "upb/mem/arena.h" #include "upb/mini_descriptor/decode.h" +#include "upb/mini_descriptor/internal/encode.h" #include "upb/mini_descriptor/internal/modifiers.h" +#include "upb/mini_table/file.h" +#include "upb/mini_table/message.h" #include "upb/reflection/def.h" -#include "upb/reflection/def_type.h" #include "upb/reflection/internal/def_builder.h" #include "upb/reflection/internal/desc_state.h" #include "upb/reflection/internal/enum_def.h" @@ -436,8 +445,7 @@ void _upb_MessageDef_CreateMiniTable(upb_DefBuilder* ctx, upb_MessageDef* m) { if (ctx->layout == NULL) { m->layout = _upb_MessageDef_MakeMiniTable(ctx, m); } else { - UPB_ASSERT(ctx->msg_count < ctx->layout->msg_count); - m->layout = ctx->layout->msgs[ctx->msg_count++]; + m->layout = upb_MiniTableFile_Message(ctx->layout, ctx->msg_count++); UPB_ASSERT(m->field_count == m->layout->field_count); // We don't need the result of this call, but it will assign layout_index