This commit is contained in:
J. Nick Koston 2025-07-09 17:38:27 -10:00
parent 163a5747f0
commit 95afae4830
No known key found for this signature in database
3 changed files with 585 additions and 525 deletions

File diff suppressed because it is too large Load Diff

View File

@ -20,10 +20,14 @@ class ProtoWriteBuffer;
using EncodeFunc = void (*)(ProtoWriteBuffer &, const void *field_ptr, uint8_t field_num);
using SizeFunc = void (*)(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force);
// Macro to calculate field offset without triggering -Winvalid-offsetof
// This uses the same approach as offsetof but with explicit reinterpret_cast
#define PROTO_FIELD_OFFSET(Type, Member) (reinterpret_cast<size_t>(&reinterpret_cast<Type *>(16)->Member) - 16)
// Metadata structure describing each field
struct FieldMeta {
uint8_t field_num; // Protobuf field number (1-255)
uint16_t offset; // offsetof(Class, field_name)
uint16_t offset; // offset of field in class
EncodeFunc encoder; // Function to encode this field type
SizeFunc sizer; // Function to calculate size for this field type
bool force_encode; // If true, encode even if value is default/empty

View File

@ -1184,20 +1184,20 @@ def build_message_type(
if encoder and sizer:
repeated_fields.append(
f"{{{field.number}, offsetof({desc.name}, {ti.field_name}), {encoder}, {sizer}}}"
f"{{{field.number}, PROTO_FIELD_OFFSET({desc.name}, {ti.field_name}), {encoder}, {sizer}}}"
)
elif isinstance(ti._ti, EnumType):
# Handle enum repeated fields with template
enum_type = ti._ti.cpp_type
repeated_fields.append(
f"{{{field.number}, offsetof({desc.name}, {ti.field_name}), "
f"{{{field.number}, PROTO_FIELD_OFFSET({desc.name}, {ti.field_name}), "
f"&encode_repeated_enum_field<{enum_type}>, &size_repeated_enum_field<{enum_type}>}}"
)
elif isinstance(ti._ti, MessageType):
# Handle message repeated fields with template
msg_type = ti._ti.cpp_type
repeated_fields.append(
f"{{{field.number}, offsetof({desc.name}, {ti.field_name}), "
f"{{{field.number}, PROTO_FIELD_OFFSET({desc.name}, {ti.field_name}), "
f"&encode_repeated_message_field<{msg_type}>, &size_repeated_message_field<{msg_type}>}}"
)
else:
@ -1208,13 +1208,13 @@ def build_message_type(
if encoder and sizer:
regular_fields.append(
f"{{{field.number}, offsetof({desc.name}, {ti.field_name}), {encoder}, {sizer}, {force}}}"
f"{{{field.number}, PROTO_FIELD_OFFSET({desc.name}, {ti.field_name}), {encoder}, {sizer}, {force}}}"
)
elif isinstance(ti, EnumType):
# Handle enum fields with template
enum_type = ti.cpp_type
regular_fields.append(
f"{{{field.number}, offsetof({desc.name}, {ti.field_name}), "
f"{{{field.number}, PROTO_FIELD_OFFSET({desc.name}, {ti.field_name}), "
f"&encode_enum_field<{enum_type}>, &size_enum_field<{enum_type}>, {force}}}"
)
elif isinstance(ti, MessageType):
@ -1712,10 +1712,6 @@ namespace api {
# Generate metadata definitions in cpp file for Response classes
if response_metadata:
cpp += "\n// Metadata definitions for Response classes\n"
cpp += "#ifdef __GNUC__\n"
cpp += "#pragma GCC diagnostic push\n"
cpp += '#pragma GCC diagnostic ignored "-Winvalid-offsetof"\n'
cpp += "#endif\n"
current_ifdef = None
for meta in response_metadata:
@ -1754,11 +1750,6 @@ namespace api {
if current_ifdef is not None:
cpp += "#endif\n"
# Re-enable the warning
cpp += "#ifdef __GNUC__\n"
cpp += "#pragma GCC diagnostic pop\n"
cpp += "#endif\n"
cpp += """\
} // namespace api