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$; $clear_hasbit$;
$Submsg$* released = $cast_field_$; $Submsg$* released = $cast_field_$;
$field_$ = nullptr; $field_$ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if ($pbi$::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<$pb$::MessageLite*>(released); 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) {
released = $pbi$::DuplicateIfNonNull(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; return released;
} }
inline $Submsg$* $Msg$::unsafe_arena_release_$name$() { inline $Submsg$* $Msg$::unsafe_arena_release_$name$() {

@ -1613,17 +1613,17 @@ inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::release_comp
_impl_._has_bits_[0] &= ~0x00000002u; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::compiler::Version* released = _impl_.compiler_version_; ::google::protobuf::compiler::Version* released = _impl_.compiler_version_;
_impl_.compiler_version_ = nullptr; _impl_.compiler_version_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::unsafe_arena_release_compiler_version() { 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; _impl_._has_bits_[0] &= ~0x00000008u;
::google::protobuf::GeneratedCodeInfo* released = _impl_.generated_code_info_; ::google::protobuf::GeneratedCodeInfo* released = _impl_.generated_code_info_;
_impl_.generated_code_info_ = nullptr; _impl_.generated_code_info_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::GeneratedCodeInfo* CodeGeneratorResponse_File::unsafe_arena_release_generated_code_info() { 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; _impl_._has_bits_[0] &= ~0x00000008u;
::google::protobuf::FileOptions* released = _impl_.options_; ::google::protobuf::FileOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FileOptions* FileDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000010u;
::google::protobuf::SourceCodeInfo* released = _impl_.source_code_info_; ::google::protobuf::SourceCodeInfo* released = _impl_.source_code_info_;
_impl_.source_code_info_ = nullptr; _impl_.source_code_info_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::unsafe_arena_release_source_code_info() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::ExtensionRangeOptions* released = _impl_.options_; ::google::protobuf::ExtensionRangeOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::MessageOptions* released = _impl_.options_; ::google::protobuf::MessageOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::MessageOptions* DescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* ExtensionRangeOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000020u;
::google::protobuf::FieldOptions* released = _impl_.options_; ::google::protobuf::FieldOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FieldOptions* FieldDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::OneofOptions* released = _impl_.options_; ::google::protobuf::OneofOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::OneofOptions* OneofDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::EnumOptions* released = _impl_.options_; ::google::protobuf::EnumOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::EnumOptions* EnumDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::EnumValueOptions* released = _impl_.options_; ::google::protobuf::EnumValueOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::ServiceOptions* released = _impl_.options_; ::google::protobuf::ServiceOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000008u;
::google::protobuf::MethodOptions* released = _impl_.options_; ::google::protobuf::MethodOptions* released = _impl_.options_;
_impl_.options_ = nullptr; _impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::MethodOptions* MethodDescriptorProto::unsafe_arena_release_options() { 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; _impl_._has_bits_[0] &= ~0x00000400u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* FileOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* MessageOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* FieldOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_; ::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_;
_impl_.feature_support_ = nullptr; _impl_.feature_support_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FieldOptions_FeatureSupport* FieldOptions::unsafe_arena_release_feature_support() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* OneofOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* EnumOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* EnumValueOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_; ::google::protobuf::FieldOptions_FeatureSupport* released = _impl_.feature_support_;
_impl_.feature_support_ = nullptr; _impl_.feature_support_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FieldOptions_FeatureSupport* EnumValueOptions::unsafe_arena_release_feature_support() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* ServiceOptions::unsafe_arena_release_features() { 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; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.features_; ::google::protobuf::FeatureSet* released = _impl_.features_;
_impl_.features_ = nullptr; _impl_.features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* MethodOptions::unsafe_arena_release_features() { inline ::google::protobuf::FeatureSet* MethodOptions::unsafe_arena_release_features() {
@ -19942,17 +19942,17 @@ inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefau
_impl_._has_bits_[0] &= ~0x00000001u; _impl_._has_bits_[0] &= ~0x00000001u;
::google::protobuf::FeatureSet* released = _impl_.overridable_features_; ::google::protobuf::FeatureSet* released = _impl_.overridable_features_;
_impl_.overridable_features_ = nullptr; _impl_.overridable_features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefault::unsafe_arena_release_overridable_features() { 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; _impl_._has_bits_[0] &= ~0x00000002u;
::google::protobuf::FeatureSet* released = _impl_.fixed_features_; ::google::protobuf::FeatureSet* released = _impl_.fixed_features_;
_impl_.fixed_features_ = nullptr; _impl_.fixed_features_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (::google::protobuf::internal::DebugHardenForceCopyInRelease()) {
auto* old = reinterpret_cast<::google::protobuf::MessageLite*>(released); 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) {
released = ::google::protobuf::internal::DuplicateIfNonNull(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; return released;
} }
inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefault::unsafe_arena_release_fixed_features() { inline ::google::protobuf::FeatureSet* FeatureSetDefaults_FeatureSetEditionDefault::unsafe_arena_release_fixed_features() {

@ -78,7 +78,6 @@ namespace protobuf {
namespace { namespace {
bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); } bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); }
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
Message* MaybeForceCopy(Arena* arena, Message* msg) { Message* MaybeForceCopy(Arena* arena, Message* msg) {
if (arena != nullptr || msg == nullptr) return msg; if (arena != nullptr || msg == nullptr) return msg;
@ -87,7 +86,6 @@ Message* MaybeForceCopy(Arena* arena, Message* msg) {
delete msg; delete msg;
return copy; return copy;
} }
#endif // PROTOBUF_FORCE_COPY_IN_RELEASE
} // anonymous namespace } // anonymous namespace
namespace internal { namespace internal {
@ -1546,11 +1544,11 @@ Message* Reflection::ReleaseLast(Message* message,
->ReleaseLast<GenericTypeHandler<Message>>(); ->ReleaseLast<GenericTypeHandler<Message>>();
} }
} }
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (internal::DebugHardenForceCopyInRelease()) {
return MaybeForceCopy(message->GetArena(), released); return MaybeForceCopy(message->GetArena(), released);
#else // PROTOBUF_FORCE_COPY_IN_RELEASE } else {
return released; return released;
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
} }
Message* Reflection::UnsafeArenaReleaseLast( Message* Reflection::UnsafeArenaReleaseLast(
@ -2454,9 +2452,9 @@ Message* Reflection::ReleaseMessage(Message* message,
const FieldDescriptor* field, const FieldDescriptor* field,
MessageFactory* factory) const { MessageFactory* factory) const {
Message* released = UnsafeArenaReleaseMessage(message, field, factory); Message* released = UnsafeArenaReleaseMessage(message, field, factory);
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (internal::DebugHardenForceCopyInRelease()) {
released = MaybeForceCopy(message->GetArena(), released); released = MaybeForceCopy(message->GetArena(), released);
#endif // PROTOBUF_FORCE_COPY_IN_RELEASE }
if (message->GetArena() != nullptr && released != nullptr) { if (message->GetArena() != nullptr && released != nullptr) {
Message* copy_from_arena = released->New(); Message* copy_from_arena = released->New();
copy_from_arena->CopyFrom(*released); copy_from_arena->CopyFrom(*released);

@ -715,15 +715,15 @@ TEST(GeneratedMessageReflectionTest, ReleaseLast) {
(void)expected; // unused in somce configurations (void)expected; // unused in somce configurations
std::unique_ptr<Message> released(message.GetReflection()->ReleaseLast( std::unique_ptr<Message> released(message.GetReflection()->ReleaseLast(
&message, descriptor->FindFieldByName("repeated_foreign_message"))); &message, descriptor->FindFieldByName("repeated_foreign_message")));
#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE if (!internal::DebugHardenForceCopyInRelease()) {
EXPECT_EQ(expected, released.get()); EXPECT_EQ(expected, released.get());
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
} }
TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) { TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) {
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (internal::DebugHardenForceCopyInRelease()) {
GTEST_SKIP() << "Won't work with FORCE_COPY_IN_RELEASE."; GTEST_SKIP() << "Won't work with FORCE_COPY_IN_RELEASE.";
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
unittest::TestAllExtensions message; unittest::TestAllExtensions message;
const Descriptor* descriptor = message.GetDescriptor(); const Descriptor* descriptor = message.GetDescriptor();
@ -1155,9 +1155,9 @@ TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
released = reflection->ReleaseMessage( released = reflection->ReleaseMessage(
&to_message, descriptor->FindFieldByName("foo_lazy_message")); &to_message, descriptor->FindFieldByName("foo_lazy_message"));
EXPECT_TRUE(released != nullptr); EXPECT_TRUE(released != nullptr);
#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE if (!internal::DebugHardenForceCopyInRelease()) {
EXPECT_EQ(&sub_message, released); EXPECT_EQ(&sub_message, released);
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
delete released; delete released;
TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2); TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
@ -1175,9 +1175,9 @@ TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
released = reflection->ReleaseMessage( released = reflection->ReleaseMessage(
&to_message, descriptor->FindFieldByName("foo_message")); &to_message, descriptor->FindFieldByName("foo_message"));
EXPECT_TRUE(released != nullptr); EXPECT_TRUE(released != nullptr);
#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE if (!internal::DebugHardenForceCopyInRelease()) {
EXPECT_EQ(&sub_message2, released); EXPECT_EQ(&sub_message2, released);
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
delete released; delete released;
} }
@ -1298,9 +1298,9 @@ TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) {
&message, descriptor->FindFieldByName("foo_lazy_message")); &message, descriptor->FindFieldByName("foo_lazy_message"));
EXPECT_TRUE(released != nullptr); EXPECT_TRUE(released != nullptr);
#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE if (!internal::DebugHardenForceCopyInRelease()) {
EXPECT_EQ(&sub_message, released); EXPECT_EQ(&sub_message, released);
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
delete released; delete released;
released = reflection->ReleaseMessage( released = reflection->ReleaseMessage(

@ -46,6 +46,7 @@
#include "google/protobuf/map_proto2_unittest.pb.h" #include "google/protobuf/map_proto2_unittest.pb.h"
#include "google/protobuf/map_proto3_unittest.pb.h" #include "google/protobuf/map_proto3_unittest.pb.h"
#include "google/protobuf/message.h" #include "google/protobuf/message.h"
#include "google/protobuf/port.h"
#include "google/protobuf/reflection.h" #include "google/protobuf/reflection.h"
#include "google/protobuf/reflection_ops.h" #include "google/protobuf/reflection_ops.h"
#include "google/protobuf/test_util2.h" #include "google/protobuf/test_util2.h"
@ -3263,9 +3264,9 @@ TEST(GeneratedMapFieldReflectionTest, ReleaseLast) {
std::vector<const Message*> release_last = std::vector<const Message*> release_last =
MapTestUtil::GetMapEntriesFromRelease(&message); MapTestUtil::GetMapEntriesFromRelease(&message);
MapTestUtil::ExpectMapsSize(message, 1); MapTestUtil::ExpectMapsSize(message, 1);
#ifndef PROTOBUF_FORCE_COPY_IN_RELEASE if (!internal::DebugHardenForceCopyInRelease()) {
EXPECT_TRUE(expect_last == release_last); EXPECT_TRUE(expect_last == release_last);
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE }
for (std::vector<const Message*>::iterator it = release_last.begin(); for (std::vector<const Message*>::iterator it = release_last.begin();
it != release_last.end(); ++it) { it != release_last.end(); ++it) {
delete *it; delete *it;

@ -269,6 +269,10 @@ constexpr bool PerformDebugChecks() {
#endif #endif
} }
constexpr bool DebugHardenForceCopyInRelease() {
return false;
}
// Returns true if pointers are 8B aligned, leaving least significant 3 bits // Returns true if pointers are 8B aligned, leaving least significant 3 bits
// available. // available.
inline constexpr bool PtrIsAtLeast8BAligned() { return alignof(void*) >= 8; } inline constexpr bool PtrIsAtLeast8BAligned() { return alignof(void*) >= 8; }

@ -398,10 +398,6 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3),
#define PROTOBUF_RESTRICT #define PROTOBUF_RESTRICT
#endif #endif
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
#error PROTOBUF_FORCE_COPY_IN_RELEASE was previously defined
#endif
#ifdef PROTOBUF_FORCE_COPY_IN_SWAP #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
#error PROTOBUF_FORCE_COPY_IN_SWAP was previously defined #error PROTOBUF_FORCE_COPY_IN_SWAP was previously defined
#endif #endif

@ -41,7 +41,6 @@
#undef PROTOC_EXPORT #undef PROTOC_EXPORT
#undef PROTOBUF_NODISCARD #undef PROTOBUF_NODISCARD
#undef PROTOBUF_RESTRICT #undef PROTOBUF_RESTRICT
#undef PROTOBUF_FORCE_COPY_IN_RELEASE
#undef PROTOBUF_FORCE_COPY_IN_SWAP #undef PROTOBUF_FORCE_COPY_IN_SWAP
#undef PROTOBUF_FORCE_COPY_IN_MOVE #undef PROTOBUF_FORCE_COPY_IN_MOVE
#undef PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG #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. // Now perform a copy if we're on an arena.
Arena* arena = GetArena(); Arena* arena = GetArena();
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (internal::DebugHardenForceCopyInRelease()) {
auto* new_result = copy<TypeHandler>(result); auto* new_result = copy<TypeHandler>(result);
if (arena == nullptr) delete result; if (arena == nullptr) delete result;
#else // PROTOBUF_FORCE_COPY_IN_RELEASE return new_result;
auto* new_result = (arena == nullptr) ? result : copy<TypeHandler>(result); } else {
#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE return (arena == nullptr) ? result : copy<TypeHandler>(result);
return new_result; }
} }
// Releases and returns the last element, but does not do out-of-arena copy. // 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) { if (elements != nullptr) {
Arena* arena = GetArena(); Arena* arena = GetArena();
auto* extracted = data() + start; auto* extracted = data() + start;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE if (internal::DebugHardenForceCopyInRelease()) {
// Always copy. // 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) {
for (int i = 0; i < num; ++i) { for (int i = 0; i < num; ++i) {
elements[i] = copy<TypeHandler>(extracted[i]); elements[i] = copy<TypeHandler>(extracted[i]);
} }
if (arena == nullptr) {
for (int i = 0; i < num; ++i) {
delete extracted[i];
}
}
} else { } 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); CloseGap(start, num);
} }

Loading…
Cancel
Save