From 116cf4a41d42c1d8f0f31ecb950202ca051d6ec2 Mon Sep 17 00:00:00 2001 From: Eric Salo Date: Mon, 6 Mar 2023 10:19:02 -0800 Subject: [PATCH] Automated rollback of commit 8f3ae17b3d248456691334de7a3901003acae387. PiperOrigin-RevId: 514449010 --- src/google/protobuf/descriptor.cc | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index efcd86e358..9827ac1376 100644 --- a/src/google/protobuf/descriptor.cc +++ b/src/google/protobuf/descriptor.cc @@ -8417,18 +8417,7 @@ bool HasPreservingUnknownEnumSemantics(const FieldDescriptor* field) { } bool HasHasbit(const FieldDescriptor* field) { - // This predicate includes proto3 message fields only if they have "optional". - // Foo submsg1 = 1; // HasHasbit() == false - // optional Foo submsg2 = 2; // HasHasbit() == true - // This is slightly odd, as adding "optional" to a singular proto3 field does - // not change the semantics or API. However whenever any field in a message - // has a hasbit, it forces reflection to include hasbit offsets for *all* - // fields, even if almost all of them are set to -1 (no hasbit). So to avoid - // causing a sudden size regression for ~all proto3 messages, we give proto3 - // message fields a hasbit only if "optional" is present. If the user is - // explicitly writing "optional", it is likely they are writing it on - // primitive fields also. - return (field->has_optional_keyword() || field->is_required()) && + return field->has_presence() && !field->real_containing_oneof() && !field->options().weak(); }