|
|
|
@ -479,15 +479,8 @@ typedef std::map<DescriptorIntPair, const FieldDescriptor*> |
|
|
|
|
ExtensionsGroupedByDescriptorMap; |
|
|
|
|
typedef HASH_MAP<string, const SourceCodeInfo_Location*> LocationsByPathMap; |
|
|
|
|
|
|
|
|
|
std::set<string>* allowed_proto3_extendees_ = NULL; |
|
|
|
|
GOOGLE_PROTOBUF_DECLARE_ONCE(allowed_proto3_extendees_init_); |
|
|
|
|
|
|
|
|
|
void DeleteAllowedProto3Extendee() { |
|
|
|
|
delete allowed_proto3_extendees_; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InitAllowedProto3Extendee() { |
|
|
|
|
allowed_proto3_extendees_ = new std::set<string>; |
|
|
|
|
std::set<string>* NewAllowedProto3Extendee() { |
|
|
|
|
auto allowed_proto3_extendees = new std::set<string>; |
|
|
|
|
const char* kOptionNames[] = { |
|
|
|
|
"FileOptions", "MessageOptions", "FieldOptions", "EnumOptions", |
|
|
|
|
"EnumValueOptions", "ServiceOptions", "MethodOptions", "OneofOptions"}; |
|
|
|
@ -495,14 +488,13 @@ void InitAllowedProto3Extendee() { |
|
|
|
|
// descriptor.proto has a different package name in opensource. We allow
|
|
|
|
|
// both so the opensource protocol compiler can also compile internal
|
|
|
|
|
// proto3 files with custom options. See: b/27567912
|
|
|
|
|
allowed_proto3_extendees_->insert(string("google.protobuf.") + |
|
|
|
|
allowed_proto3_extendees->insert(string("google.protobuf.") + |
|
|
|
|
kOptionNames[i]); |
|
|
|
|
// Split the word to trick the opensource processing scripts so they
|
|
|
|
|
// will keep the origial package name.
|
|
|
|
|
allowed_proto3_extendees_->insert(string("proto") + "2." + kOptionNames[i]); |
|
|
|
|
allowed_proto3_extendees->insert(string("proto") + "2." + kOptionNames[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
google::protobuf::internal::OnShutdown(&DeleteAllowedProto3Extendee); |
|
|
|
|
return allowed_proto3_extendees; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Checks whether the extendee type is allowed in proto3.
|
|
|
|
@ -510,9 +502,10 @@ void InitAllowedProto3Extendee() { |
|
|
|
|
// instead of comparing the descriptor directly because the extensions may be
|
|
|
|
|
// defined in a different pool.
|
|
|
|
|
bool AllowedExtendeeInProto3(const string& name) { |
|
|
|
|
::google::protobuf::GoogleOnceInit(&allowed_proto3_extendees_init_, &InitAllowedProto3Extendee); |
|
|
|
|
return allowed_proto3_extendees_->find(name) != |
|
|
|
|
allowed_proto3_extendees_->end(); |
|
|
|
|
static auto allowed_proto3_extendees = |
|
|
|
|
internal::OnShutdownDelete(NewAllowedProto3Extendee()); |
|
|
|
|
return allowed_proto3_extendees->find(name) != |
|
|
|
|
allowed_proto3_extendees->end(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
@ -829,31 +822,10 @@ FileDescriptorTables::FileDescriptorTables() |
|
|
|
|
|
|
|
|
|
FileDescriptorTables::~FileDescriptorTables() {} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
FileDescriptorTables* file_descriptor_tables_ = NULL; |
|
|
|
|
GOOGLE_PROTOBUF_DECLARE_ONCE(file_descriptor_tables_once_init_); |
|
|
|
|
|
|
|
|
|
void DeleteFileDescriptorTables() { |
|
|
|
|
delete file_descriptor_tables_; |
|
|
|
|
file_descriptor_tables_ = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void InitFileDescriptorTables() { |
|
|
|
|
file_descriptor_tables_ = new FileDescriptorTables(); |
|
|
|
|
internal::OnShutdown(&DeleteFileDescriptorTables); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void InitFileDescriptorTablesOnce() { |
|
|
|
|
::google::protobuf::GoogleOnceInit( |
|
|
|
|
&file_descriptor_tables_once_init_, &InitFileDescriptorTables); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
|
inline const FileDescriptorTables& FileDescriptorTables::GetEmptyInstance() { |
|
|
|
|
InitFileDescriptorTablesOnce(); |
|
|
|
|
return *file_descriptor_tables_; |
|
|
|
|
static auto file_descriptor_tables = |
|
|
|
|
internal::OnShutdownDelete(new FileDescriptorTables()); |
|
|
|
|
return *file_descriptor_tables; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DescriptorPool::Tables::AddCheckpoint() { |
|
|
|
@ -1335,42 +1307,28 @@ bool DescriptorPool::InternalIsFileLoaded(const string& filename) const { |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EncodedDescriptorDatabase* generated_database_ = NULL; |
|
|
|
|
DescriptorPool* generated_pool_ = NULL; |
|
|
|
|
GOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_); |
|
|
|
|
|
|
|
|
|
void DeleteGeneratedPool() { |
|
|
|
|
delete generated_database_; |
|
|
|
|
generated_database_ = NULL; |
|
|
|
|
delete generated_pool_; |
|
|
|
|
generated_pool_ = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void InitGeneratedPool() { |
|
|
|
|
generated_database_ = new EncodedDescriptorDatabase; |
|
|
|
|
generated_pool_ = new DescriptorPool(generated_database_); |
|
|
|
|
generated_pool_->InternalSetLazilyBuildDependencies(); |
|
|
|
|
|
|
|
|
|
internal::OnShutdown(&DeleteGeneratedPool); |
|
|
|
|
EncodedDescriptorDatabase* GeneratedDatabase() { |
|
|
|
|
static auto generated_database = |
|
|
|
|
internal::OnShutdownDelete(new EncodedDescriptorDatabase()); |
|
|
|
|
return generated_database; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void InitGeneratedPoolOnce() { |
|
|
|
|
::google::protobuf::GoogleOnceInit(&generated_pool_init_, &InitGeneratedPool); |
|
|
|
|
DescriptorPool* NewGeneratedPool() { |
|
|
|
|
auto generated_pool = new DescriptorPool(GeneratedDatabase()); |
|
|
|
|
generated_pool->InternalSetLazilyBuildDependencies(); |
|
|
|
|
return generated_pool; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
|
const DescriptorPool* DescriptorPool::generated_pool() { |
|
|
|
|
InitGeneratedPoolOnce(); |
|
|
|
|
return generated_pool_; |
|
|
|
|
DescriptorPool* DescriptorPool::internal_generated_pool() { |
|
|
|
|
static DescriptorPool* generated_pool = |
|
|
|
|
internal::OnShutdownDelete(NewGeneratedPool()); |
|
|
|
|
return generated_pool; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DescriptorPool* DescriptorPool::internal_generated_pool() { |
|
|
|
|
InitGeneratedPoolOnce(); |
|
|
|
|
return generated_pool_; |
|
|
|
|
const DescriptorPool* DescriptorPool::generated_pool() { |
|
|
|
|
return internal_generated_pool(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DescriptorPool::InternalAddGeneratedFile( |
|
|
|
@ -1397,8 +1355,7 @@ void DescriptorPool::InternalAddGeneratedFile( |
|
|
|
|
// Therefore, when we parse one, we have to be very careful to avoid using
|
|
|
|
|
// any descriptor-based operations, since this might cause infinite recursion
|
|
|
|
|
// or deadlock.
|
|
|
|
|
InitGeneratedPoolOnce(); |
|
|
|
|
GOOGLE_CHECK(generated_database_->Add(encoded_file_descriptor, size)); |
|
|
|
|
GOOGLE_CHECK(GeneratedDatabase()->Add(encoded_file_descriptor, size)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|