upb: lock down upbMiniTable_File

PiperOrigin-RevId: 586003350
pull/14831/head
Eric Salo 1 year ago committed by Copybara-Service
parent 150b724d76
commit 8dfd82096b
  1. 41
      upb/mini_table/file.h
  2. 53
      upb/mini_table/internal/file.h
  3. 1
      upb/reflection/BUILD
  4. 16
      upb/reflection/enum_def.c
  5. 18
      upb/reflection/file_def.c
  6. 14
      upb/reflection/message_def.c

@ -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_ */

@ -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_ */

@ -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",
],

@ -7,16 +7,27 @@
#include "upb/reflection/internal/enum_def.h"
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#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);
}

@ -8,9 +8,16 @@
#include "upb/reflection/internal/file_def.h"
#include <stddef.h>
#include "upb/reflection/def_pool.h"
#include <stdint.h>
#include <string.h>
#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.

@ -7,13 +7,22 @@
#include "upb/reflection/internal/message_def.h"
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#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

Loading…
Cancel
Save