mirror of
https://github.com/esphome/esphome.git
synced 2025-08-03 08:57:47 +00:00
weak
This commit is contained in:
parent
163a5747f0
commit
95afae4830
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user