mirror of
https://github.com/esphome/esphome.git
synced 2025-08-05 09: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 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);
|
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
|
// Metadata structure describing each field
|
||||||
struct FieldMeta {
|
struct FieldMeta {
|
||||||
uint8_t field_num; // Protobuf field number (1-255)
|
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
|
EncodeFunc encoder; // Function to encode this field type
|
||||||
SizeFunc sizer; // Function to calculate size for 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
|
bool force_encode; // If true, encode even if value is default/empty
|
||||||
|
@ -1184,20 +1184,20 @@ def build_message_type(
|
|||||||
|
|
||||||
if encoder and sizer:
|
if encoder and sizer:
|
||||||
repeated_fields.append(
|
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):
|
elif isinstance(ti._ti, EnumType):
|
||||||
# Handle enum repeated fields with template
|
# Handle enum repeated fields with template
|
||||||
enum_type = ti._ti.cpp_type
|
enum_type = ti._ti.cpp_type
|
||||||
repeated_fields.append(
|
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}>}}"
|
f"&encode_repeated_enum_field<{enum_type}>, &size_repeated_enum_field<{enum_type}>}}"
|
||||||
)
|
)
|
||||||
elif isinstance(ti._ti, MessageType):
|
elif isinstance(ti._ti, MessageType):
|
||||||
# Handle message repeated fields with template
|
# Handle message repeated fields with template
|
||||||
msg_type = ti._ti.cpp_type
|
msg_type = ti._ti.cpp_type
|
||||||
repeated_fields.append(
|
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}>}}"
|
f"&encode_repeated_message_field<{msg_type}>, &size_repeated_message_field<{msg_type}>}}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@ -1208,13 +1208,13 @@ def build_message_type(
|
|||||||
|
|
||||||
if encoder and sizer:
|
if encoder and sizer:
|
||||||
regular_fields.append(
|
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):
|
elif isinstance(ti, EnumType):
|
||||||
# Handle enum fields with template
|
# Handle enum fields with template
|
||||||
enum_type = ti.cpp_type
|
enum_type = ti.cpp_type
|
||||||
regular_fields.append(
|
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}}}"
|
f"&encode_enum_field<{enum_type}>, &size_enum_field<{enum_type}>, {force}}}"
|
||||||
)
|
)
|
||||||
elif isinstance(ti, MessageType):
|
elif isinstance(ti, MessageType):
|
||||||
@ -1712,10 +1712,6 @@ namespace api {
|
|||||||
# Generate metadata definitions in cpp file for Response classes
|
# Generate metadata definitions in cpp file for Response classes
|
||||||
if response_metadata:
|
if response_metadata:
|
||||||
cpp += "\n// Metadata definitions for Response classes\n"
|
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
|
current_ifdef = None
|
||||||
|
|
||||||
for meta in response_metadata:
|
for meta in response_metadata:
|
||||||
@ -1754,11 +1750,6 @@ namespace api {
|
|||||||
if current_ifdef is not None:
|
if current_ifdef is not None:
|
||||||
cpp += "#endif\n"
|
cpp += "#endif\n"
|
||||||
|
|
||||||
# Re-enable the warning
|
|
||||||
cpp += "#ifdef __GNUC__\n"
|
|
||||||
cpp += "#pragma GCC diagnostic pop\n"
|
|
||||||
cpp += "#endif\n"
|
|
||||||
|
|
||||||
cpp += """\
|
cpp += """\
|
||||||
|
|
||||||
} // namespace api
|
} // namespace api
|
||||||
|
Loading…
x
Reference in New Issue
Block a user