Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Unified Diff: third_party/protobuf/src/google/protobuf/generated_message_reflection.cc

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Update to new HEAD (b7632464b4) + restore GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/protobuf/src/google/protobuf/generated_message_reflection.cc
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_reflection.cc b/third_party/protobuf/src/google/protobuf/generated_message_reflection.cc
index 2313181cc995220fe39ce23236e365b467e05276..6f418433dfd82d2c660ead85b2141b46ba184be9 100644
--- a/third_party/protobuf/src/google/protobuf/generated_message_reflection.cc
+++ b/third_party/protobuf/src/google/protobuf/generated_message_reflection.cc
@@ -173,62 +173,43 @@ static void ReportReflectionUsageEnumTypeError(
// ===================================================================
GeneratedMessageReflection::GeneratedMessageReflection(
- const Descriptor* descriptor,
- const Message* default_instance,
- const int offsets[],
- int has_bits_offset,
- int unknown_fields_offset,
- int extensions_offset,
- const DescriptorPool* descriptor_pool,
- MessageFactory* factory,
- int object_size,
- int arena_offset,
- int is_default_instance_offset)
- : descriptor_ (descriptor),
- default_instance_ (default_instance),
- offsets_ (offsets),
- has_bits_offset_ (has_bits_offset),
- unknown_fields_offset_(unknown_fields_offset),
- extensions_offset_(extensions_offset),
- arena_offset_ (arena_offset),
- is_default_instance_offset_(is_default_instance_offset),
- object_size_ (object_size),
- descriptor_pool_ ((descriptor_pool == NULL) ?
- DescriptorPool::generated_pool() :
- descriptor_pool),
- message_factory_ (factory) {
-}
+ const Descriptor* descriptor, const Message* default_instance,
+ const int offsets[], int has_bits_offset, int unknown_fields_offset,
+ int extensions_offset, const DescriptorPool* descriptor_pool,
+ MessageFactory* factory, int object_size, int arena_offset)
+ : descriptor_(descriptor),
+ default_instance_(default_instance),
+ offsets_(offsets),
+ has_bits_offset_(has_bits_offset),
+ unknown_fields_offset_(unknown_fields_offset),
+ extensions_offset_(extensions_offset),
+ arena_offset_(arena_offset),
+ object_size_(object_size),
+ descriptor_pool_((descriptor_pool == NULL)
+ ? DescriptorPool::generated_pool()
+ : descriptor_pool),
+ message_factory_(factory) {}
GeneratedMessageReflection::GeneratedMessageReflection(
- const Descriptor* descriptor,
- const Message* default_instance,
- const int offsets[],
- int has_bits_offset,
- int unknown_fields_offset,
- int extensions_offset,
- const void* default_oneof_instance,
- int oneof_case_offset,
- const DescriptorPool* descriptor_pool,
- MessageFactory* factory,
- int object_size,
- int arena_offset,
- int is_default_instance_offset)
- : descriptor_ (descriptor),
- default_instance_ (default_instance),
- default_oneof_instance_ (default_oneof_instance),
- offsets_ (offsets),
- has_bits_offset_ (has_bits_offset),
- oneof_case_offset_(oneof_case_offset),
- unknown_fields_offset_(unknown_fields_offset),
- extensions_offset_(extensions_offset),
- arena_offset_ (arena_offset),
- is_default_instance_offset_(is_default_instance_offset),
- object_size_ (object_size),
- descriptor_pool_ ((descriptor_pool == NULL) ?
- DescriptorPool::generated_pool() :
- descriptor_pool),
- message_factory_ (factory) {
-}
+ const Descriptor* descriptor, const Message* default_instance,
+ const int offsets[], int has_bits_offset, int unknown_fields_offset,
+ int extensions_offset, const void* default_oneof_instance,
+ int oneof_case_offset, const DescriptorPool* descriptor_pool,
+ MessageFactory* factory, int object_size, int arena_offset)
+ : descriptor_(descriptor),
+ default_instance_(default_instance),
+ default_oneof_instance_(default_oneof_instance),
+ offsets_(offsets),
+ has_bits_offset_(has_bits_offset),
+ oneof_case_offset_(oneof_case_offset),
+ unknown_fields_offset_(unknown_fields_offset),
+ extensions_offset_(extensions_offset),
+ arena_offset_(arena_offset),
+ object_size_(object_size),
+ descriptor_pool_((descriptor_pool == NULL)
+ ? DescriptorPool::generated_pool()
+ : descriptor_pool),
+ message_factory_(factory) {}
GeneratedMessageReflection::~GeneratedMessageReflection() {}
@@ -1026,6 +1007,11 @@ struct FieldNumberSorter {
return left->number() < right->number();
}
};
+
+inline bool IsIndexInHasBitSet(const uint32* has_bit_set, uint32 index) {
+ return ((has_bit_set[index / 32] >> (index % 32)) & static_cast<uint32>(1))
+ != 0;
+}
} // namespace
void GeneratedMessageReflection::ListFields(
@@ -1036,6 +1022,12 @@ void GeneratedMessageReflection::ListFields(
// Optimization: The default instance never has any fields set.
if (&message == default_instance_) return;
+ // Optimization: Avoid calling GetHasBits() and HasOneofField() many times
+ // within the field loop.
+ const uint32* const has_bits = GetHasBits(message);
+ const uint32* const oneof_case_array = reinterpret_cast<const uint32*>(
+ reinterpret_cast<const uint8*>(&message) + oneof_case_offset_);
+
output->reserve(descriptor_->field_count());
for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor* field = descriptor_->field(i);
@@ -1044,11 +1036,18 @@ void GeneratedMessageReflection::ListFields(
output->push_back(field);
}
} else {
- if (field->containing_oneof()) {
- if (HasOneofField(message, field)) {
+ const OneofDescriptor* containing_oneof = field->containing_oneof();
+ if (containing_oneof) {
+ // Equivalent to: HasOneofField(message, field)
+ if (oneof_case_array[containing_oneof->index()] == field->number()) {
output->push_back(field);
}
- } else if (HasBit(message, field)) {
+ } else if (has_bits) {
+ // Equivalent to: HasBit(message, field)
+ if (IsIndexInHasBitSet(has_bits, i)) {
+ output->push_back(field);
+ }
+ } else if (HasBit(message, field)) { // Fall back on proto3-style HasBit.
output->push_back(field);
}
}
@@ -1579,7 +1578,8 @@ Message* GeneratedMessageReflection::UnsafeArenaReleaseMessage(
if (field->is_extension()) {
return static_cast<Message*>(
- MutableExtensionSet(message)->ReleaseMessage(field, factory));
+ MutableExtensionSet(message)->UnsafeArenaReleaseMessage(field,
+ factory));
} else {
ClearBit(message, field);
if (field->containing_oneof()) {
@@ -2000,12 +2000,7 @@ GeneratedMessageReflection::MutableInternalMetadataWithArena(
inline bool
GeneratedMessageReflection::GetIsDefaultInstance(
const Message& message) const {
- if (is_default_instance_offset_ == kHasNoDefaultInstanceField) {
- return false;
- }
- const void* ptr = reinterpret_cast<const uint8*>(&message) +
- is_default_instance_offset_;
- return *reinterpret_cast<const bool*>(ptr);
+ return &message == default_instance_;
}
// Simple accessors for manipulating has_bits_.
@@ -2062,8 +2057,7 @@ inline bool GeneratedMessageReflection::HasBit(
}
}
}
- return GetHasBits(message)[field->index() / 32] &
- (1 << (field->index() % 32));
+ return IsIndexInHasBitSet(GetHasBits(message), field->index());
}
inline void GeneratedMessageReflection::SetBit(
@@ -2071,7 +2065,9 @@ inline void GeneratedMessageReflection::SetBit(
if (has_bits_offset_ == -1) {
return;
}
- MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));
+ const uint32 index = static_cast<uint32>(field->index());
+ MutableHasBits(message)[index / 32] |=
+ (static_cast<uint32>(1) << (index % 32));
}
inline void GeneratedMessageReflection::ClearBit(
@@ -2079,7 +2075,9 @@ inline void GeneratedMessageReflection::ClearBit(
if (has_bits_offset_ == -1) {
return;
}
- MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
+ const uint32 index = static_cast<uint32>(field->index());
+ MutableHasBits(message)[index / 32] &=
+ ~(static_cast<uint32>(1) << (index % 32));
}
inline void GeneratedMessageReflection::SwapBit(
@@ -2125,7 +2123,7 @@ inline void GeneratedMessageReflection::ClearOneofField(
inline void GeneratedMessageReflection::ClearOneof(
Message* message, const OneofDescriptor* oneof_descriptor) const {
// TODO(jieluo): Consider to cache the unused object instead of deleting
- // it. It will be much faster if an aplication switches a lot from
+ // it. It will be much faster if an application switches a lot from
// a few oneof fields. Time/space tradeoff
uint32 oneof_case = GetOneofCase(*message, oneof_descriptor);
if (oneof_case > 0) {
@@ -2274,19 +2272,11 @@ GeneratedMessageReflection::NewGeneratedMessageReflection(
int object_size,
int arena_offset,
int is_default_instance_offset) {
- return new GeneratedMessageReflection(descriptor,
- default_instance,
- offsets,
- has_bits_offset,
- unknown_fields_offset,
- extensions_offset,
- default_oneof_instance,
- oneof_case_offset,
- DescriptorPool::generated_pool(),
- MessageFactory::generated_factory(),
- object_size,
- arena_offset,
- is_default_instance_offset);
+ return new GeneratedMessageReflection(
+ descriptor, default_instance, offsets, has_bits_offset,
+ unknown_fields_offset, extensions_offset, default_oneof_instance,
+ oneof_case_offset, DescriptorPool::generated_pool(),
+ MessageFactory::generated_factory(), object_size, arena_offset);
}
GeneratedMessageReflection*
@@ -2300,17 +2290,11 @@ GeneratedMessageReflection::NewGeneratedMessageReflection(
int object_size,
int arena_offset,
int is_default_instance_offset) {
- return new GeneratedMessageReflection(descriptor,
- default_instance,
- offsets,
- has_bits_offset,
- unknown_fields_offset,
- extensions_offset,
- DescriptorPool::generated_pool(),
- MessageFactory::generated_factory(),
- object_size,
- arena_offset,
- is_default_instance_offset);
+ return new GeneratedMessageReflection(
+ descriptor, default_instance, offsets, has_bits_offset,
+ unknown_fields_offset, extensions_offset,
+ DescriptorPool::generated_pool(), MessageFactory::generated_factory(),
+ object_size, arena_offset);
}
} // namespace internal

Powered by Google App Engine
This is Rietveld 408576698