From ac9b4087df7c51981dcb13ead800e84e6ed07e64 Mon Sep 17 00:00:00 2001 From: Protobuf Team Bot Date: Thu, 29 Aug 2024 16:07:58 -0700 Subject: [PATCH] Replace PROTOBUF_FORCE_COPY_IN_RELEASE macro with constexpr function for easier maintenance. No semantic change expected. PiperOrigin-RevId: 669096134 --- .../cpp/field_generators/message_field.cc | 18 +- src/google/protobuf/compiler/plugin.pb.h | 36 +- src/google/protobuf/descriptor.pb.h | 414 +++++++++--------- .../protobuf/generated_message_reflection.cc | 18 +- .../generated_message_reflection_unittest.cc | 30 +- src/google/protobuf/map_test.inc | 7 +- src/google/protobuf/port.h | 4 + src/google/protobuf/port_def.inc | 4 - src/google/protobuf/port_undef.inc | 1 - src/google/protobuf/repeated_ptr_field.h | 46 +- 10 files changed, 288 insertions(+), 290 deletions(-) diff --git a/src/google/protobuf/compiler/cpp/field_generators/message_field.cc b/src/google/protobuf/compiler/cpp/field_generators/message_field.cc index c024fb4c91..361a60de3f 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/message_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/message_field.cc @@ -233,17 +233,17 @@ void SingularMessage::GenerateInlineAccessorDefinitions(io::Printer* p) const { $clear_hasbit$; $Submsg$* released = $cast_field_$; $field_$ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<$pb$::MessageLite*>(released); - released = $pbi$::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if ($pbi$::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<$pb$::MessageLite*>(released); released = $pbi$::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = $pbi$::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline $Submsg$* $Msg$::unsafe_arena_release_$name$() { diff --git a/src/google/protobuf/compiler/plugin.pb.h b/src/google/protobuf/compiler/plugin.pb.h index 6f3336a1f7..83c86ae612 100644 --- a/src/google/protobuf/compiler/plugin.pb.h +++ b/src/google/protobuf/compiler/plugin.pb.h @@ -1613,17 +1613,17 @@ inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::release_comp _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::compiler::Version* released = _impl_.compiler_version_; _impl_.compiler_version_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::unsafe_arena_release_compiler_version() { @@ -1924,17 +1924,17 @@ inline ::google::protobuf::GeneratedCodeInfo* CodeGeneratorResponse_File::releas _impl_._has_bits_[0] &= ~0x00000008u; ::google::protobuf::GeneratedCodeInfo* released = _impl_.generated_code_info_; _impl_.generated_code_info_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::GeneratedCodeInfo* CodeGeneratorResponse_File::unsafe_arena_release_generated_code_info() { diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h index f900646ce7..a3ebd0a970 100644 --- a/src/google/protobuf/descriptor.pb.h +++ b/src/google/protobuf/descriptor.pb.h @@ -12314,17 +12314,17 @@ inline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() { _impl_._has_bits_[0] &= ~0x00000008u; ::google::protobuf::FileOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FileOptions* FileDescriptorProto::unsafe_arena_release_options() { @@ -12411,17 +12411,17 @@ inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_c _impl_._has_bits_[0] &= ~0x00000010u; ::google::protobuf::SourceCodeInfo* released = _impl_.source_code_info_; _impl_.source_code_info_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::unsafe_arena_release_source_code_info() { @@ -12672,17 +12672,17 @@ inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::ExtensionRangeOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::unsafe_arena_release_options() { @@ -13207,17 +13207,17 @@ inline ::google::protobuf::MessageOptions* DescriptorProto::release_options() { _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::MessageOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::MessageOptions* DescriptorProto::unsafe_arena_release_options() { @@ -13758,17 +13758,17 @@ inline ::google::protobuf::FeatureSet* ExtensionRangeOptions::release_features() _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* ExtensionRangeOptions::unsafe_arena_release_features() { @@ -14367,17 +14367,17 @@ inline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() _impl_._has_bits_[0] &= ~0x00000020u; ::google::protobuf::FieldOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FieldOptions* FieldDescriptorProto::unsafe_arena_release_options() { @@ -14569,17 +14569,17 @@ inline ::google::protobuf::OneofOptions* OneofDescriptorProto::release_options() _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::OneofOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::OneofOptions* OneofDescriptorProto::unsafe_arena_release_options() { @@ -14854,17 +14854,17 @@ inline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() { _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::EnumOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::EnumOptions* EnumDescriptorProto::unsafe_arena_release_options() { @@ -15171,17 +15171,17 @@ inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_o _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::EnumValueOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::unsafe_arena_release_options() { @@ -15394,17 +15394,17 @@ inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_optio _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::ServiceOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::unsafe_arena_release_options() { @@ -15711,17 +15711,17 @@ inline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options _impl_._has_bits_[0] &= ~0x00000008u; ::google::protobuf::MethodOptions* released = _impl_.options_; _impl_.options_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::MethodOptions* MethodDescriptorProto::unsafe_arena_release_options() { @@ -16852,17 +16852,17 @@ inline ::google::protobuf::FeatureSet* FileOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000400u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* FileOptions::unsafe_arena_release_features() { @@ -17148,17 +17148,17 @@ inline ::google::protobuf::FeatureSet* MessageOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* MessageOptions::unsafe_arena_release_features() { @@ -17933,17 +17933,17 @@ inline ::google::protobuf::FeatureSet* FieldOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* FieldOptions::unsafe_arena_release_features() { @@ -18030,17 +18030,17 @@ inline ::google::protobuf::FieldOptions_FeatureSupport* FieldOptions::release_fe _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_; _impl_.feature_support_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FieldOptions_FeatureSupport* FieldOptions::unsafe_arena_release_feature_support() { @@ -18181,17 +18181,17 @@ inline ::google::protobuf::FeatureSet* OneofOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* OneofOptions::unsafe_arena_release_features() { @@ -18419,17 +18419,17 @@ inline ::google::protobuf::FeatureSet* EnumOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* EnumOptions::unsafe_arena_release_features() { @@ -18599,17 +18599,17 @@ inline ::google::protobuf::FeatureSet* EnumValueOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* EnumValueOptions::unsafe_arena_release_features() { @@ -18725,17 +18725,17 @@ inline ::google::protobuf::FieldOptions_FeatureSupport* EnumValueOptions::releas _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_; _impl_.feature_support_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FieldOptions_FeatureSupport* EnumValueOptions::unsafe_arena_release_feature_support() { @@ -18876,17 +18876,17 @@ inline ::google::protobuf::FeatureSet* ServiceOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* ServiceOptions::unsafe_arena_release_features() { @@ -19115,17 +19115,17 @@ inline ::google::protobuf::FeatureSet* MethodOptions::release_features() { _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.features_; _impl_.features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* MethodOptions::unsafe_arena_release_features() { @@ -19942,17 +19942,17 @@ inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefau _impl_._has_bits_[0] &= ~0x00000001u; ::google::protobuf::FeatureSet* released = _impl_.overridable_features_; _impl_.overridable_features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefault::unsafe_arena_release_overridable_features() { @@ -20039,17 +20039,17 @@ inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefau _impl_._has_bits_[0] &= ~0x00000002u; ::google::protobuf::FeatureSet* released = _impl_.fixed_features_; _impl_.fixed_features_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); - released = ::google::protobuf::internal::DuplicateIfNonNull(released); - if (GetArena() == nullptr) { - delete old; - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArena() != nullptr) { + if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) { + auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); released = ::google::protobuf::internal::DuplicateIfNonNull(released); + if (GetArena() == nullptr) { + delete old; + } + } else { + if (GetArena() != nullptr) { + released = ::google::protobuf::internal::DuplicateIfNonNull(released); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return released; } inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefault::unsafe_arena_release_fixed_features() { diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index db087dab35..5c7a86d4ac 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -78,7 +78,6 @@ namespace protobuf { namespace { bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); } -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE Message* MaybeForceCopy(Arena* arena, Message* msg) { if (arena != nullptr || msg == nullptr) return msg; @@ -87,7 +86,6 @@ Message* MaybeForceCopy(Arena* arena, Message* msg) { delete msg; return copy; } -#endif // PROTOBUF_FORCE_COPY_IN_RELEASE } // anonymous namespace namespace internal { @@ -1546,11 +1544,11 @@ Message* Reflection::ReleaseLast(Message* message, ->ReleaseLast>(); } } -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - return MaybeForceCopy(message->GetArena(), released); -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - return released; -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (internal::DebugHardenForceCopyInRelease()) { + return MaybeForceCopy(message->GetArena(), released); + } else { + return released; + } } Message* Reflection::UnsafeArenaReleaseLast( @@ -2454,9 +2452,9 @@ Message* Reflection::ReleaseMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory) const { Message* released = UnsafeArenaReleaseMessage(message, field, factory); -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - released = MaybeForceCopy(message->GetArena(), released); -#endif // PROTOBUF_FORCE_COPY_IN_RELEASE + if (internal::DebugHardenForceCopyInRelease()) { + released = MaybeForceCopy(message->GetArena(), released); + } if (message->GetArena() != nullptr && released != nullptr) { Message* copy_from_arena = released->New(); copy_from_arena->CopyFrom(*released); diff --git a/src/google/protobuf/generated_message_reflection_unittest.cc b/src/google/protobuf/generated_message_reflection_unittest.cc index 94d3841b86..61f82efae0 100644 --- a/src/google/protobuf/generated_message_reflection_unittest.cc +++ b/src/google/protobuf/generated_message_reflection_unittest.cc @@ -715,15 +715,15 @@ TEST(GeneratedMessageReflectionTest, ReleaseLast) { (void)expected; // unused in somce configurations std::unique_ptr released(message.GetReflection()->ReleaseLast( &message, descriptor->FindFieldByName("repeated_foreign_message"))); -#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE - EXPECT_EQ(expected, released.get()); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (!internal::DebugHardenForceCopyInRelease()) { + EXPECT_EQ(expected, released.get()); + } } TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) { -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - GTEST_SKIP() << "Won't work with FORCE_COPY_IN_RELEASE."; -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (internal::DebugHardenForceCopyInRelease()) { + GTEST_SKIP() << "Won't work with FORCE_COPY_IN_RELEASE."; + } unittest::TestAllExtensions message; const Descriptor* descriptor = message.GetDescriptor(); @@ -1155,9 +1155,9 @@ TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) { released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != nullptr); -#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE - EXPECT_EQ(&sub_message, released); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (!internal::DebugHardenForceCopyInRelease()) { + EXPECT_EQ(&sub_message, released); + } delete released; TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2); @@ -1175,9 +1175,9 @@ TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) { released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_message")); EXPECT_TRUE(released != nullptr); -#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE - EXPECT_EQ(&sub_message2, released); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (!internal::DebugHardenForceCopyInRelease()) { + EXPECT_EQ(&sub_message2, released); + } delete released; } @@ -1298,9 +1298,9 @@ TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) { &message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != nullptr); -#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE - EXPECT_EQ(&sub_message, released); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (!internal::DebugHardenForceCopyInRelease()) { + EXPECT_EQ(&sub_message, released); + } delete released; released = reflection->ReleaseMessage( diff --git a/src/google/protobuf/map_test.inc b/src/google/protobuf/map_test.inc index 4b75234346..ed59e8999b 100644 --- a/src/google/protobuf/map_test.inc +++ b/src/google/protobuf/map_test.inc @@ -46,6 +46,7 @@ #include "google/protobuf/map_proto2_unittest.pb.h" #include "google/protobuf/map_proto3_unittest.pb.h" #include "google/protobuf/message.h" +#include "google/protobuf/port.h" #include "google/protobuf/reflection.h" #include "google/protobuf/reflection_ops.h" #include "google/protobuf/test_util2.h" @@ -3263,9 +3264,9 @@ TEST(GeneratedMapFieldReflectionTest, ReleaseLast) { std::vector release_last = MapTestUtil::GetMapEntriesFromRelease(&message); MapTestUtil::ExpectMapsSize(message, 1); -#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE - EXPECT_TRUE(expect_last == release_last); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + if (!internal::DebugHardenForceCopyInRelease()) { + EXPECT_TRUE(expect_last == release_last); + } for (std::vector::iterator it = release_last.begin(); it != release_last.end(); ++it) { delete *it; diff --git a/src/google/protobuf/port.h b/src/google/protobuf/port.h index 9c4e9406fe..d631c7c1a5 100644 --- a/src/google/protobuf/port.h +++ b/src/google/protobuf/port.h @@ -269,6 +269,10 @@ constexpr bool PerformDebugChecks() { #endif } +constexpr bool DebugHardenForceCopyInRelease() { + return false; +} + // Returns true if pointers are 8B aligned, leaving least significant 3 bits // available. inline constexpr bool PtrIsAtLeast8BAligned() { return alignof(void*) >= 8; } diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc index c32c8e9cf9..78ba5d5e51 100644 --- a/src/google/protobuf/port_def.inc +++ b/src/google/protobuf/port_def.inc @@ -398,10 +398,6 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3), #define PROTOBUF_RESTRICT #endif -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE -#error PROTOBUF_FORCE_COPY_IN_RELEASE was previously defined -#endif - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP #error PROTOBUF_FORCE_COPY_IN_SWAP was previously defined #endif diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc index c87f37e94c..381e85ed3c 100644 --- a/src/google/protobuf/port_undef.inc +++ b/src/google/protobuf/port_undef.inc @@ -41,7 +41,6 @@ #undef PROTOC_EXPORT #undef PROTOBUF_NODISCARD #undef PROTOBUF_RESTRICT -#undef PROTOBUF_FORCE_COPY_IN_RELEASE #undef PROTOBUF_FORCE_COPY_IN_SWAP #undef PROTOBUF_FORCE_COPY_IN_MOVE #undef PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h index eb54fc86e1..9659da94e0 100644 --- a/src/google/protobuf/repeated_ptr_field.h +++ b/src/google/protobuf/repeated_ptr_field.h @@ -456,13 +456,13 @@ class PROTOBUF_EXPORT RepeatedPtrFieldBase { // Now perform a copy if we're on an arena. Arena* arena = GetArena(); -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* new_result = copy(result); - if (arena == nullptr) delete result; -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - auto* new_result = (arena == nullptr) ? result : copy(result); -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return new_result; + if (internal::DebugHardenForceCopyInRelease()) { + auto* new_result = copy(result); + if (arena == nullptr) delete result; + return new_result; + } else { + return (arena == nullptr) ? result : copy(result); + } } // Releases and returns the last element, but does not do out-of-arena copy. @@ -1437,27 +1437,27 @@ inline void RepeatedPtrField::ExtractSubrange(int start, int num, if (elements != nullptr) { Arena* arena = GetArena(); auto* extracted = data() + start; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - // Always copy. - for (int i = 0; i < num; ++i) { - elements[i] = copy(extracted[i]); - } - if (arena == nullptr) { - for (int i = 0; i < num; ++i) { - delete extracted[i]; - } - } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - // If we're on an arena, we perform a copy for each element so that the - // returned elements are heap-allocated. Otherwise, just forward it. - if (arena != nullptr) { + if (internal::DebugHardenForceCopyInRelease()) { + // Always copy. for (int i = 0; i < num; ++i) { elements[i] = copy(extracted[i]); } + if (arena == nullptr) { + for (int i = 0; i < num; ++i) { + delete extracted[i]; + } + } } else { - memcpy(elements, extracted, num * sizeof(Element*)); + // If we're on an arena, we perform a copy for each element so that the + // returned elements are heap-allocated. Otherwise, just forward it. + if (arena != nullptr) { + for (int i = 0; i < num; ++i) { + elements[i] = copy(extracted[i]); + } + } else { + memcpy(elements, extracted, num * sizeof(Element*)); + } } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE } CloseGap(start, num); }