aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler
diff options
context:
space:
mode:
authorGravatar Jisi Liu <jisi.liu@gmail.com>2016-09-23 11:17:00 -0700
committerGravatar Bo Yang <teboring@google.com>2016-10-10 11:44:21 -0700
commit4cf072248fc39d1c63dcb1600ff9e73df8757779 (patch)
tree0eff71b46678e988703a06e96d3a00681debd453 /src/google/protobuf/compiler
parentf9f3c35eb36b208d99a85a21c05767dfd36f2968 (diff)
Fix default instance destructor
Diffstat (limited to 'src/google/protobuf/compiler')
-rw-r--r--src/google/protobuf/compiler/cpp/cpp_message.cc15
-rw-r--r--src/google/protobuf/compiler/plugin.pb.cc3
2 files changed, 18 insertions, 0 deletions
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc
index f5648663..f3dd8067 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message.cc
@@ -1815,6 +1815,9 @@ GenerateDefaultInstanceInitializer(io::Printer* printer) {
void MessageGenerator::
GenerateShutdownCode(io::Printer* printer) {
+ printer->Print(
+ "$classname$::default_instance_.Shutdown();\n",
+ "classname", classname_);
if (HasDescriptorMethods(descriptor_->file(), options_)) {
if (descriptor_->oneof_decl_count() > 0) {
printer->Print(
@@ -2151,6 +2154,7 @@ GenerateSharedDestructorCode(io::Printer* printer) {
// TODO(kenton): If we make unset messages point at default instances
// instead of NULL, then it would make sense to move this code into
// MessageFieldGenerator::GenerateDestructorCode().
+ bool need_delete_message_field = false;
for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor* field = descriptor_->field(i);
@@ -2158,10 +2162,21 @@ GenerateSharedDestructorCode(io::Printer* printer) {
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
// Skip oneof members
if (!field->containing_oneof()) {
+ if (!need_delete_message_field) {
+ need_delete_message_field = true;
+ printer->Print(
+ "if (this != &default_instance_.get()) {\n");
+ printer->Indent();
+ }
printer->Print("delete $name$_;\n", "name", FieldName(field));
}
}
}
+ if (need_delete_message_field) {
+ printer->Outdent();
+ printer->Print(
+ "}\n");
+ }
printer->Outdent();
printer->Print(
diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc
index 1c19d46a..4fc7c432 100644
--- a/src/google/protobuf/compiler/plugin.pb.cc
+++ b/src/google/protobuf/compiler/plugin.pb.cc
@@ -114,8 +114,11 @@ void protobuf_RegisterTypes(const ::std::string&) {
} // namespace
void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+ CodeGeneratorRequest::default_instance_.Shutdown();
delete CodeGeneratorRequest_reflection_;
+ CodeGeneratorResponse::default_instance_.Shutdown();
delete CodeGeneratorResponse_reflection_;
+ CodeGeneratorResponse_File::default_instance_.Shutdown();
delete CodeGeneratorResponse_File_reflection_;
}