@@ -186,7 +186,8 @@ void ExtensionSet::RegisterMessageExtension(const MessageLite* extendee,
186
186
ExtensionSet::~ExtensionSet () {
187
187
// Deletes all allocated extensions.
188
188
if (arena_ == nullptr ) {
189
- ForEach ([](int /* number */ , Extension& ext) { ext.Free (); });
189
+ ForEach ([](int /* number */ , Extension& ext) { ext.Free (); },
190
+ PrefetchNta{});
190
191
if (PROTOBUF_PREDICT_FALSE (is_large ())) {
191
192
delete map_.large ;
192
193
} else {
@@ -225,7 +226,7 @@ bool ExtensionSet::HasLazy(int number) const {
225
226
226
227
int ExtensionSet::NumExtensions () const {
227
228
int result = 0 ;
228
- ForEach ([&result](int /* number */ , const Extension& ext) {
229
+ ForEachNoPrefetch ([&result](int /* number */ , const Extension& ext) {
229
230
if (!ext.is_cleared ) {
230
231
++result;
231
232
}
@@ -308,6 +309,7 @@ enum { REPEATED_FIELD, OPTIONAL_FIELD };
308
309
ABSL_DCHECK_EQ (cpp_type (extension->type ), \
309
310
WireFormatLite::CPPTYPE_##UPPERCASE); \
310
311
extension->is_repeated = false ; \
312
+ extension->is_pointer = false ; \
311
313
} else { \
312
314
ABSL_DCHECK_TYPE (*extension, OPTIONAL_FIELD, UPPERCASE); \
313
315
} \
@@ -351,6 +353,7 @@ enum { REPEATED_FIELD, OPTIONAL_FIELD };
351
353
ABSL_DCHECK_EQ (cpp_type (extension->type ), \
352
354
WireFormatLite::CPPTYPE_##UPPERCASE); \
353
355
extension->is_repeated = true ; \
356
+ extension->is_pointer = true ; \
354
357
extension->is_packed = packed; \
355
358
extension->ptr .repeated_ ##LOWERCASE##_value = \
356
359
Arena::Create<RepeatedField<LOWERCASE>>(arena_); \
@@ -391,6 +394,7 @@ void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
391
394
// extension.
392
395
if (MaybeNewExtension (number, desc, &extension)) {
393
396
extension->is_repeated = true ;
397
+ extension->is_pointer = true ;
394
398
extension->type = field_type;
395
399
extension->is_packed = packed;
396
400
@@ -487,6 +491,7 @@ void ExtensionSet::SetEnum(int number, FieldType type, int value,
487
491
extension->type = type;
488
492
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_ENUM);
489
493
extension->is_repeated = false ;
494
+ extension->is_pointer = false ;
490
495
} else {
491
496
ABSL_DCHECK_TYPE (*extension, OPTIONAL_FIELD, ENUM);
492
497
}
@@ -522,6 +527,7 @@ void ExtensionSet::AddEnum(int number, FieldType type, bool packed, int value,
522
527
extension->type = type;
523
528
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_ENUM);
524
529
extension->is_repeated = true ;
530
+ extension->is_pointer = true ;
525
531
extension->is_packed = packed;
526
532
extension->ptr .repeated_enum_value =
527
533
Arena::Create<RepeatedField<int >>(arena_);
@@ -554,6 +560,7 @@ std::string* ExtensionSet::MutableString(int number, FieldType type,
554
560
extension->type = type;
555
561
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_STRING);
556
562
extension->is_repeated = false ;
563
+ extension->is_pointer = true ;
557
564
extension->ptr .string_value = Arena::Create<std::string>(arena_);
558
565
} else {
559
566
ABSL_DCHECK_TYPE (*extension, OPTIONAL_FIELD, STRING);
@@ -584,6 +591,7 @@ std::string* ExtensionSet::AddString(int number, FieldType type,
584
591
extension->type = type;
585
592
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_STRING);
586
593
extension->is_repeated = true ;
594
+ extension->is_pointer = true ;
587
595
extension->is_packed = false ;
588
596
extension->ptr .repeated_string_value =
589
597
Arena::Create<RepeatedPtrField<std::string>>(arena_);
@@ -626,6 +634,7 @@ MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
626
634
extension->type = type;
627
635
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_MESSAGE);
628
636
extension->is_repeated = false ;
637
+ extension->is_pointer = true ;
629
638
extension->is_lazy = false ;
630
639
extension->ptr .message_value = prototype.New (arena_);
631
640
extension->is_cleared = false ;
@@ -663,6 +672,7 @@ void ExtensionSet::SetAllocatedMessage(int number, FieldType type,
663
672
extension->type = type;
664
673
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_MESSAGE);
665
674
extension->is_repeated = false ;
675
+ extension->is_pointer = true ;
666
676
extension->is_lazy = false ;
667
677
if (message_arena == arena) {
668
678
extension->ptr .message_value = message;
@@ -707,6 +717,7 @@ void ExtensionSet::UnsafeArenaSetAllocatedMessage(
707
717
extension->type = type;
708
718
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_MESSAGE);
709
719
extension->is_repeated = false ;
720
+ extension->is_pointer = true ;
710
721
extension->is_lazy = false ;
711
722
extension->ptr .message_value = message;
712
723
} else {
@@ -805,6 +816,7 @@ MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
805
816
extension->type = type;
806
817
ABSL_DCHECK_EQ (cpp_type (extension->type ), WireFormatLite::CPPTYPE_MESSAGE);
807
818
extension->is_repeated = true ;
819
+ extension->is_pointer = true ;
808
820
extension->ptr .repeated_message_value =
809
821
Arena::Create<RepeatedPtrField<MessageLite>>(arena_);
810
822
} else {
@@ -920,7 +932,7 @@ void ExtensionSet::SwapElements(int number, int index1, int index2) {
920
932
// ===================================================================
921
933
922
934
void ExtensionSet::Clear () {
923
- ForEach ([](int /* number */ , Extension& ext) { ext.Clear (); });
935
+ ForEach ([](int /* number */ , Extension& ext) { ext.Clear (); }, Prefetch{} );
924
936
}
925
937
926
938
namespace {
@@ -969,9 +981,11 @@ void ExtensionSet::MergeFrom(const MessageLite* extendee,
969
981
other.map_ .large ->end ()));
970
982
}
971
983
}
972
- other.ForEach ([extendee, this , &other](int number, const Extension& ext) {
973
- this ->InternalExtensionMergeFrom (extendee, number, ext, other.arena_ );
974
- });
984
+ other.ForEach (
985
+ [extendee, this , &other](int number, const Extension& ext) {
986
+ this ->InternalExtensionMergeFrom (extendee, number, ext, other.arena_ );
987
+ },
988
+ Prefetch{});
975
989
}
976
990
977
991
void ExtensionSet::InternalExtensionMergeFrom (const MessageLite* extendee,
@@ -987,6 +1001,7 @@ void ExtensionSet::InternalExtensionMergeFrom(const MessageLite* extendee,
987
1001
extension->type = other_extension.type ;
988
1002
extension->is_packed = other_extension.is_packed ;
989
1003
extension->is_repeated = true ;
1004
+ extension->is_pointer = true ;
990
1005
} else {
991
1006
ABSL_DCHECK_EQ (extension->type , other_extension.type );
992
1007
ABSL_DCHECK_EQ (extension->is_packed , other_extension.is_packed );
@@ -1049,6 +1064,7 @@ void ExtensionSet::InternalExtensionMergeFrom(const MessageLite* extendee,
1049
1064
extension->type = other_extension.type ;
1050
1065
extension->is_packed = other_extension.is_packed ;
1051
1066
extension->is_repeated = false ;
1067
+ extension->is_pointer = true ;
1052
1068
if (other_extension.is_lazy ) {
1053
1069
extension->is_lazy = true ;
1054
1070
extension->ptr .lazymessage_value =
@@ -1226,6 +1242,13 @@ const char* ExtensionSet::ParseMessageSetItem(
1226
1242
metadata, ctx);
1227
1243
}
1228
1244
1245
+ bool ExtensionSet::FieldTypeIsPointer (FieldType type) {
1246
+ return type == WireFormatLite::TYPE_STRING ||
1247
+ type == WireFormatLite::TYPE_BYTES ||
1248
+ type == WireFormatLite::TYPE_GROUP ||
1249
+ type == WireFormatLite::TYPE_MESSAGE;
1250
+ }
1251
+
1229
1252
uint8_t * ExtensionSet::_InternalSerializeImpl (
1230
1253
const MessageLite* extendee, int start_field_number, int end_field_number,
1231
1254
uint8_t * target, io::EpsCopyOutputStream* stream) const {
@@ -1252,19 +1275,23 @@ uint8_t* ExtensionSet::InternalSerializeMessageSetWithCachedSizesToArray(
1252
1275
const MessageLite* extendee, uint8_t * target,
1253
1276
io::EpsCopyOutputStream* stream) const {
1254
1277
const ExtensionSet* extension_set = this ;
1255
- ForEach ([&target, extendee, stream, extension_set](int number,
1256
- const Extension& ext) {
1257
- target = ext.InternalSerializeMessageSetItemWithCachedSizesToArray (
1258
- extendee, extension_set, number, target, stream);
1259
- });
1278
+ ForEach (
1279
+ [&target, extendee, stream, extension_set](int number,
1280
+ const Extension& ext) {
1281
+ target = ext.InternalSerializeMessageSetItemWithCachedSizesToArray (
1282
+ extendee, extension_set, number, target, stream);
1283
+ },
1284
+ Prefetch{});
1260
1285
return target;
1261
1286
}
1262
1287
1263
1288
size_t ExtensionSet::ByteSize () const {
1264
1289
size_t total_size = 0 ;
1265
- ForEach ([&total_size](int number, const Extension& ext) {
1266
- total_size += ext.ByteSize (number);
1267
- });
1290
+ ForEach (
1291
+ [&total_size](int number, const Extension& ext) {
1292
+ total_size += ext.ByteSize (number);
1293
+ },
1294
+ Prefetch{});
1268
1295
return total_size;
1269
1296
}
1270
1297
@@ -1932,9 +1959,11 @@ size_t ExtensionSet::Extension::MessageSetItemByteSize(int number) const {
1932
1959
1933
1960
size_t ExtensionSet::MessageSetByteSize () const {
1934
1961
size_t total_size = 0 ;
1935
- ForEach ([&total_size](int number, const Extension& ext) {
1936
- total_size += ext.MessageSetItemByteSize (number);
1937
- });
1962
+ ForEach (
1963
+ [&total_size](int number, const Extension& ext) {
1964
+ total_size += ext.MessageSetItemByteSize (number);
1965
+ },
1966
+ Prefetch{});
1938
1967
return total_size;
1939
1968
}
1940
1969
0 commit comments