Replace PROTOBUF_FORCE_COPY_IN_RELEASE macro with constexpr function for easier maintenance.

No semantic change expected.

PiperOrigin-RevId: 669096134
pull/17990/head
Protobuf Team Bot 7 months ago committed by Copybara-Service
parent b9d1800df0
commit ac9b4087df
  1. 18
      src/google/protobuf/compiler/cpp/field_generators/message_field.cc
  2. 36
      src/google/protobuf/compiler/plugin.pb.h
  3. 414
      src/google/protobuf/descriptor.pb.h
  4. 18
      src/google/protobuf/generated_message_reflection.cc
  5. 30
      src/google/protobuf/generated_message_reflection_unittest.cc
  6. 7
      src/google/protobuf/map_test.inc
  7. 4
      src/google/protobuf/port.h
  8. 4
      src/google/protobuf/port_def.inc
  9. 1
      src/google/protobuf/port_undef.inc
  10. 46
      src/google/protobuf/repeated_ptr_field.h

@ -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$() {

@ -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() {

@ -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() {

@ -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<GenericTypeHandler<Message>>();
}
}
#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);

@ -715,15 +715,15 @@ TEST(GeneratedMessageReflectionTest, ReleaseLast) {
(void)expected; // unused in somce configurations
std::unique_ptr<Message> 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(

@ -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<const Message*> 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<const Message*>::iterator it = release_last.begin();
it != release_last.end(); ++it) {
delete *it;

@ -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; }

@ -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

@ -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

@ -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<TypeHandler>(result);
if (arena == nullptr) delete result;
#else // PROTOBUF_FORCE_COPY_IN_RELEASE
auto* new_result = (arena == nullptr) ? result : copy<TypeHandler>(result);
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE
return new_result;
if (internal::DebugHardenForceCopyInRelease()) {
auto* new_result = copy<TypeHandler>(result);
if (arena == nullptr) delete result;
return new_result;
} else {
return (arena == nullptr) ? result : copy<TypeHandler>(result);
}
}
// Releases and returns the last element, but does not do out-of-arena copy.
@ -1437,27 +1437,27 @@ inline void RepeatedPtrField<Element>::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<TypeHandler>(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<TypeHandler>(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<TypeHandler>(extracted[i]);
}
} else {
memcpy(elements, extracted, num * sizeof(Element*));
}
}
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE
}
CloseGap(start, num);
}

Loading…
Cancel
Save