upb: upb_MiniTable_GetOrPromoteExtension() no longer returns a (upb_Extension*)

PiperOrigin-RevId: 600662130
pull/15523/head
Eric Salo 1 year ago committed by Copybara-Service
parent 9ffbe84cba
commit f9af78e7ee
  1. 18
      protos/protos.cc
  2. 14
      protos/protos.h
  3. 14
      upb/message/promote.c
  4. 7
      upb/message/promote.h
  5. 74
      upb/message/promote_test.cc

@ -20,6 +20,7 @@
#include "upb/message/internal/extension.h" #include "upb/message/internal/extension.h"
#include "upb/message/message.h" #include "upb/message/message.h"
#include "upb/message/promote.h" #include "upb/message/promote.h"
#include "upb/message/value.h"
#include "upb/mini_table/extension.h" #include "upb/mini_table/extension.h"
#include "upb/mini_table/extension_registry.h" #include "upb/mini_table/extension_registry.h"
#include "upb/mini_table/message.h" #include "upb/mini_table/message.h"
@ -122,19 +123,12 @@ bool HasExtensionOrUnknown(const upb_Message* msg,
.status == kUpb_FindUnknown_Ok; .status == kUpb_FindUnknown_Ok;
} }
const upb_Extension* GetOrPromoteExtension(upb_Message* msg, bool GetOrPromoteExtension(upb_Message* msg, const upb_MiniTableExtension* eid,
const upb_MiniTableExtension* eid, upb_Arena* arena, upb_MessageValue* value) {
upb_Arena* arena) {
MessageLock msg_lock(msg); MessageLock msg_lock(msg);
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getext)(msg, eid); upb_GetExtension_Status ext_status = upb_Message_GetOrPromoteExtension(
if (ext == nullptr) { (upb_Message*)msg, eid, 0, arena, value);
upb_GetExtension_Status ext_status = upb_MiniTable_GetOrPromoteExtension( return ext_status == kUpb_GetExtension_Ok;
(upb_Message*)msg, eid, 0, arena, &ext);
if (ext_status != kUpb_GetExtension_Ok) {
ext = nullptr;
}
}
return ext;
} }
absl::StatusOr<absl::string_view> Serialize(const upb_Message* message, absl::StatusOr<absl::string_view> Serialize(const upb_Message* message,

@ -223,9 +223,8 @@ absl::StatusOr<absl::string_view> Serialize(const upb_Message* message,
bool HasExtensionOrUnknown(const upb_Message* msg, bool HasExtensionOrUnknown(const upb_Message* msg,
const upb_MiniTableExtension* eid); const upb_MiniTableExtension* eid);
const upb_Extension* GetOrPromoteExtension(upb_Message* msg, bool GetOrPromoteExtension(upb_Message* msg, const upb_MiniTableExtension* eid,
const upb_MiniTableExtension* eid, upb_Arena* arena, upb_MessageValue* value);
upb_Arena* arena);
void DeepCopy(upb_Message* target, const upb_Message* source, void DeepCopy(upb_Message* target, const upb_Message* source,
const upb_MiniTable* mini_table, upb_Arena* arena); const upb_MiniTable* mini_table, upb_Arena* arena);
@ -410,15 +409,16 @@ absl::StatusOr<Ptr<const Extension>> GetExtension(
Ptr<T> message, Ptr<T> message,
const ::protos::internal::ExtensionIdentifier<Extendee, Extension>& id) { const ::protos::internal::ExtensionIdentifier<Extendee, Extension>& id) {
// TODO: Fix const correctness issues. // TODO: Fix const correctness issues.
const upb_Extension* ext = ::protos::internal::GetOrPromoteExtension( upb_MessageValue value;
const bool ok = ::protos::internal::GetOrPromoteExtension(
const_cast<upb_Message*>(internal::GetInternalMsg(message)), const_cast<upb_Message*>(internal::GetInternalMsg(message)),
id.mini_table_ext(), ::protos::internal::GetArena(message)); id.mini_table_ext(), ::protos::internal::GetArena(message), &value);
if (!ext) { if (!ok) {
return ExtensionNotFoundError( return ExtensionNotFoundError(
upb_MiniTableExtension_Number(id.mini_table_ext())); upb_MiniTableExtension_Number(id.mini_table_ext()));
} }
return Ptr<const Extension>(::protos::internal::CreateMessage<Extension>( return Ptr<const Extension>(::protos::internal::CreateMessage<Extension>(
(upb_Message*)ext->data.ptr, ::protos::internal::GetArena(message))); (upb_Message*)value.msg_val, ::protos::internal::GetArena(message)));
} }
template <typename T, typename Extendee, typename Extension, template <typename T, typename Extendee, typename Extension,

@ -64,12 +64,14 @@ static upb_UnknownToMessageRet upb_MiniTable_ParseUnknownMessage(
return ret; return ret;
} }
upb_GetExtension_Status upb_MiniTable_GetOrPromoteExtension( upb_GetExtension_Status upb_Message_GetOrPromoteExtension(
upb_Message* msg, const upb_MiniTableExtension* ext_table, upb_Message* msg, const upb_MiniTableExtension* ext_table,
int decode_options, upb_Arena* arena, const upb_Extension** extension) { int decode_options, upb_Arena* arena, upb_MessageValue* value) {
UPB_ASSERT(upb_MiniTableExtension_CType(ext_table) == kUpb_CType_Message); UPB_ASSERT(upb_MiniTableExtension_CType(ext_table) == kUpb_CType_Message);
*extension = UPB_PRIVATE(_upb_Message_Getext)(msg, ext_table); const upb_Extension* extension =
if (*extension) { UPB_PRIVATE(_upb_Message_Getext)(msg, ext_table);
if (extension) {
memcpy(value, &extension->data, sizeof(upb_MessageValue));
return kUpb_GetExtension_Ok; return kUpb_GetExtension_Ok;
} }
@ -104,8 +106,8 @@ upb_GetExtension_Status upb_MiniTable_GetOrPromoteExtension(
if (!ext) { if (!ext) {
return kUpb_GetExtension_OutOfMemory; return kUpb_GetExtension_OutOfMemory;
} }
memcpy(&ext->data, &extension_msg, sizeof(extension_msg)); ext->data.ptr = extension_msg;
*extension = ext; value->msg_val = extension_msg;
const char* delete_ptr = upb_Message_GetUnknown(msg, &len) + ofs; const char* delete_ptr = upb_Message_GetUnknown(msg, &len) + ofs;
upb_Message_DeleteUnknown(msg, delete_ptr, result.len); upb_Message_DeleteUnknown(msg, delete_ptr, result.len);
return kUpb_GetExtension_Ok; return kUpb_GetExtension_Ok;

@ -33,14 +33,13 @@ typedef enum {
kUpb_GetExtensionAsBytes_EncodeError, kUpb_GetExtensionAsBytes_EncodeError,
} upb_GetExtensionAsBytes_Status; } upb_GetExtensionAsBytes_Status;
// Returns a message extension or promotes an unknown field to // Returns a message value or promotes an unknown field to an extension.
// an extension.
// //
// TODO: Only supports extension fields that are messages, // TODO: Only supports extension fields that are messages,
// expand support to include non-message types. // expand support to include non-message types.
upb_GetExtension_Status upb_MiniTable_GetOrPromoteExtension( upb_GetExtension_Status upb_Message_GetOrPromoteExtension(
upb_Message* msg, const upb_MiniTableExtension* ext_table, upb_Message* msg, const upb_MiniTableExtension* ext_table,
int decode_options, upb_Arena* arena, const upb_Extension** extension); int decode_options, upb_Arena* arena, upb_MessageValue* value);
typedef enum { typedef enum {
kUpb_FindUnknown_Ok, kUpb_FindUnknown_Ok,

@ -123,57 +123,57 @@ TEST(GeneratedCode, Extensions) {
char* serialized = char* serialized =
upb_test_ModelWithExtensions_serialize(msg, arena, &serialized_size); upb_test_ModelWithExtensions_serialize(msg, arena, &serialized_size);
const upb_Extension* upb_ext2;
upb_test_ModelExtension1* ext1; upb_test_ModelExtension1* ext1;
upb_test_ModelExtension2* ext2; upb_test_ModelExtension2* ext2;
upb_GetExtension_Status promote_status; upb_GetExtension_Status promote_status;
upb_MessageValue value;
// Test known GetExtension 1 // Test known GetExtension 1
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension1_model_ext_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension1_model_ext_ext, 0, arena,
&upb_ext2); &value);
ext1 = (upb_test_ModelExtension1*)upb_ext2->data.ptr; ext1 = (upb_test_ModelExtension1*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_TRUE(upb_StringView_IsEqual(upb_StringView_FromString("World"), EXPECT_TRUE(upb_StringView_IsEqual(upb_StringView_FromString("World"),
upb_test_ModelExtension1_str(ext1))); upb_test_ModelExtension1_str(ext1)));
// Test known GetExtension 2 // Test known GetExtension 2
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2));
// Test known GetExtension 3 // Test known GetExtension 3
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_2_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_2_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(6, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(6, upb_test_ModelExtension2_i(ext2));
// Test known GetExtension 4 // Test known GetExtension 4
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_3_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_3_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(7, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(7, upb_test_ModelExtension2_i(ext2));
// Test known GetExtension 5 // Test known GetExtension 5
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_4_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_4_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(8, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(8, upb_test_ModelExtension2_i(ext2));
// Test known GetExtension 6 // Test known GetExtension 6
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_5_ext, 0, arena, UPB_UPCAST(msg), &upb_test_ModelExtension2_model_ext_5_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(9, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(9, upb_test_ModelExtension2_i(ext2));
@ -188,51 +188,51 @@ TEST(GeneratedCode, Extensions) {
EXPECT_EQ(0, upb_Message_ExtensionCount(UPB_UPCAST(base_msg))); EXPECT_EQ(0, upb_Message_ExtensionCount(UPB_UPCAST(base_msg)));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension1_model_ext_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension1_model_ext_ext, 0, arena,
&upb_ext2); &value);
ext1 = (upb_test_ModelExtension1*)upb_ext2->data.ptr; ext1 = (upb_test_ModelExtension1*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_TRUE(upb_StringView_IsEqual(upb_StringView_FromString("World"), EXPECT_TRUE(upb_StringView_IsEqual(upb_StringView_FromString("World"),
upb_test_ModelExtension1_str(ext1))); upb_test_ModelExtension1_str(ext1)));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_2_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_2_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(6, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(6, upb_test_ModelExtension2_i(ext2));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_3_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_3_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(7, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(7, upb_test_ModelExtension2_i(ext2));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_4_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_4_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(8, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(8, upb_test_ModelExtension2_i(ext2));
// Test unknown GetExtension. // Test unknown GetExtension.
promote_status = upb_MiniTable_GetOrPromoteExtension( promote_status = upb_Message_GetOrPromoteExtension(
UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_5_ext, 0, arena, UPB_UPCAST(base_msg), &upb_test_ModelExtension2_model_ext_5_ext, 0, arena,
&upb_ext2); &value);
ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr; ext2 = (upb_test_ModelExtension2*)value.msg_val;
EXPECT_EQ(kUpb_GetExtension_Ok, promote_status); EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
EXPECT_EQ(9, upb_test_ModelExtension2_i(ext2)); EXPECT_EQ(9, upb_test_ModelExtension2_i(ext2));

Loading…
Cancel
Save