35 #include <google/protobuf/generated_message_reflection.h>
40 #include <google/protobuf/stubs/logging.h>
41 #include <google/protobuf/stubs/common.h>
42 #include <google/protobuf/descriptor.pb.h>
43 #include <google/protobuf/descriptor.h>
44 #include <google/protobuf/extension_set.h>
45 #include <google/protobuf/generated_message_util.h>
46 #include <google/protobuf/inlined_string_field.h>
47 #include <google/protobuf/map_field.h>
48 #include <google/protobuf/map_field_inl.h>
49 #include <google/protobuf/stubs/mutex.h>
50 #include <google/protobuf/repeated_field.h>
51 #include <google/protobuf/unknown_field_set.h>
52 #include <google/protobuf/wire_format.h>
53 #include <google/protobuf/stubs/casts.h>
54 #include <google/protobuf/stubs/strutil.h>
58 #include <google/protobuf/port_def.inc>
61 #define GOOGLE_PROTOBUF_HAS_ONEOF
70 using google::protobuf::internal::LazyField;
77 using google::protobuf::internal::WrappedMutex;
85 #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
94 #endif // PROTOBUF_FORCE_COPY_IN_RELEASE
102 if (d ==
nullptr)
return false;
103 *
value = d->number();
128 " Method : google::protobuf::Reflection::"
142 "INVALID_CPPTYPE",
"CPPTYPE_INT32",
"CPPTYPE_INT64",
"CPPTYPE_UINT32",
143 "CPPTYPE_UINT64",
"CPPTYPE_DOUBLE",
"CPPTYPE_FLOAT",
"CPPTYPE_BOOL",
144 "CPPTYPE_ENUM",
"CPPTYPE_STRING",
"CPPTYPE_MESSAGE"};
146 static void ReportReflectionUsageTypeError(
150 <<
"Protocol Buffer reflection usage error:\n"
151 " Method : google::protobuf::Reflection::"
160 " Problem : Field is not the right type for this message:\n"
162 << cpptype_names_[expected_type]
168 static void ReportReflectionUsageEnumTypeError(
172 " Method : google::protobuf::Reflection::"
181 " Problem : Enum value did not match field type:\n"
186 <<
value->full_name();
189 inline void CheckInvalidAccess(
const internal::ReflectionSchema& schema,
195 #define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \
197 ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
198 #define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \
199 USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)
200 #define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \
201 USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)
203 #define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \
204 if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \
205 ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \
206 FieldDescriptor::CPPTYPE_##CPPTYPE)
208 #define USAGE_CHECK_ENUM_VALUE(METHOD) \
209 if (value->type() != field->enum_type()) \
210 ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
212 #define USAGE_CHECK_MESSAGE_TYPE(METHOD) \
213 USAGE_CHECK_EQ(field->containing_type(), descriptor_, METHOD, \
214 "Field does not match message type.");
215 #define USAGE_CHECK_SINGULAR(METHOD) \
216 USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \
217 "Field is repeated; the method requires a singular field.")
218 #define USAGE_CHECK_REPEATED(METHOD) \
219 USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \
220 "Field is singular; the method requires a repeated field.")
222 #define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \
223 USAGE_CHECK_MESSAGE_TYPE(METHOD); \
224 USAGE_CHECK_##LABEL(METHOD); \
225 USAGE_CHECK_TYPE(METHOD, CPPTYPE)
232 const internal::ReflectionSchema& schema,
238 message_factory_(factory),
239 last_non_weak_field_index_(-1) {
240 last_non_weak_field_index_ =
descriptor_->field_count() - 1;
246 UnknownFieldSet::default_instance);
250 return MutableInternalMetadata(
message)
256 return field->is_extension() &&
261 return field->options().lazy();
264 bool Reflection::IsEagerlyVerifiedLazyField(
266 return (
field->type() == FieldDescriptor::TYPE_MESSAGE &&
267 schema_.IsEagerlyVerifiedLazyField(
field));
271 return schema_.IsFieldInlined(
field);
278 size_t total_size = schema_.GetObjectSize();
280 total_size += GetUnknownFields(
message).SpaceUsedExcludingSelfLong();
282 if (schema_.HasExtensionSet()) {
285 for (
int i = 0;
i <= last_non_weak_field_index_;
i++) {
287 if (
field->is_repeated()) {
288 switch (
field->cpp_type()) {
289 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
290 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
291 total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field) \
292 .SpaceUsedExcludingSelfLong(); \
305 case FieldDescriptor::CPPTYPE_STRING:
306 switch (
field->options().ctype()) {
311 .SpaceUsedExcludingSelfLong();
316 case FieldDescriptor::CPPTYPE_MESSAGE:
317 if (IsMapFieldInApi(
field)) {
318 total_size += GetRaw<internal::MapFieldBase>(
message,
field)
319 .SpaceUsedExcludingSelfLong();
334 switch (
field->cpp_type()) {
335 case FieldDescriptor::CPPTYPE_INT32:
336 case FieldDescriptor::CPPTYPE_INT64:
337 case FieldDescriptor::CPPTYPE_UINT32:
338 case FieldDescriptor::CPPTYPE_UINT64:
339 case FieldDescriptor::CPPTYPE_DOUBLE:
340 case FieldDescriptor::CPPTYPE_FLOAT:
341 case FieldDescriptor::CPPTYPE_BOOL:
342 case FieldDescriptor::CPPTYPE_ENUM:
346 case FieldDescriptor::CPPTYPE_STRING: {
347 switch (
field->options().ctype()) {
350 if (IsInlined(
field)) {
352 &GetField<InlinedStringField>(
message,
field).GetNoArena();
365 if (schema_.InRealOneof(
field) ||
366 ptr != DefaultRaw<ArenaStringPtr>(
field).GetPointer()) {
378 case FieldDescriptor::CPPTYPE_MESSAGE:
379 if (schema_.IsDefaultInstance(
message)) {
384 if (sub_message !=
nullptr) {
385 total_size += sub_message->SpaceUsedLong();
397 template <
bool unsafe_shallow_swap>
398 struct OneofFieldMover {
399 template <
typename FromType,
typename ToType>
401 switch (
field->cpp_type()) {
402 case FieldDescriptor::CPPTYPE_INT32:
403 to->SetInt32(
from->GetInt32());
405 case FieldDescriptor::CPPTYPE_INT64:
406 to->SetInt64(
from->GetInt64());
408 case FieldDescriptor::CPPTYPE_UINT32:
409 to->SetUint32(
from->GetUint32());
411 case FieldDescriptor::CPPTYPE_UINT64:
412 to->SetUint64(
from->GetUint64());
414 case FieldDescriptor::CPPTYPE_FLOAT:
415 to->SetFloat(
from->GetFloat());
417 case FieldDescriptor::CPPTYPE_DOUBLE:
418 to->SetDouble(
from->GetDouble());
420 case FieldDescriptor::CPPTYPE_BOOL:
421 to->SetBool(
from->GetBool());
423 case FieldDescriptor::CPPTYPE_ENUM:
424 to->SetEnum(
from->GetEnum());
426 case FieldDescriptor::CPPTYPE_MESSAGE:
427 if (!unsafe_shallow_swap) {
428 to->SetMessage(
from->GetMessage());
430 to->UnsafeSetMessage(
from->UnsafeGetMessage());
433 case FieldDescriptor::CPPTYPE_STRING:
434 if (!unsafe_shallow_swap) {
435 to->SetString(
from->GetString());
438 switch (
field->options().ctype()) {
441 to->SetArenaStringPtr(
from->GetArenaStringPtr());
449 if (unsafe_shallow_swap) {
453 from->ClearOneofCase();
464 template <
bool unsafe_shallow_swap>
469 template <
bool unsafe_shallow_swap>
473 template <
bool unsafe_shallow_swap>
477 template <
bool unsafe_shallow_swap>
481 static void SwapArenaStringPtr(
const std::string* default_ptr,
485 template <
bool unsafe_shallow_swap>
490 template <
bool unsafe_shallow_swap>
499 template <
bool unsafe_shallow_swap>
503 switch (
field->options().ctype()) {
508 if (unsafe_shallow_swap) {
518 template <
bool unsafe_shallow_swap>
528 uint32* lhs_state = &
r->MutableInlinedStringDonatedArray(lhs)[
index / 32];
529 uint32* rhs_state = &
r->MutableInlinedStringDonatedArray(rhs)[
index / 32];
531 if (unsafe_shallow_swap || lhs_arena == rhs_arena) {
532 lhs_string->Swap(rhs_string,
nullptr, lhs_arena,
533 r->IsInlinedStringDonated(*lhs,
field),
534 r->IsInlinedStringDonated(*rhs,
field),
535 lhs_state, rhs_state, mask);
538 lhs_string->Set(
nullptr, rhs_string->
Get(), lhs_arena,
539 r->IsInlinedStringDonated(*lhs,
field), lhs_state, mask);
540 rhs_string->
Set(
nullptr,
temp, rhs_arena,
541 r->IsInlinedStringDonated(*rhs,
field), rhs_state, mask);
545 template <
bool unsafe_shallow_swap>
551 if (unsafe_shallow_swap) {
552 ArenaStringPtr::UnsafeShallowSwap(lhs_string, rhs_string);
554 SwapFieldHelper::SwapArenaStringPtr(
556 lhs_string, lhs->GetArenaForAllocation(),
557 rhs_string, rhs->GetArenaForAllocation());
561 template <
bool unsafe_shallow_swap>
565 switch (
field->options().ctype()) {
568 if (
r->IsInlined(
field)) {
569 SwapFieldHelper::SwapInlinedStrings<unsafe_shallow_swap>(
r, lhs, rhs,
572 SwapFieldHelper::SwapNonInlinedStrings<unsafe_shallow_swap>(
r, lhs, rhs,
580 void SwapFieldHelper::SwapArenaStringPtr(
const std::string* default_ptr,
584 if (lhs_arena == rhs_arena) {
585 ArenaStringPtr::InternalSwap(default_ptr, lhs, lhs_arena, rhs, rhs_arena);
588 }
else if (lhs->
IsDefault(default_ptr)) {
589 lhs->
Set(default_ptr, rhs->
Get(), lhs_arena);
591 rhs->
Destroy(default_ptr, rhs_arena);
593 }
else if (rhs->
IsDefault(default_ptr)) {
594 rhs->
Set(default_ptr, lhs->
Get(), rhs_arena);
596 lhs->
Destroy(default_ptr, lhs_arena);
600 lhs->
Set(default_ptr, rhs->
Get(), lhs_arena);
605 template <
bool unsafe_shallow_swap>
606 void SwapFieldHelper::SwapRepeatedMessageField(
const Reflection*
r,
609 if (IsMapFieldInApi(
field)) {
612 if (unsafe_shallow_swap) {
615 lhs_map->Swap(rhs_map);
620 if (unsafe_shallow_swap) {
628 template <
bool unsafe_shallow_swap>
632 if (unsafe_shallow_swap) {
648 if (*lhs_sub == *rhs_sub)
return;
650 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
651 if (lhs_arena !=
nullptr && lhs_arena == rhs_arena) {
652 #else // PROTOBUF_FORCE_COPY_IN_SWAP
653 if (lhs_arena == rhs_arena) {
654 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
659 if (*lhs_sub !=
nullptr && *rhs_sub !=
nullptr) {
660 (*lhs_sub)->GetReflection()->Swap(*lhs_sub, *rhs_sub);
661 }
else if (*lhs_sub ==
nullptr &&
r->HasBit(*rhs,
field)) {
662 *lhs_sub = (*rhs_sub)->
New(lhs_arena);
664 r->ClearField(rhs,
field);
667 }
else if (*rhs_sub ==
nullptr &&
r->HasBit(*lhs,
field)) {
668 *rhs_sub = (*lhs_sub)->New(rhs_arena);
669 (*rhs_sub)->CopyFrom(**lhs_sub);
670 r->ClearField(lhs,
field);
680 if (
field->is_repeated()) {
681 switch (
field->cpp_type()) {
682 #define SWAP_ARRAYS(CPPTYPE, TYPE) \
683 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
684 MutableRaw<RepeatedField<TYPE> >(message1, field) \
685 ->Swap(MutableRaw<RepeatedField<TYPE> >(message2, field)); \
698 case FieldDescriptor::CPPTYPE_STRING:
699 internal::SwapFieldHelper::SwapRepeatedStringField<false>(
700 this, message1, message2,
field);
702 case FieldDescriptor::CPPTYPE_MESSAGE:
703 internal::SwapFieldHelper::SwapRepeatedMessageField<false>(
704 this, message1, message2,
field);
711 switch (
field->cpp_type()) {
712 #define SWAP_VALUES(CPPTYPE, TYPE) \
713 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
714 std::swap(*MutableRaw<TYPE>(message1, field), \
715 *MutableRaw<TYPE>(message2, field)); \
727 case FieldDescriptor::CPPTYPE_MESSAGE:
728 internal::SwapFieldHelper::SwapMessageField<false>(
this, message1,
732 case FieldDescriptor::CPPTYPE_STRING:
733 internal::SwapFieldHelper::SwapStringField<false>(
this, message1,
745 if (!
field->is_repeated()) {
746 if (
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
747 internal::SwapFieldHelper::SwapMessageField<true>(
this, message1,
749 }
else if (
field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
750 internal::SwapFieldHelper::SwapStringField<true>(
this, message1, message2,
753 SwapField(message1, message2,
field);
758 switch (
field->cpp_type()) {
759 #define SHALLOW_SWAP_ARRAYS(CPPTYPE, TYPE) \
760 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
761 MutableRaw<RepeatedField<TYPE>>(message1, field) \
762 ->InternalSwap(MutableRaw<RepeatedField<TYPE>>(message2, field)); \
773 #undef SHALLOW_SWAP_ARRAYS
775 case FieldDescriptor::CPPTYPE_STRING:
776 internal::SwapFieldHelper::SwapRepeatedStringField<true>(
this, message1,
779 case FieldDescriptor::CPPTYPE_MESSAGE:
780 internal::SwapFieldHelper::SwapRepeatedMessageField<true>(
781 this, message1, message2,
field);
793 template <
bool unsafe_shallow_swap>
797 struct LocalVarWrapper {
798 #define LOCAL_VAR_ACCESSOR(type, var, name) \
799 type Get##name() const { return oneof_val.type_##var; } \
800 void Set##name(type v) { oneof_val.type_##var = v; }
814 Message* UnsafeGetMessage()
const {
return GetMessage(); }
815 void UnsafeSetMessage(
Message*
v) { SetMessage(
v); }
816 void ClearOneofCase() {}
836 struct MessageWrapper {
837 #define MESSAGE_FIELD_ACCESSOR(type, var, name) \
838 type Get##name() const { \
839 return reflection->GetField<type>(*message, field); \
841 void Set##name(type v) { reflection->SetField<type>(message, field, v); }
864 Message* UnsafeGetMessage()
const {
865 return reflection->UnsafeArenaReleaseMessage(
message,
field);
868 reflection->UnsafeArenaSetAllocatedMessage(
message,
v,
field);
870 void ClearOneofCase() {
871 *reflection->MutableOneofCase(
message,
field->containing_oneof()) = 0;
880 uint32 oneof_case_lhs = GetOneofCase(*lhs, oneof_descriptor);
881 uint32 oneof_case_rhs = GetOneofCase(*rhs, oneof_descriptor);
883 LocalVarWrapper
temp;
884 MessageWrapper lhs_wrapper, rhs_wrapper;
886 OneofFieldMover<unsafe_shallow_swap> mover;
888 if (oneof_case_lhs > 0) {
889 field_lhs =
descriptor_->FindFieldByNumber(oneof_case_lhs);
890 lhs_wrapper = {
this, lhs, field_lhs};
891 mover(field_lhs, &lhs_wrapper, &
temp);
894 if (oneof_case_rhs > 0) {
896 lhs_wrapper = {
this, lhs, f};
897 rhs_wrapper = {
this, rhs, f};
898 mover(f, &rhs_wrapper, &lhs_wrapper);
899 }
else if (!unsafe_shallow_swap) {
900 ClearOneof(lhs, oneof_descriptor);
903 if (oneof_case_lhs > 0) {
904 rhs_wrapper = {
this, rhs, field_lhs};
905 mover(field_lhs, &
temp, &rhs_wrapper);
906 }
else if (!unsafe_shallow_swap) {
907 ClearOneof(rhs, oneof_descriptor);
910 if (unsafe_shallow_swap) {
911 *MutableOneofCase(lhs, oneof_descriptor) = oneof_case_rhs;
912 *MutableOneofCase(rhs, oneof_descriptor) = oneof_case_lhs;
917 if (message1 == message2)
return;
921 <<
"First argument to Swap() (of type \""
923 <<
"\") is not compatible with this reflection object (which is for type "
926 <<
"\"). Note that the exact same class is required; not just the same "
929 <<
"Second argument to Swap() (of type \""
931 <<
"\") is not compatible with this reflection object (which is for type "
934 <<
"\"). Note that the exact same class is required; not just the same "
939 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
942 #else // PROTOBUF_FORCE_COPY_IN_SWAP
944 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
948 if (
arena ==
nullptr) {
954 temp->MergeFrom(*message2);
956 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
959 #else // PROTOBUF_FORCE_COPY_IN_SWAP
961 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
967 UnsafeArenaSwap(message1, message2);
970 template <
bool unsafe_shallow_swap>
971 void Reflection::SwapFieldsImpl(
973 const std::vector<const FieldDescriptor*>&
fields)
const {
974 if (message1 == message2)
return;
978 <<
"First argument to SwapFields() (of type \""
980 <<
"\") is not compatible with this reflection object (which is for type "
983 <<
"\"). Note that the exact same class is required; not just the same "
986 <<
"Second argument to SwapFields() (of type \""
988 <<
"\") is not compatible with this reflection object (which is for type "
991 <<
"\"). Note that the exact same class is required; not just the same "
994 std::set<int> swapped_oneof;
1002 CheckInvalidAccess(schema_,
field);
1003 if (
field->is_extension()) {
1004 if (unsafe_shallow_swap) {
1005 MutableExtensionSet(message1)->UnsafeShallowSwapExtension(
1006 MutableExtensionSet(message2),
field->number());
1008 MutableExtensionSet(message1)->SwapExtension(
1009 prototype, MutableExtensionSet(message2),
field->number());
1012 if (schema_.InRealOneof(
field)) {
1013 int oneof_index =
field->containing_oneof()->index();
1015 if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) {
1018 swapped_oneof.insert(oneof_index);
1019 SwapOneofField<unsafe_shallow_swap>(message1, message2,
1020 field->containing_oneof());
1023 if (unsafe_shallow_swap) {
1024 UnsafeShallowSwapField(message1, message2,
field);
1026 SwapField(message1, message2,
field);
1031 if (!
field->is_repeated()) {
1032 SwapBit(message1, message2,
field);
1039 void Reflection::SwapFields(
1041 const std::vector<const FieldDescriptor*>&
fields)
const {
1042 SwapFieldsImpl<false>(message1, message2,
fields);
1045 void Reflection::UnsafeShallowSwapFields(
1047 const std::vector<const FieldDescriptor*>&
fields)
const {
1048 SwapFieldsImpl<true>(message1, message2,
fields);
1051 void Reflection::UnsafeArenaSwapFields(
1053 const std::vector<const FieldDescriptor*>&
fields)
const {
1055 UnsafeShallowSwapFields(lhs, rhs,
fields);
1064 CheckInvalidAccess(schema_,
field);
1066 if (
field->is_extension()) {
1069 if (schema_.InRealOneof(
field)) {
1078 if (lhs == rhs)
return;
1080 MutableInternalMetadata(lhs)->InternalSwap(MutableInternalMetadata(rhs));
1082 for (
int i = 0;
i <= last_non_weak_field_index_;
i++) {
1084 if (schema_.InRealOneof(
field))
continue;
1085 if (schema_.IsFieldStripped(
field))
continue;
1086 UnsafeShallowSwapField(lhs, rhs,
field);
1088 const int oneof_decl_count =
descriptor_->oneof_decl_count();
1089 for (
int i = 0;
i < oneof_decl_count;
i++) {
1092 SwapOneofField<true>(lhs, rhs, oneof);
1098 if (schema_.HasHasbits()) {
1099 uint32* lhs_has_bits = MutableHasBits(lhs);
1100 uint32* rhs_has_bits = MutableHasBits(rhs);
1102 int fields_with_has_bits = 0;
1105 if (
field->is_repeated() || schema_.InRealOneof(
field)) {
1108 fields_with_has_bits++;
1111 int has_bits_size = (fields_with_has_bits + 31) / 32;
1113 for (
int i = 0;
i < has_bits_size;
i++) {
1118 if (schema_.HasExtensionSet()) {
1119 MutableExtensionSet(lhs)->InternalSwap(MutableExtensionSet(rhs));
1127 CheckInvalidAccess(schema_,
field);
1129 if (
field->is_extension()) {
1132 switch (
field->cpp_type()) {
1133 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1134 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
1135 return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
1147 case FieldDescriptor::CPPTYPE_STRING:
1148 case FieldDescriptor::CPPTYPE_MESSAGE:
1149 if (IsMapFieldInApi(
field)) {
1150 const internal::MapFieldBase&
map =
1152 if (
map.IsRepeatedFieldValid()) {
1153 return map.GetRepeatedField().size();
1160 return GetRaw<RepeatedPtrFieldBase>(
message,
field).size();
1172 CheckInvalidAccess(schema_,
field);
1174 if (
field->is_extension()) {
1175 MutableExtensionSet(
message)->ClearExtension(
field->number());
1176 }
else if (!
field->is_repeated()) {
1177 if (schema_.InRealOneof(
field)) {
1185 switch (
field->cpp_type()) {
1186 #define CLEAR_TYPE(CPPTYPE, TYPE) \
1187 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
1188 *MutableRaw<TYPE>(message, field) = field->default_value_##TYPE(); \
1200 case FieldDescriptor::CPPTYPE_ENUM:
1202 field->default_value_enum()->number();
1205 case FieldDescriptor::CPPTYPE_STRING: {
1206 switch (
field->options().ctype()) {
1209 if (IsInlined(
field)) {
1212 MutableRaw<InlinedStringField>(
message,
field)->ClearToEmpty();
1216 DefaultRaw<ArenaStringPtr>(
field).GetPointer();
1218 ->SetAllocated(default_ptr,
nullptr,
1219 message->GetArenaForAllocation());
1226 case FieldDescriptor::CPPTYPE_MESSAGE:
1227 if (schema_.HasBitIndex(
field) ==
static_cast<uint32_t>(-1)) {
1230 if (
message->GetArenaForAllocation() ==
nullptr) {
1241 switch (
field->cpp_type()) {
1242 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1243 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
1244 MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear(); \
1257 case FieldDescriptor::CPPTYPE_STRING: {
1258 switch (
field->options().ctype()) {
1267 case FieldDescriptor::CPPTYPE_MESSAGE: {
1268 if (IsMapFieldInApi(
field)) {
1286 CheckInvalidAccess(schema_,
field);
1288 if (
field->is_extension()) {
1289 MutableExtensionSet(
message)->RemoveLast(
field->number());
1291 switch (
field->cpp_type()) {
1292 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1293 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
1294 MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast(); \
1307 case FieldDescriptor::CPPTYPE_STRING:
1308 switch (
field->options().ctype()) {
1311 MutableRaw<RepeatedPtrField<std::string> >(
message,
field)
1317 case FieldDescriptor::CPPTYPE_MESSAGE:
1318 if (IsMapFieldInApi(
field)) {
1320 ->MutableRepeatedField()
1334 CheckInvalidAccess(schema_,
field);
1337 if (
field->is_extension()) {
1338 released =
static_cast<Message*
>(
1339 MutableExtensionSet(
message)->ReleaseLast(
field->number()));
1341 if (IsMapFieldInApi(
field)) {
1343 ->MutableRepeatedField()
1346 released = MutableRaw<RepeatedPtrFieldBase>(
message,
field)
1350 #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
1351 return MaybeForceCopy(
message->GetArenaForAllocation(), released);
1352 #else // PROTOBUF_FORCE_COPY_IN_RELEASE
1354 #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE
1360 CheckInvalidAccess(schema_,
field);
1362 if (
field->is_extension()) {
1364 MutableExtensionSet(
message)->UnsafeArenaReleaseLast(
field->number()));
1366 if (IsMapFieldInApi(
field)) {
1368 ->MutableRepeatedField()
1371 return MutableRaw<RepeatedPtrFieldBase>(
message,
field)
1378 int index1,
int index2)
const {
1381 CheckInvalidAccess(schema_,
field);
1383 if (
field->is_extension()) {
1384 MutableExtensionSet(
message)->SwapElements(
field->number(), index1, index2);
1386 switch (
field->cpp_type()) {
1387 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1388 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
1389 MutableRaw<RepeatedField<LOWERCASE> >(message, field) \
1390 ->SwapElements(index1, index2); \
1403 case FieldDescriptor::CPPTYPE_STRING:
1404 case FieldDescriptor::CPPTYPE_MESSAGE:
1405 if (IsMapFieldInApi(
field)) {
1407 ->MutableRepeatedField()
1408 ->SwapElements(index1, index2);
1411 ->SwapElements(index1, index2);
1420 struct FieldNumberSorter {
1423 return left->number() < right->number();
1427 bool IsIndexInHasBitSet(
const uint32_t* has_bit_set,
uint32_t has_bit_index) {
1429 return ((has_bit_set[has_bit_index / 32] >> (has_bit_index % 32)) &
1440 bool open_enum =
false;
1446 void Reflection::ListFieldsMayFailOnStripped(
1448 std::vector<const FieldDescriptor*>*
output)
const {
1452 if (schema_.IsDefaultInstance(
message))
return;
1460 schema_.HasHasbits() ? GetHasBits(
message) :
nullptr;
1461 const uint32_t*
const has_bits_indices = schema_.has_bit_indices_;
1463 const int last_non_weak_field_index = last_non_weak_field_index_;
1464 for (
int i = 0;
i <= last_non_weak_field_index;
i++) {
1466 if (!should_fail && schema_.IsFieldStripped(
field)) {
1469 if (
field->is_repeated()) {
1475 if (schema_.InRealOneof(
field)) {
1476 const uint32_t*
const oneof_case_array =
1477 GetConstPointerAtOffset<uint32_t>(&
message,
1478 schema_.oneof_case_offset_);
1484 }
else if (has_bits && has_bits_indices[
i] !=
static_cast<uint32_t>(-1)) {
1485 CheckInvalidAccess(schema_,
field);
1487 if (IsIndexInHasBitSet(has_bits, has_bits_indices[
i])) {
1495 if (schema_.HasExtensionSet()) {
1501 std::sort(
output->begin(),
output->end(), FieldNumberSorter());
1505 std::vector<const FieldDescriptor*>*
output)
const {
1509 void Reflection::ListFieldsOmitStripped(
1516 #undef DEFINE_PRIMITIVE_ACCESSORS
1517 #define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \
1518 PASSTYPE Reflection::Get##TYPENAME(const Message& message, \
1519 const FieldDescriptor* field) const { \
1520 USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \
1521 if (field->is_extension()) { \
1522 return GetExtensionSet(message).Get##TYPENAME( \
1523 field->number(), field->default_value_##PASSTYPE()); \
1524 } else if (schema_.InRealOneof(field) && !HasOneofField(message, field)) { \
1525 return field->default_value_##PASSTYPE(); \
1527 return GetField<TYPE>(message, field); \
1531 void Reflection::Set##TYPENAME( \
1532 Message* message, const FieldDescriptor* field, PASSTYPE value) const { \
1533 USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \
1534 if (field->is_extension()) { \
1535 return MutableExtensionSet(message)->Set##TYPENAME( \
1536 field->number(), field->type(), value, field); \
1538 SetField<TYPE>(message, field, value); \
1542 PASSTYPE Reflection::GetRepeated##TYPENAME( \
1543 const Message& message, const FieldDescriptor* field, int index) const { \
1544 USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \
1545 if (field->is_extension()) { \
1546 return GetExtensionSet(message).GetRepeated##TYPENAME(field->number(), \
1549 return GetRepeatedField<TYPE>(message, field, index); \
1553 void Reflection::SetRepeated##TYPENAME(Message* message, \
1554 const FieldDescriptor* field, \
1555 int index, PASSTYPE value) const { \
1556 USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \
1557 if (field->is_extension()) { \
1558 MutableExtensionSet(message)->SetRepeated##TYPENAME(field->number(), \
1561 SetRepeatedField<TYPE>(message, field, index, value); \
1565 void Reflection::Add##TYPENAME( \
1566 Message* message, const FieldDescriptor* field, PASSTYPE value) const { \
1567 USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \
1568 if (field->is_extension()) { \
1569 MutableExtensionSet(message)->Add##TYPENAME( \
1570 field->number(), field->type(), field->options().packed(), value, \
1573 AddField<TYPE>(message, field, value); \
1584 #undef DEFINE_PRIMITIVE_ACCESSORS
1591 if (
field->is_extension()) {
1593 field->default_value_string());
1596 return field->default_value_string();
1598 switch (
field->options().ctype()) {
1601 if (IsInlined(
field)) {
1602 return GetField<InlinedStringField>(
message,
field).GetNoArena();
1609 return field->default_value_string();
1620 if (
field->is_extension()) {
1622 field->default_value_string());
1625 return field->default_value_string();
1627 switch (
field->options().ctype()) {
1630 if (IsInlined(
field)) {
1631 return GetField<InlinedStringField>(
message,
field).GetNoArena();
1638 return field->default_value_string();
1648 if (
field->is_extension()) {
1649 return MutableExtensionSet(
message)->SetString(
1652 switch (
field->options().ctype()) {
1655 if (IsInlined(
field)) {
1658 &MutableInlinedStringDonatedArray(
message)[
index / 32];
1661 ->Set(
nullptr,
value,
message->GetArenaForAllocation(),
1662 IsInlinedStringDonated(*
message,
field), states, mask);
1671 schema_.InRealOneof(
field)
1673 : DefaultRaw<ArenaStringPtr>(
field).GetPointer();
1677 ->UnsafeSetDefault(default_ptr);
1681 message->GetArenaForAllocation());
1693 if (
field->is_extension()) {
1696 switch (
field->options().ctype()) {
1704 const std::string& Reflection::GetRepeatedStringReference(
1709 if (
field->is_extension()) {
1712 switch (
field->options().ctype()) {
1725 if (
field->is_extension()) {
1729 switch (
field->options().ctype()) {
1743 if (
field->is_extension()) {
1747 switch (
field->options().ctype()) {
1763 return field->enum_type()->FindValueByNumberCreatingIfUnknown(
value);
1771 if (
field->is_extension()) {
1773 field->number(),
field->default_value_enum()->number());
1775 value =
field->default_value_enum()->number();
1796 field->enum_type()->FindValueByNumber(
value);
1797 if (value_desc ==
nullptr) {
1808 if (
field->is_extension()) {
1820 return field->enum_type()->FindValueByNumberCreatingIfUnknown(
value);
1829 if (
field->is_extension()) {
1853 field->enum_type()->FindValueByNumber(
value);
1854 if (value_desc ==
nullptr) {
1865 if (
field->is_extension()) {
1887 field->enum_type()->FindValueByNumber(
value);
1888 if (value_desc ==
nullptr) {
1899 if (
field->is_extension()) {
1910 const Message* Reflection::GetDefaultMessageInstance(
1917 if (message_factory_ == MessageFactory::generated_factory()) {
1918 auto&
ptr =
field->default_generated_instance_;
1919 auto* res =
ptr.load(std::memory_order_acquire);
1920 if (res ==
nullptr) {
1922 res = message_factory_->GetPrototype(
field->message_type());
1923 ptr.store(res, std::memory_order_release);
1933 if (!
field->is_extension() && !
field->options().weak() &&
1934 !IsLazyField(
field) && !schema_.InRealOneof(
field)) {
1935 auto* res = DefaultRaw<const Message*>(
field);
1936 if (res !=
nullptr) {
1941 return message_factory_->GetPrototype(
field->message_type());
1948 CheckInvalidAccess(schema_,
field);
1950 if (factory ==
nullptr) factory = message_factory_;
1952 if (
field->is_extension()) {
1954 field->number(),
field->message_type(), factory));
1957 return *GetDefaultMessageInstance(
field);
1969 MessageFactory* factory)
const {
1971 CheckInvalidAccess(schema_,
field);
1973 if (factory ==
nullptr) factory = message_factory_;
1975 if (
field->is_extension()) {
1977 MutableExtensionSet(
message)->MutableMessage(
field, factory));
1983 if (schema_.InRealOneof(
field)) {
1986 result_holder = MutableField<Message*>(
message,
field);
1987 const Message* default_message = GetDefaultMessageInstance(
field);
1988 *result_holder = default_message->New(
message->GetArenaForAllocation());
1994 if (*result_holder ==
nullptr) {
1995 const Message* default_message = GetDefaultMessageInstance(
field);
1996 *result_holder = default_message->New(
message->GetArenaForAllocation());
2003 void Reflection::UnsafeArenaSetAllocatedMessage(
2007 CheckInvalidAccess(schema_,
field);
2010 if (
field->is_extension()) {
2011 MutableExtensionSet(
message)->UnsafeArenaSetAllocatedMessage(
2014 if (schema_.InRealOneof(
field)) {
2015 if (sub_message ==
nullptr) {
2025 if (sub_message ==
nullptr) {
2031 if (
message->GetArenaForAllocation() ==
nullptr) {
2032 delete *sub_message_holder;
2034 *sub_message_holder = sub_message;
2040 GOOGLE_DCHECK(sub_message ==
nullptr || sub_message->GetOwningArena() ==
nullptr ||
2041 sub_message->GetOwningArena() ==
message->GetArenaForAllocation());
2042 CheckInvalidAccess(schema_,
field);
2047 if (sub_message !=
nullptr &&
2048 sub_message->GetOwningArena() !=
message->GetArenaForAllocation()) {
2049 if (sub_message->GetOwningArena() ==
nullptr &&
2050 message->GetArenaForAllocation() !=
nullptr) {
2054 message->GetArenaForAllocation()->Own(sub_message);
2055 UnsafeArenaSetAllocatedMessage(
message, sub_message,
field);
2061 sub_message_copy->CopyFrom(*sub_message);
2065 UnsafeArenaSetAllocatedMessage(
message, sub_message,
field);
2071 MessageFactory* factory)
const {
2073 CheckInvalidAccess(schema_,
field);
2075 if (factory ==
nullptr) factory = message_factory_;
2077 if (
field->is_extension()) {
2079 MutableExtensionSet(
message)->UnsafeArenaReleaseMessage(
field,
2082 if (!(
field->is_repeated() || schema_.InRealOneof(
field))) {
2085 if (schema_.InRealOneof(
field)) {
2087 *MutableOneofCase(
message,
field->containing_oneof()) = 0;
2101 MessageFactory* factory)
const {
2102 CheckInvalidAccess(schema_,
field);
2105 #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
2106 released = MaybeForceCopy(
message->GetArenaForAllocation(), released);
2107 #endif // PROTOBUF_FORCE_COPY_IN_RELEASE
2108 if (
message->GetArenaForAllocation() !=
nullptr && released !=
nullptr) {
2109 Message* copy_from_arena = released->New();
2110 copy_from_arena->CopyFrom(*released);
2111 released = copy_from_arena;
2120 CheckInvalidAccess(schema_,
field);
2122 if (
field->is_extension()) {
2123 return static_cast<const Message&
>(
2126 if (IsMapFieldInApi(
field)) {
2141 CheckInvalidAccess(schema_,
field);
2143 if (
field->is_extension()) {
2145 MutableExtensionSet(
message)->MutableRepeatedMessage(
field->number(),
2148 if (IsMapFieldInApi(
field)) {
2150 ->MutableRepeatedField()
2153 return MutableRaw<RepeatedPtrFieldBase>(
message,
field)
2160 MessageFactory* factory)
const {
2162 CheckInvalidAccess(schema_,
field);
2164 if (factory ==
nullptr) factory = message_factory_;
2166 if (
field->is_extension()) {
2168 MutableExtensionSet(
message)->AddMessage(
field, factory));
2175 if (IsMapFieldInApi(
field)) {
2177 MutableRaw<MapFieldBase>(
message,
field)->MutableRepeatedField();
2186 prototype = factory->GetPrototype(
field->message_type());
2205 CheckInvalidAccess(schema_,
field);
2207 if (
field->is_extension()) {
2208 MutableExtensionSet(
message)->AddAllocatedMessage(
field, new_entry);
2211 if (IsMapFieldInApi(
field)) {
2213 MutableRaw<MapFieldBase>(
message,
field)->MutableRepeatedField();
2225 CheckInvalidAccess(schema_,
field);
2227 if (
field->is_extension()) {
2228 MutableExtensionSet(
message)->UnsafeArenaAddAllocatedMessage(
field,
2232 if (IsMapFieldInApi(
field)) {
2234 MutableRaw<MapFieldBase>(
message,
field)->MutableRepeatedField();
2244 FieldDescriptor::CppType cpptype,
2249 CheckInvalidAccess(schema_,
field);
2251 if (
field->cpp_type() != cpptype &&
2252 (
field->cpp_type() != FieldDescriptor::CPPTYPE_ENUM ||
2253 cpptype != FieldDescriptor::CPPTYPE_INT32))
2255 "MutableRawRepeatedField", cpptype);
2256 if (
desc !=
nullptr)
2258 if (
field->is_extension()) {
2259 return MutableExtensionSet(
message)->MutableRawRepeatedField(
2263 if (IsMapFieldInApi(
field)) {
2264 return MutableRawNonOneof<MapFieldBase>(
message,
field)
2265 ->MutableRepeatedField();
2271 const void* Reflection::GetRawRepeatedField(
const Message&
message,
2273 FieldDescriptor::CppType cpptype,
2277 if (
field->cpp_type() != cpptype)
2282 if (
desc !=
nullptr)
2284 if (
field->is_extension()) {
2290 ->MutableRawRepeatedField(
field->number(),
field->type(),
2294 if (IsMapFieldInApi(
field)) {
2295 return &(GetRawNonOneof<MapFieldBase>(
message,
field).GetRepeatedField());
2303 if (oneof_descriptor->is_synthetic()) {
2308 if (field_number == 0) {
2311 return descriptor_->FindFieldByNumber(field_number);
2316 const MapKey&
key)
const {
2318 "Field is not a map field.");
2325 MapValueRef* val)
const {
2327 "Field is not a map field.");
2328 val->SetType(
field->message_type()->FindFieldByName(
"value")->cpp_type());
2330 ->InsertOrLookupMapValue(
key, val);
2337 "Field is not a map field.");
2338 val->
SetType(
field->message_type()->FindFieldByName(
"value")->cpp_type());
2345 "Field is not a map field.");
2351 USAGE_CHECK(IsMapFieldInApi(
field),
"MapBegin",
"Field is not a map field.");
2359 USAGE_CHECK(IsMapFieldInApi(
field),
"MapEnd",
"Field is not a map field.");
2367 USAGE_CHECK(IsMapFieldInApi(
field),
"MapSize",
"Field is not a map field.");
2375 if (!schema_.HasExtensionSet())
return nullptr;
2376 return descriptor_pool_->FindExtensionByPrintableName(
descriptor_,
name);
2381 if (!schema_.HasExtensionSet())
return nullptr;
2385 bool Reflection::SupportsUnknownEnumValues()
const {
2395 template <
class Type>
2398 return GetConstRefAtOffset<Type>(
message,
2399 schema_.GetFieldOffsetNonOneof(
field));
2402 template <
class Type>
2405 return GetPointerAtOffset<Type>(
message,
2406 schema_.GetFieldOffsetNonOneof(
field));
2409 template <
typename Type>
2412 return GetPointerAtOffset<Type>(
message, schema_.GetFieldOffset(
field));
2417 return &GetConstRefAtOffset<uint32_t>(
message, schema_.HasBitsOffset());
2422 return GetPointerAtOffset<uint32_t>(
message, schema_.HasBitsOffset());
2425 uint32_t* Reflection::MutableOneofCase(
2428 return GetPointerAtOffset<uint32_t>(
2429 message, schema_.GetOneofCaseOffset(oneof_descriptor));
2433 return GetConstRefAtOffset<ExtensionSet>(
message,
2434 schema_.GetExtensionSetOffset());
2438 return GetPointerAtOffset<ExtensionSet>(
message,
2439 schema_.GetExtensionSetOffset());
2444 return GetConstRefAtOffset<InternalMetadata>(
message,
2445 schema_.GetMetadataOffset());
2449 return GetPointerAtOffset<InternalMetadata>(
message,
2450 schema_.GetMetadataOffset());
2453 const uint32_t* Reflection::GetInlinedStringDonatedArray(
2456 return &GetConstRefAtOffset<uint32_t>(
message,
2457 schema_.InlinedStringDonatedOffset());
2462 return GetPointerAtOffset<uint32_t>(
message,
2463 schema_.InlinedStringDonatedOffset());
2469 return IsIndexInHasBitSet(GetInlinedStringDonatedArray(
message),
2470 schema_.InlinedStringIndex(
field));
2477 if (schema_.HasBitIndex(
field) !=
static_cast<uint32_t>(-1)) {
2478 return IsIndexInHasBitSet(GetHasBits(
message), schema_.HasBitIndex(
field));
2482 CheckInvalidAccess(schema_,
field);
2486 if (
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2487 return !schema_.IsDefaultInstance(
message) &&
2500 switch (
field->cpp_type()) {
2501 case FieldDescriptor::CPPTYPE_STRING:
2502 switch (
field->options().ctype()) {
2504 if (IsInlined(
field)) {
2510 return GetField<ArenaStringPtr>(
message,
field).Get().size() > 0;
2514 case FieldDescriptor::CPPTYPE_BOOL:
2516 case FieldDescriptor::CPPTYPE_INT32:
2518 case FieldDescriptor::CPPTYPE_INT64:
2520 case FieldDescriptor::CPPTYPE_UINT32:
2522 case FieldDescriptor::CPPTYPE_UINT64:
2524 case FieldDescriptor::CPPTYPE_FLOAT:
2525 static_assert(
sizeof(
uint32_t) ==
sizeof(
float),
2526 "Code assumes uint32_t and float are the same size.");
2528 case FieldDescriptor::CPPTYPE_DOUBLE:
2529 static_assert(
sizeof(
uint64_t) ==
sizeof(
double),
2530 "Code assumes uint64_t and double are the same size.");
2532 case FieldDescriptor::CPPTYPE_ENUM:
2534 case FieldDescriptor::CPPTYPE_MESSAGE:
2563 if (!schema_.HasHasbits()) {
2566 bool temp_has_bit = HasBit(*message1,
field);
2567 if (HasBit(*message2,
field)) {
2581 if (oneof_descriptor->is_synthetic()) {
2584 return (GetOneofCase(
message, oneof_descriptor) > 0);
2601 if (oneof_descriptor->is_synthetic()) {
2609 if (oneof_case > 0) {
2611 if (
message->GetArenaForAllocation() ==
nullptr) {
2612 switch (
field->cpp_type()) {
2613 case FieldDescriptor::CPPTYPE_STRING: {
2614 switch (
field->options().ctype()) {
2622 ->Destroy(
nullptr,
message->GetArenaForAllocation());
2629 case FieldDescriptor::CPPTYPE_MESSAGE:
2637 *MutableOneofCase(
message, oneof_descriptor) = 0;
2641 #define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE) \
2643 const RepeatedField<TYPE>& Reflection::GetRepeatedFieldInternal<TYPE>( \
2644 const Message& message, const FieldDescriptor* field) const { \
2645 return *static_cast<RepeatedField<TYPE>*>(MutableRawRepeatedField( \
2646 const_cast<Message*>(&message), field, CPPTYPE, CTYPE, nullptr)); \
2650 RepeatedField<TYPE>* Reflection::MutableRepeatedFieldInternal<TYPE>( \
2651 Message * message, const FieldDescriptor* field) const { \
2652 return static_cast<RepeatedField<TYPE>*>( \
2653 MutableRawRepeatedField(message, field, CPPTYPE, CTYPE, nullptr)); \
2660 HANDLE_TYPE(
float, FieldDescriptor::CPPTYPE_FLOAT, -1);
2661 HANDLE_TYPE(
double, FieldDescriptor::CPPTYPE_DOUBLE, -1);
2662 HANDLE_TYPE(
bool, FieldDescriptor::CPPTYPE_BOOL, -1);
2669 bool is_string)
const {
2672 FieldDescriptor::CPPTYPE_STRING,
2679 template <
typename Type>
2685 template <
typename Type>
2688 bool real_oneof = schema_.InRealOneof(
field);
2696 template <
typename Type>
2704 template <
typename Type>
2711 template <
typename Type>
2718 template <
typename Type>
2725 template <
typename Type>
2734 template <
typename Type>
2740 template <
typename Type>
2748 MessageFactory* Reflection::GetMessageFactory()
const {
2749 return message_factory_;
2758 (
field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
2759 cpp_type == FieldDescriptor::CPPTYPE_INT32))
2760 <<
"The type parameter T in RepeatedFieldRef<T> API doesn't match "
2761 <<
"the actual field type (for enums T should be the generated enum "
2762 <<
"type or int32_t).";
2766 if (
field->is_extension()) {
2767 return MutableExtensionSet(
message)->MutableRawRepeatedField(
2777 "Field is not a map field.");
2784 "Field is not a map field.");
2795 result.default_instance_ = *default_instance;
2806 result.inlined_string_donated_offset_ =
2808 result.inlined_string_indices_ =
2815 class AssignDescriptorsHelper {
2821 const Message*
const* default_instance_data,
2823 : factory_(factory),
2824 file_level_metadata_(file_level_metadata),
2825 file_level_enum_descriptors_(file_level_enum_descriptors),
2827 default_instance_data_(default_instance_data),
2828 offsets_(offsets) {}
2832 AssignMessageDescriptor(
descriptor->nested_type(
i));
2835 file_level_metadata_->descriptor =
descriptor;
2837 file_level_metadata_->reflection =
2839 MigrationToReflectionSchema(default_instance_data_,
2840 offsets_, *schemas_),
2841 DescriptorPool::internal_generated_pool(), factory_);
2846 default_instance_data_++;
2847 file_level_metadata_++;
2852 file_level_enum_descriptors_++;
2862 const Message*
const* default_instance_data_;
2871 struct MetadataOwner {
2875 delete m->reflection;
2886 static MetadataOwner* Instance() {
2892 MetadataOwner() =
default;
2922 int num_deps =
table->num_deps;
2923 for (
int i = 0;
i < num_deps;
i++) {
2931 DescriptorPool::internal_generated_pool()->FindFileByName(
2935 MessageFactory* factory = MessageFactory::generated_factory();
2937 AssignDescriptorsHelper helper(
2938 factory,
table->file_level_metadata,
table->file_level_enum_descriptors,
2941 for (
int i = 0;
i <
file->message_type_count();
i++) {
2942 helper.AssignMessageDescriptor(
file->message_type(i));
2945 for (
int i = 0;
i <
file->enum_type_count();
i++) {
2946 helper.AssignEnumDescriptor(
file->enum_type(i));
2948 if (
file->options().cc_generic_services()) {
2949 for (
int i = 0;
i <
file->service_count();
i++) {
2950 table->file_level_service_descriptors[
i] =
file->service(i);
2953 MetadataOwner::Instance()->AddArray(
table->file_level_metadata,
2954 helper.GetCurrentMetadataPtr());
2963 int num_deps =
table->num_deps;
2964 for (
int i = 0;
i < num_deps;
i++) {
2970 DescriptorPool::InternalAddGeneratedFile(
table->descriptor,
table->size);
2971 MessageFactory::InternalRegisterGeneratedFile(
table);
2979 if (
table->is_initialized)
return;
2980 table->is_initialized =
true;
2981 AddDescriptorsImpl(
table);
2989 for (
int i = 0;
i <
size;
i++) {
2990 const Reflection* reflection = file_level_metadata[
i].reflection;
2991 MessageFactory::InternalRegisterGeneratedMessage(
2993 reflection->schema_.default_instance_);
3004 AssignDescriptorsImpl(t, t->is_eager);
3011 if (!eager) eager =
table->is_eager;
3029 if (
metadata->have_unknown_fields()) {
3030 internal::WireFormat::SerializeUnknownFields(
3032 UnknownFieldSet::default_instance),
3041 #include <google/protobuf/port_undef.inc>