Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions hpb/backend/upb/repeated_field.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#ifndef GOOGLE_PROTOBUF_HPB_BACKEND_UPB_REPEATED_FIELD_H__
#define GOOGLE_PROTOBUF_HPB_BACKEND_UPB_REPEATED_FIELD_H__

#include "absl/log/absl_check.h"
#include "hpb/backend/upb/interop.h"
#include "hpb/backend/upb/repeated_field_iterator.h"
#include "hpb/internal/template_help.h"
Expand Down Expand Up @@ -58,7 +59,7 @@ class RepeatedFieldProxyMutableBase : public RepeatedFieldProxyBase<T> {
RepeatedFieldProxyMutableBase(upb_Array* arr, upb_Arena* arena)
: RepeatedFieldProxyBase<T>(arr, arena) {}

void clear() { upb_Array_Resize(this->arr_, 0, this->arena_); }
void clear() { (void)upb_Array_Resize(this->arr_, 0, this->arena_); }
};

// RepeatedField proxy for repeated messages.
Expand Down Expand Up @@ -110,7 +111,10 @@ class RepeatedFieldProxy
message_value.msg_val = upb_Message_DeepClone(
PrivateAccess::GetInternalMsg(&t), hpb::interop::upb::GetMiniTable(&t),
this->arena_);
upb_Array_Append(this->arr_, message_value, this->arena_);
bool ok = upb_Array_Append(this->arr_, message_value, this->arena_);
// TODO: Change to absl::ThrowStdBadAlloc once our min absl version is
// above 202603
ABSL_CHECK(ok);
}

// Mutable message add using move.
Expand All @@ -119,8 +123,11 @@ class RepeatedFieldProxy
void push_back(T&& msg) {
upb_MessageValue message_value;
message_value.msg_val = PrivateAccess::GetInternalMsg(&msg);
upb_Arena_Fuse(interop::upb::GetArena(&msg), this->arena_);
upb_Array_Append(this->arr_, message_value, this->arena_);
(void)upb_Arena_Fuse(interop::upb::GetArena(&msg), this->arena_);
bool append_ok = upb_Array_Append(this->arr_, message_value, this->arena_);
// TODO: Change to absl::ThrowStdBadAlloc once our min absl version is
// above 202603
ABSL_CHECK(append_ok);
T moved_msg = std::move(msg);
}

Expand Down Expand Up @@ -179,7 +186,10 @@ class RepeatedFieldStringProxy
assert(data);
memcpy(data, t.data(), t.size());
message_value.str_val = upb_StringView_FromDataAndSize(data, t.size());
upb_Array_Append(this->arr_, message_value, this->arena_);
bool ok = upb_Array_Append(this->arr_, message_value, this->arena_);
// TODO: Change to absl::ThrowStdBadAlloc once our min absl version is
// above 202603
ABSL_CHECK(ok);
}

iterator begin() const { return iterator({this->arr_, this->arena_, 0}); }
Expand Down Expand Up @@ -226,7 +236,10 @@ class RepeatedFieldScalarProxy
void push_back(T t) {
upb_MessageValue message_value;
memcpy(&message_value, &t, sizeof(T));
upb_Array_Append(this->arr_, message_value, this->arena_);
bool ok = upb_Array_Append(this->arr_, message_value, this->arena_);
// TODO: Change to absl::ThrowStdBadAlloc once our min absl version is
// above 202603
ABSL_CHECK(ok);
}

