diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc index 5df34c17d1..a5b9aaab10 100644 --- a/src/google/protobuf/compiler/cpp/message.cc +++ b/src/google/protobuf/compiler/cpp/message.cc @@ -3992,8 +3992,10 @@ void MessageGenerator::GenerateClassData(io::Printer* p) { )cc"); } else { p->Emit(R"cc( - $superclass$::ClearImpl, $superclass$::ByteSizeLongImpl, - $superclass$::_InternalSerializeImpl, + static_cast( + &$classname$::ClearImpl), + $superclass$::ByteSizeLongImpl, $superclass$::_InternalSerializeImpl + , )cc"); } }; diff --git a/src/google/protobuf/dynamic_message.cc b/src/google/protobuf/dynamic_message.cc index f6fab022b4..122c32f94c 100644 --- a/src/google/protobuf/dynamic_message.cc +++ b/src/google/protobuf/dynamic_message.cc @@ -270,7 +270,7 @@ struct DynamicMessageFactory::TypeInfo { &DynamicMessage::MergeImpl, internal::MessageCreator(), // to be filled later &DynamicMessage::DeleteImpl, - DynamicMessage::ClearImpl, + static_cast(&DynamicMessage::ClearImpl), DynamicMessage::ByteSizeLongImpl, DynamicMessage::_InternalSerializeImpl, PROTOBUF_FIELD_OFFSET(DynamicMessage, cached_byte_size_), diff --git a/src/google/protobuf/implicit_weak_message.cc b/src/google/protobuf/implicit_weak_message.cc index bd2aac6fc4..f80ef4ac9c 100644 --- a/src/google/protobuf/implicit_weak_message.cc +++ b/src/google/protobuf/implicit_weak_message.cc @@ -72,7 +72,7 @@ constexpr MessageLite::ClassDataLite<1> ImplicitWeakMessage::class_data_ = { internal::MessageCreator(NewImpl, sizeof(ImplicitWeakMessage)), GetDeleteImpl(), - &ClearImpl, + GetClearImpl(), &ByteSizeLongImpl, &_InternalSerializeImpl, PROTOBUF_FIELD_OFFSET(ImplicitWeakMessage, cached_size_), diff --git a/src/google/protobuf/implicit_weak_message.h b/src/google/protobuf/implicit_weak_message.h index a72e913dd6..b3a801a294 100644 --- a/src/google/protobuf/implicit_weak_message.h +++ b/src/google/protobuf/implicit_weak_message.h @@ -87,10 +87,6 @@ class PROTOBUF_EXPORT ImplicitWeakMessage final : public MessageLite { static void MergeImpl(MessageLite&, const MessageLite&); - static void ClearImpl(MessageLite& msg) { - static_cast(msg).Clear(); - } - static size_t ByteSizeLongImpl(const MessageLite& msg) { return static_cast(msg).ByteSizeLong(); } diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc index f60818f424..d265e284e1 100644 --- a/src/google/protobuf/message.cc +++ b/src/google/protobuf/message.cc @@ -71,8 +71,8 @@ void Message::MergeImpl(MessageLite& to, const MessageLite& from) { DownCastMessage(&to)); } -void Message::ClearImpl(MessageLite& msg) { - ReflectionOps::Clear(&DownCastMessage(msg)); +void Message::ClearImpl() { + ReflectionOps::Clear(DownCastMessage(this)); } size_t Message::ByteSizeLongImpl(const MessageLite& msg) { diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h index 6f0c0c52e3..90a8eb31b4 100644 --- a/src/google/protobuf/message.h +++ b/src/google/protobuf/message.h @@ -390,7 +390,7 @@ class PROTOBUF_EXPORT Message : public MessageLite { // Reflection based version for reflection based types. static absl::string_view GetTypeNameImpl(const ClassData* data); static void MergeImpl(MessageLite& to, const MessageLite& from); - static void ClearImpl(MessageLite& msg); + void ClearImpl(); static size_t ByteSizeLongImpl(const MessageLite& msg); static uint8_t* _InternalSerializeImpl(const MessageLite& msg, uint8_t* target, diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h index c3ae2039b3..ec1168d2cc 100644 --- a/src/google/protobuf/message_lite.h +++ b/src/google/protobuf/message_lite.h @@ -333,7 +333,7 @@ class PROTOBUF_EXPORT MessageLite { // will likely be needed again, so the memory used may not be freed. // To ensure that all memory used by a Message is freed, you must delete it. #if defined(PROTOBUF_CUSTOM_VTABLE) - void Clear() { _class_data_->clear(*this); } + void Clear() { (this->*_class_data_->clear)(); } #else virtual void Clear() = 0; #endif // PROTOBUF_CUSTOM_VTABLE @@ -649,13 +649,9 @@ class PROTOBUF_EXPORT MessageLite { return DeleteImpl; } - template - static void ClearImpl(MessageLite& msg) { - return static_cast(msg).Clear(); - } template static constexpr auto GetClearImpl() { - return ClearImpl; + return static_cast(&T::Clear); } #else // PROTOBUF_CUSTOM_VTABLE // When custom vtables are off we avoid instantiating the functions because we @@ -715,7 +711,7 @@ class PROTOBUF_EXPORT MessageLite { internal::MessageCreator message_creator; #if defined(PROTOBUF_CUSTOM_VTABLE) DeleteMessageF delete_message; - void (*clear)(MessageLite&); + void (MessageLite::*clear)(); size_t (*byte_size_long)(const MessageLite&); uint8_t* (*serialize)(const MessageLite& msg, uint8_t* ptr, io::EpsCopyOutputStream* stream); @@ -760,7 +756,7 @@ class PROTOBUF_EXPORT MessageLite { void (*merge_to_from)(MessageLite& to, const MessageLite& from_msg), internal::MessageCreator message_creator, // DeleteMessageF delete_message, // - void (*clear)(MessageLite&), + void (MessageLite::*clear)(), size_t (*byte_size_long)(const MessageLite&), uint8_t* (*serialize)(const MessageLite& msg, uint8_t* ptr, io::EpsCopyOutputStream* stream),