Removed all use of STLDelete*() in ObjC and C# Generators.

Other languages will have this removed inside Google first.
These functions are subject to ADL and cause problems.
pull/6274/head
Joshua Haberman 6 years ago
parent f2a919f58f
commit f98b3401bf
  1. 22
      src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
  2. 67
      src/google/protobuf/compiler/objectivec/objectivec_file.cc
  3. 6
      src/google/protobuf/compiler/objectivec/objectivec_file.h
  4. 127
      src/google/protobuf/compiler/objectivec/objectivec_message.cc
  5. 8
      src/google/protobuf/compiler/objectivec/objectivec_message.h

@ -77,23 +77,19 @@ class MockErrorCollector : public MultiFileErrorCollector {
class MockGeneratorContext : public GeneratorContext { class MockGeneratorContext : public GeneratorContext {
public: public:
MockGeneratorContext() {}
~MockGeneratorContext() {
STLDeleteValues(&files_);
}
void ExpectFileMatches(const string& virtual_filename, void ExpectFileMatches(const string& virtual_filename,
const string& physical_filename) { const string& physical_filename) {
string* expected_contents = FindPtrOrNull(files_, virtual_filename); auto it = files_.find(virtual_filename);
ASSERT_TRUE(expected_contents != NULL) ASSERT_TRUE(it != files_.end())
<< "Generator failed to generate file: " << virtual_filename; << "Generator failed to generate file: " << virtual_filename;
string expected_contents = *it->second;
string actual_contents; string actual_contents;
GOOGLE_CHECK_OK( GOOGLE_CHECK_OK(
File::GetContentsAsText(TestSourceDir() + "/" + physical_filename, File::GetContentsAsText(TestSourceDir() + "/" + physical_filename,
&actual_contents, true)) &actual_contents, true))
<< "Unable to get " << physical_filename; << "Unable to get " << physical_filename;
EXPECT_TRUE(actual_contents == *expected_contents) EXPECT_TRUE(actual_contents == expected_contents)
<< physical_filename << " needs to be regenerated. Please run " << physical_filename << " needs to be regenerated. Please run "
"generate_descriptor_proto.sh. Then add this file " "generate_descriptor_proto.sh. Then add this file "
"to your CL."; "to your CL.";
@ -102,15 +98,13 @@ class MockGeneratorContext : public GeneratorContext {
// implements GeneratorContext -------------------------------------- // implements GeneratorContext --------------------------------------
virtual io::ZeroCopyOutputStream* Open(const string& filename) { virtual io::ZeroCopyOutputStream* Open(const string& filename) {
string** map_slot = &files_[filename]; auto& map_slot = files_[filename];
delete *map_slot; map_slot.reset(new std::string);
*map_slot = new string; return new io::StringOutputStream(map_slot.get());
return new io::StringOutputStream(*map_slot);
} }
private: private:
std::map<string, string*> files_; std::map<std::string, std::unique_ptr<std::string>> files_;
}; };
class GenerateAndTest { class GenerateAndTest {

@ -192,27 +192,21 @@ FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options)
options_(options) { options_(options) {
for (int i = 0; i < file_->enum_type_count(); i++) { for (int i = 0; i < file_->enum_type_count(); i++) {
EnumGenerator *generator = new EnumGenerator(file_->enum_type(i)); EnumGenerator *generator = new EnumGenerator(file_->enum_type(i));
enum_generators_.push_back(generator); enum_generators_.emplace_back(generator);
} }
for (int i = 0; i < file_->message_type_count(); i++) { for (int i = 0; i < file_->message_type_count(); i++) {
MessageGenerator *generator = MessageGenerator *generator =
new MessageGenerator(root_class_name_, file_->message_type(i), options_); new MessageGenerator(root_class_name_, file_->message_type(i), options_);
message_generators_.push_back(generator); message_generators_.emplace_back(generator);
} }
for (int i = 0; i < file_->extension_count(); i++) { for (int i = 0; i < file_->extension_count(); i++) {
ExtensionGenerator *generator = ExtensionGenerator *generator =
new ExtensionGenerator(root_class_name_, file_->extension(i)); new ExtensionGenerator(root_class_name_, file_->extension(i));
extension_generators_.push_back(generator); extension_generators_.emplace_back(generator);
} }
} }
FileGenerator::~FileGenerator() { FileGenerator::~FileGenerator() {}
STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end());
STLDeleteContainerPointers(message_generators_.begin(),
message_generators_.end());
STLDeleteContainerPointers(extension_generators_.begin(),
extension_generators_.end());
}
void FileGenerator::GenerateHeader(io::Printer *printer) { void FileGenerator::GenerateHeader(io::Printer *printer) {
std::set<string> headers; std::set<string> headers;
@ -270,9 +264,8 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"\n"); "\n");
std::set<string> fwd_decls; std::set<string> fwd_decls;
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->DetermineForwardDeclarations(&fwd_decls);
(*iter)->DetermineForwardDeclarations(&fwd_decls);
} }
for (std::set<string>::const_iterator i(fwd_decls.begin()); for (std::set<string>::const_iterator i(fwd_decls.begin());
i != fwd_decls.end(); ++i) { i != fwd_decls.end(); ++i) {
@ -287,14 +280,12 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"\n"); "\n");
// need to write out all enums first // need to write out all enums first
for (std::vector<EnumGenerator *>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateHeader(printer);
(*iter)->GenerateHeader(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateEnumHeader(printer);
(*iter)->GenerateEnumHeader(printer);
} }
// For extensions to chain together, the Root gets created even if there // For extensions to chain together, the Root gets created even if there
@ -323,18 +314,15 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
"@interface $root_class_name$ (DynamicMethods)\n", "@interface $root_class_name$ (DynamicMethods)\n",
"root_class_name", root_class_name_); "root_class_name", root_class_name_);
for (std::vector<ExtensionGenerator *>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateMembersHeader(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateMembersHeader(printer);
} }
printer->Print("@end\n\n"); printer->Print("@end\n\n");
} // extension_generators_.size() > 0 } // extension_generators_.size() > 0
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateMessageHeader(printer);
(*iter)->GenerateMessageHeader(printer);
} }
printer->Print( printer->Print(
@ -403,9 +391,8 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
} }
bool includes_oneof = false; bool includes_oneof = false;
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { if (generator->IncludesOneOfDefinition()) {
if ((*iter)->IncludesOneOfDefinition()) {
includes_oneof = true; includes_oneof = true;
break; break;
} }
@ -456,15 +443,11 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
printer->Print( printer->Print(
"static GPBExtensionDescription descriptions[] = {\n"); "static GPBExtensionDescription descriptions[] = {\n");
printer->Indent(); printer->Indent();
for (std::vector<ExtensionGenerator *>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = for (const auto& generator : message_generators_) {
message_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != message_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
printer->Outdent(); printer->Outdent();
printer->Print( printer->Print(
@ -561,13 +544,11 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
"\n"); "\n");
} }
for (std::vector<EnumGenerator *>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
for (std::vector<MessageGenerator *>::iterator iter = message_generators_.begin(); for (const auto& generator : message_generators_) {
iter != message_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
printer->Print( printer->Print(

@ -65,9 +65,9 @@ class FileGenerator {
string root_class_name_; string root_class_name_;
bool is_bundled_proto_; bool is_bundled_proto_;
std::vector<EnumGenerator*> enum_generators_; std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
std::vector<MessageGenerator*> message_generators_; std::vector<std::unique_ptr<MessageGenerator>> message_generators_;
std::vector<ExtensionGenerator*> extension_generators_; std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
const Options options_; const Options options_;

@ -184,18 +184,18 @@ MessageGenerator::MessageGenerator(const string& root_classname,
GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) { GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) {
for (int i = 0; i < descriptor_->extension_count(); i++) { for (int i = 0; i < descriptor_->extension_count(); i++) {
extension_generators_.push_back( extension_generators_.emplace_back(
new ExtensionGenerator(class_name_, descriptor_->extension(i))); new ExtensionGenerator(class_name_, descriptor_->extension(i)));
} }
for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i)); OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i));
oneof_generators_.push_back(generator); oneof_generators_.emplace_back(generator);
} }
for (int i = 0; i < descriptor_->enum_type_count(); i++) { for (int i = 0; i < descriptor_->enum_type_count(); i++) {
EnumGenerator* generator = new EnumGenerator(descriptor_->enum_type(i)); EnumGenerator* generator = new EnumGenerator(descriptor_->enum_type(i));
enum_generators_.push_back(generator); enum_generators_.emplace_back(generator);
} }
for (int i = 0; i < descriptor_->nested_type_count(); i++) { for (int i = 0; i < descriptor_->nested_type_count(); i++) {
@ -203,32 +203,20 @@ MessageGenerator::MessageGenerator(const string& root_classname,
new MessageGenerator(root_classname_, new MessageGenerator(root_classname_,
descriptor_->nested_type(i), descriptor_->nested_type(i),
options); options);
nested_message_generators_.push_back(generator); nested_message_generators_.emplace_back(generator);
} }
} }
MessageGenerator::~MessageGenerator() { MessageGenerator::~MessageGenerator() {}
STLDeleteContainerPointers(extension_generators_.begin(),
extension_generators_.end());
STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end());
STLDeleteContainerPointers(nested_message_generators_.begin(),
nested_message_generators_.end());
STLDeleteContainerPointers(oneof_generators_.begin(),
oneof_generators_.end());
}
void MessageGenerator::GenerateStaticVariablesInitialization( void MessageGenerator::GenerateStaticVariablesInitialization(
io::Printer* printer) { io::Printer* printer) {
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateStaticVariablesInitialization(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateStaticVariablesInitialization(printer);
} }
} }
@ -241,10 +229,8 @@ void MessageGenerator::DetermineForwardDeclarations(std::set<string>* fwd_decls)
} }
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->DetermineForwardDeclarations(fwd_decls);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->DetermineForwardDeclarations(fwd_decls);
} }
} }
@ -253,10 +239,8 @@ bool MessageGenerator::IncludesOneOfDefinition() const {
return true; return true;
} }
for (std::vector<MessageGenerator*>::const_iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); if (generator->IncludesOneOfDefinition()) {
iter != nested_message_generators_.end(); ++iter) {
if ((*iter)->IncludesOneOfDefinition()) {
return true; return true;
} }
} }
@ -265,40 +249,31 @@ bool MessageGenerator::IncludesOneOfDefinition() const {
} }
void MessageGenerator::GenerateEnumHeader(io::Printer* printer) { void MessageGenerator::GenerateEnumHeader(io::Printer* printer) {
for (std::vector<EnumGenerator*>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateHeader(printer);
(*iter)->GenerateHeader(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateEnumHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateEnumHeader(printer);
} }
} }
void MessageGenerator::GenerateExtensionRegistrationSource( void MessageGenerator::GenerateExtensionRegistrationSource(
io::Printer* printer) { io::Printer* printer) {
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateRegistrationSource(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateRegistrationSource(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateExtensionRegistrationSource(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateExtensionRegistrationSource(printer);
} }
} }
void MessageGenerator::GenerateMessageHeader(io::Printer* printer) { void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
// This a a map entry message, just recurse and do nothing directly. // This a a map entry message, just recurse and do nothing directly.
if (IsMapEntryMessage(descriptor_)) { if (IsMapEntryMessage(descriptor_)) {
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateMessageHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateMessageHeader(printer);
} }
return; return;
} }
@ -325,9 +300,8 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
printer->Print("};\n\n"); printer->Print("};\n\n");
} }
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateCaseEnum(printer);
(*iter)->GenerateCaseEnum(printer);
} }
string message_comments; string message_comments;
@ -366,9 +340,8 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
} }
if (!oneof_generators_.empty()) { if (!oneof_generators_.empty()) {
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateClearFunctionDeclaration(printer);
(*iter)->GenerateClearFunctionDeclaration(printer);
} }
printer->Print("\n"); printer->Print("\n");
} }
@ -376,18 +349,14 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
if (descriptor_->extension_count() > 0) { if (descriptor_->extension_count() > 0) {
printer->Print("@interface $classname$ (DynamicMethods)\n\n", printer->Print("@interface $classname$ (DynamicMethods)\n\n",
"classname", class_name_); "classname", class_name_);
for (std::vector<ExtensionGenerator*>::iterator iter = for (const auto& generator : extension_generators_) {
extension_generators_.begin(); generator->GenerateMembersHeader(printer);
iter != extension_generators_.end(); ++iter) {
(*iter)->GenerateMembersHeader(printer);
} }
printer->Print("@end\n\n"); printer->Print("@end\n\n");
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateMessageHeader(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateMessageHeader(printer);
} }
} }
@ -409,9 +378,8 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
printer->Print("@implementation $classname$\n\n", printer->Print("@implementation $classname$\n\n",
"classname", class_name_); "classname", class_name_);
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GeneratePropertyImplementation(printer);
(*iter)->GeneratePropertyImplementation(printer);
} }
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
@ -447,9 +415,8 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
sizeof_has_storage = 1; sizeof_has_storage = 1;
} }
// Tell all the fields the oneof base. // Tell all the fields the oneof base.
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->SetOneofIndexBase(sizeof_has_storage);
(*iter)->SetOneofIndexBase(sizeof_has_storage);
} }
field_generators_.SetOneofIndexBase(sizeof_has_storage); field_generators_.SetOneofIndexBase(sizeof_has_storage);
// sizeof_has_storage needs enough bits for the single fields that aren't in // sizeof_has_storage needs enough bits for the single fields that aren't in
@ -547,11 +514,9 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
if (oneof_generators_.size() != 0) { if (oneof_generators_.size() != 0) {
printer->Print( printer->Print(
" static const char *oneofs[] = {\n"); " static const char *oneofs[] = {\n");
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { printer->Print(" \"$name$\",\n", "name",
printer->Print( generator->DescriptorName());
" \"$name$\",\n",
"name", (*iter)->DescriptorName());
} }
printer->Print( printer->Print(
" };\n" " };\n"
@ -624,21 +589,17 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
.GenerateCFunctionImplementations(printer); .GenerateCFunctionImplementations(printer);
} }
for (std::vector<OneofGenerator*>::iterator iter = oneof_generators_.begin(); for (const auto& generator : oneof_generators_) {
iter != oneof_generators_.end(); ++iter) { generator->GenerateClearFunctionImplementation(printer);
(*iter)->GenerateClearFunctionImplementation(printer);
} }
} }
for (std::vector<EnumGenerator*>::iterator iter = enum_generators_.begin(); for (const auto& generator : enum_generators_) {
iter != enum_generators_.end(); ++iter) { generator->GenerateSource(printer);
(*iter)->GenerateSource(printer);
} }
for (std::vector<MessageGenerator*>::iterator iter = for (const auto& generator : nested_message_generators_) {
nested_message_generators_.begin(); generator->GenerateSource(printer);
iter != nested_message_generators_.end(); ++iter) {
(*iter)->GenerateSource(printer);
} }
} }

@ -85,10 +85,10 @@ class MessageGenerator {
FieldGeneratorMap field_generators_; FieldGeneratorMap field_generators_;
const string class_name_; const string class_name_;
const string deprecated_attribute_; const string deprecated_attribute_;
std::vector<ExtensionGenerator*> extension_generators_; std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
std::vector<EnumGenerator*> enum_generators_; std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
std::vector<MessageGenerator*> nested_message_generators_; std::vector<std::unique_ptr<MessageGenerator>> nested_message_generators_;
std::vector<OneofGenerator*> oneof_generators_; std::vector<std::unique_ptr<OneofGenerator>> oneof_generators_;
}; };
} // namespace objectivec } // namespace objectivec

Loading…
Cancel
Save