iterator begin() const { return iterator({unsafe_array()}); }
Expand Down
3 changes: 2 additions & 1 deletion hpb/backend/upb/repeated_field_iterator_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,8 @@ upb_Array* MakeStringArray(hpb::Arena& arena,
upb_MessageValue message_value;
message_value.str_val =
upb_StringView_FromDataAndSize(CloneString(arena, str), str.size());
upb_Array_Append(arr, message_value, hpb::interop::upb::UnwrapArena(arena));
EXPECT_TRUE(upb_Array_Append(arr, message_value,
hpb::interop::upb::UnwrapArena(arena)));
}
return arr;
}
Expand Down
8 changes: 4 additions & 4 deletions upb/hash/test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,10 @@ TEST(Table, MaxValueWithLargeArray) {
TEST(IntTableTest, RemoveIter) {
upb::Arena arena;
upb_inttable t;
upb_inttable_init(&t, arena.ptr());
upb_inttable_insert(&t, 0, upb_value_bool(true), arena.ptr());
upb_inttable_insert(&t, 2, upb_value_bool(true), arena.ptr());
upb_inttable_insert(&t, 4, upb_value_bool(true), arena.ptr());
EXPECT_TRUE(upb_inttable_init(&t, arena.ptr()));
EXPECT_TRUE(upb_inttable_insert(&t, 0, upb_value_bool(true), arena.ptr()));
EXPECT_TRUE(upb_inttable_insert(&t, 2, upb_value_bool(true), arena.ptr()));
EXPECT_TRUE(upb_inttable_insert(&t, 4, upb_value_bool(true), arena.ptr()));

intptr_t iter = UPB_INTTABLE_BEGIN;
uintptr_t key;
Expand Down
51 changes: 32 additions & 19 deletions upb/message/convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,15 @@ UPB_INLINE bool _upb_MiniTableField_IsExtensionCompatible(
upb_MiniTableField_IsArray(dst_f) == upb_MiniTableField_IsArray(src_f);
}

static void upb_Message_SetFieldOrExtension(upb_Message* msg,
const upb_MiniTableField* f,
const upb_MiniTableExtension* ext,
const upb_MessageValue* val,
upb_Arena* arena) {
UPB_NODISCARD static bool upb_Message_SetFieldOrExtension(
upb_Message* msg, const upb_MiniTableField* f,
const upb_MiniTableExtension* ext, const upb_MessageValue* val,
upb_Arena* arena) {
if (ext != NULL) {
upb_Message_SetExtension(msg, ext, val, arena);
} else {
upb_Message_SetBaseField(msg, f, val);
return upb_Message_SetExtension(msg, ext, val, arena);
}
upb_Message_SetBaseField(msg, f, val);
return true;
}

static void upb_Message_EncodeFieldAsUnknown(
Expand Down Expand Up @@ -175,7 +174,7 @@ static void upb_Array_DeepConvert(
}
}
if (dst_i != size) {
upb_Array_Resize(dst, dst_i, c->arena);
(void)upb_Array_Resize(dst, dst_i, c->arena);
}
}

Expand Down Expand Up @@ -443,18 +442,25 @@ static void upb_Message_ConvertExtensions(upb_Converter* c, upb_Message* dst,
src_sub_mt, dst_f, dst, extreg, depth);
upb_MessageValue valid_val;
valid_val.array_val = dst_arr;
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &valid_val,
c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext,
&valid_val, c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
} else {
// Array of messages, and the sub message types are the same.
// Shallow copy.
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val,
c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val,
c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
}
} else if (dst_sub_mt == src_sub_mt) {
// Scalar message, and the message types are the same.
// Shallow copy.
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val, c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val,
c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
} else {
// Scalar message, and the message types differ. Perform conversion.
upb_Message* dst_sub = upb_Message_New(dst_sub_mt, c->arena);
Expand All @@ -466,8 +472,10 @@ static void upb_Message_ConvertExtensions(upb_Converter* c, upb_Message* dst,

upb_MessageValue valid_val;
valid_val.msg_val = dst_sub;
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &valid_val,
c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &valid_val,
c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
}
} else {
// Scalar non-message type.
Expand All @@ -480,8 +488,10 @@ static void upb_Message_ConvertExtensions(upb_Converter* c, upb_Message* dst,
dst, extreg, depth);
upb_MessageValue valid_val;
valid_val.array_val = dst_arr;
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &valid_val,
c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext,
&valid_val, c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
continue;
} else {
const upb_MiniTableEnum* dst_e =
Expand All @@ -497,7 +507,10 @@ static void upb_Message_ConvertExtensions(upb_Converter* c, upb_Message* dst,
}
}
}
upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val, c->arena);
if (!upb_Message_SetFieldOrExtension(dst, dst_f, dst_ext, &val,
c->arena)) {
upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_OutOfMemory);
}
}
} else {
// Since this extension is not known in the destination schema, encode it
Expand Down
17 changes: 9 additions & 8 deletions upb/message/convert_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ TEST(ConvertTest, ExtensionArrayShallowConversion) {
upb_test_convert_MessageWithInt32_set_f1(val, 456);

upb_Array* ext_arr = upb_Array_New(arena.ptr(), kUpb_CType_Message);
upb_Array_Resize(ext_arr, 1, arena.ptr());
ASSERT_TRUE(upb_Array_Resize(ext_arr, 1, arena.ptr()));
upb_MessageValue elem_val;
elem_val.msg_val = (const upb_Message*)val;
upb_Array_Set(ext_arr, 0, elem_val);
Expand Down Expand Up @@ -291,7 +291,7 @@ TEST(ConvertTest, ExtensionArrayDeepConversion) {
upb_test_convert_MessageWithInt32_set_f1(val, 789);

upb_Array* ext_arr = upb_Array_New(arena.ptr(), kUpb_CType_Message);
upb_Array_Resize(ext_arr, 1, arena.ptr());
ASSERT_TRUE(upb_Array_Resize(ext_arr, 1, arena.ptr()));
upb_MessageValue elem_val;
elem_val.msg_val = (const upb_Message*)val;
upb_Array_Set(ext_arr, 0, elem_val);
Expand Down Expand Up @@ -693,8 +693,9 @@ TEST(ConvertTest, ConvertExtensions_LookupExtensionInRegistry) {
&upb__test__convert__AnotherMessageWithExtension_msg_init;

upb_ExtensionRegistry* extreg = upb_ExtensionRegistry_New(arena.ptr());
upb_ExtensionRegistry_Add(extreg,
upb_test_convert_another_ext_field_int32_ext);
ASSERT_EQ(upb_ExtensionRegistry_Add(
extreg, upb_test_convert_another_ext_field_int32_ext),
kUpb_ExtensionRegistryStatus_Ok);

const upb_Message* dst_msg = upb_Message_Convert(
UPB_UPCAST(msg), src_mt, dst_mt, extreg, 0, 0, arena.ptr());
Expand Down Expand Up @@ -1420,9 +1421,9 @@ TEST(ConvertTest, OpenToClosedExtensionRepeatedEnum) {
upb_Array* ext_arr = upb_Array_New(arena.ptr(), kUpb_CType_Enum);
upb_MessageValue elem_val;
elem_val.int32_val = upb_test_convert_Proto2EnumMessage_FOO;
upb_Array_Append(ext_arr, elem_val, arena.ptr());
ASSERT_TRUE(upb_Array_Append(ext_arr, elem_val, arena.ptr()));
elem_val.int32_val = upb_test_convert_Proto2EnumMessage_BAR;
upb_Array_Append(ext_arr, elem_val, arena.ptr());
ASSERT_TRUE(upb_Array_Append(ext_arr, elem_val, arena.ptr()));

upb_MessageValue ext_val;
ext_val.array_val = ext_arr;
Expand Down Expand Up @@ -1457,9 +1458,9 @@ TEST(ConvertTest, OpenToClosedExtensionRepeatedEnum_InvalidValue) {
upb_Array* ext_arr = upb_Array_New(arena.ptr(), kUpb_CType_Enum);
upb_MessageValue elem_val;
elem_val.int32_val = 12345; // Invalid value.
upb_Array_Append(ext_arr, elem_val, arena.ptr());
ASSERT_TRUE(upb_Array_Append(ext_arr, elem_val, arena.ptr()));
elem_val.int32_val = upb_test_convert_Proto2EnumMessage_BAR;
upb_Array_Append(ext_arr, elem_val, arena.ptr());
ASSERT_TRUE(upb_Array_Append(ext_arr, elem_val, arena.ptr()));

upb_MessageValue ext_val;
ext_val.array_val = ext_arr;
Expand Down
3 changes: 2 additions & 1 deletion upb/wire/encode_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ TEST(EncodeTest, EncodeExtensionSuccess) {
// extension value.
upb_ExtensionRegistry* ext_reg = upb_ExtensionRegistry_New(arena);
const upb_MiniTableExtension* ext_array[1] = {upb_wire_test_ext_i32_ext};
upb_ExtensionRegistry_AddArray(ext_reg, ext_array, 1);
EXPECT_EQ(upb_ExtensionRegistry_AddArray(ext_reg, ext_array, 1),
kUpb_ExtensionRegistryStatus_Ok);

upb_wire_test_TestExtensions* decoded_msg =
upb_wire_test_TestExtensions_parse_ex(buf, size, ext_reg, 0, arena);
Expand Down
Loading