diff --git a/upb/mini_table/decode.c b/upb/mini_table/decode.c index b8adaf60c1..baaf1fcccb 100644 --- a/upb/mini_table/decode.c +++ b/upb/mini_table/decode.c @@ -992,6 +992,21 @@ const char* _upb_MiniTableExtension_Init(const char* data, size_t len, extendee, sub); } +upb_MiniTableExtension* _upb_MiniTableExtension_Build( + const char* data, size_t len, const upb_MiniTable* extendee, + upb_MiniTableSub sub, upb_MiniTablePlatform platform, upb_Arena* arena, + upb_Status* status) { + upb_MiniTableExtension* ext = + upb_Arena_Malloc(arena, sizeof(upb_MiniTableExtension)); + if (UPB_UNLIKELY(!ext)) return NULL; + + const char* ptr = _upb_MiniTableExtension_Init(data, len, ext, extendee, sub, + platform, status); + if (UPB_UNLIKELY(!ptr)) return NULL; + + return ext; +} + upb_MiniTable* _upb_MiniTable_Build(const char* data, size_t len, upb_MiniTablePlatform platform, upb_Arena* arena, upb_Status* status) { diff --git a/upb/mini_table/decode.h b/upb/mini_table/decode.h index efcbe20414..385bda4661 100644 --- a/upb/mini_table/decode.h +++ b/upb/mini_table/decode.h @@ -80,7 +80,7 @@ UPB_API bool upb_MiniTable_SetSubEnum(upb_MiniTable* table, const upb_MiniTableEnum* sub); // Initializes a MiniTableExtension buffer that has already been allocated. -// This is needed (for example) by upb_FileDef, which allocates all of the +// This is needed by upb_FileDef and upb_MessageDef, which allocate all of the // extensions together in a single contiguous array. const char* _upb_MiniTableExtension_Init(const char* data, size_t len, upb_MiniTableExtension* ext, @@ -96,6 +96,35 @@ UPB_API_INLINE const char* upb_MiniTableExtension_Init( kUpb_MiniTablePlatform_Native, status); } +UPB_API upb_MiniTableExtension* _upb_MiniTableExtension_Build( + const char* data, size_t len, const upb_MiniTable* extendee, + upb_MiniTableSub sub, upb_MiniTablePlatform platform, upb_Arena* arena, + upb_Status* status); + +UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_Build( + const char* data, size_t len, const upb_MiniTable* extendee, + upb_Arena* arena, upb_Status* status) { + upb_MiniTableSub sub = {.submsg = NULL}; + return _upb_MiniTableExtension_Build( + data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status); +} + +UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_BuildMessage( + const char* data, size_t len, const upb_MiniTable* extendee, + upb_MiniTable* submsg, upb_Arena* arena, upb_Status* status) { + upb_MiniTableSub sub = {.submsg = submsg}; + return _upb_MiniTableExtension_Build( + data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status); +} + +UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_BuildEnum( + const char* data, size_t len, const upb_MiniTable* extendee, + upb_MiniTableEnum* subenum, upb_Arena* arena, upb_Status* status) { + upb_MiniTableSub sub = {.subenum = subenum}; + return _upb_MiniTableExtension_Build( + data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status); +} + UPB_API upb_MiniTableEnum* upb_MiniTableEnum_Build(const char* data, size_t len, upb_Arena* arena, upb_Status* status);