Sfoglia il codice sorgente

Fix default instance destructor

Jisi Liu 9 anni fa
parent
commit
f184cb6035

+ 1 - 0
src/google/protobuf/any.pb.cc

@@ -71,6 +71,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fany_2eproto() {
+  Any::default_instance_.Shutdown();
   delete Any_reflection_;
   delete Any_reflection_;
 }
 }
 
 

+ 6 - 1
src/google/protobuf/api.pb.cc

@@ -121,8 +121,11 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fapi_2eproto() {
+  Api::default_instance_.Shutdown();
   delete Api_reflection_;
   delete Api_reflection_;
+  Method::default_instance_.Shutdown();
   delete Method_reflection_;
   delete Method_reflection_;
+  Mixin::default_instance_.Shutdown();
   delete Mixin_reflection_;
   delete Mixin_reflection_;
 }
 }
 
 
@@ -247,7 +250,9 @@ Api::~Api() {
 void Api::SharedDtor() {
 void Api::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   version_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   version_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete source_context_;
+  if (this != &default_instance_.get()) {
+    delete source_context_;
+  }
 }
 }
 
 
 void Api::SetCachedSize(int size) const {
 void Api::SetCachedSize(int size) const {

+ 15 - 0
src/google/protobuf/compiler/cpp/cpp_message.cc

@@ -1815,6 +1815,9 @@ GenerateDefaultInstanceInitializer(io::Printer* printer) {
 
 
 void MessageGenerator::
 void MessageGenerator::
 GenerateShutdownCode(io::Printer* printer) {
 GenerateShutdownCode(io::Printer* printer) {
+  printer->Print(
+      "$classname$::default_instance_.Shutdown();\n",
+      "classname", classname_);
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
   if (HasDescriptorMethods(descriptor_->file(), options_)) {
     if (descriptor_->oneof_decl_count() > 0) {
     if (descriptor_->oneof_decl_count() > 0) {
       printer->Print(
       printer->Print(
@@ -2151,6 +2154,7 @@ GenerateSharedDestructorCode(io::Printer* printer) {
   // TODO(kenton):  If we make unset messages point at default instances
   // TODO(kenton):  If we make unset messages point at default instances
   //   instead of NULL, then it would make sense to move this code into
   //   instead of NULL, then it would make sense to move this code into
   //   MessageFieldGenerator::GenerateDestructorCode().
   //   MessageFieldGenerator::GenerateDestructorCode().
+  bool need_delete_message_field = false;
   for (int i = 0; i < descriptor_->field_count(); i++) {
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     const FieldDescriptor* field = descriptor_->field(i);
 
 
@@ -2158,10 +2162,21 @@ GenerateSharedDestructorCode(io::Printer* printer) {
         field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
         field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       // Skip oneof members
       // Skip oneof members
       if (!field->containing_oneof()) {
       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));
         printer->Print("delete $name$_;\n", "name", FieldName(field));
       }
       }
     }
     }
   }
   }
+  if (need_delete_message_field) {
+    printer->Outdent();
+    printer->Print(
+        "}\n");
+  }
 
 
   printer->Outdent();
   printer->Outdent();
   printer->Print(
   printer->Print(

+ 3 - 0
src/google/protobuf/compiler/plugin.pb.cc

@@ -114,8 +114,11 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
+  CodeGeneratorRequest::default_instance_.Shutdown();
   delete CodeGeneratorRequest_reflection_;
   delete CodeGeneratorRequest_reflection_;
+  CodeGeneratorResponse::default_instance_.Shutdown();
   delete CodeGeneratorResponse_reflection_;
   delete CodeGeneratorResponse_reflection_;
+  CodeGeneratorResponse_File::default_instance_.Shutdown();
   delete CodeGeneratorResponse_File_reflection_;
   delete CodeGeneratorResponse_File_reflection_;
 }
 }
 
 

+ 50 - 9
src/google/protobuf/descriptor.pb.cc

@@ -622,30 +622,55 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() {
+  FileDescriptorSet::default_instance_.Shutdown();
   delete FileDescriptorSet_reflection_;
   delete FileDescriptorSet_reflection_;
+  FileDescriptorProto::default_instance_.Shutdown();
   delete FileDescriptorProto_reflection_;
   delete FileDescriptorProto_reflection_;
+  DescriptorProto::default_instance_.Shutdown();
   delete DescriptorProto_reflection_;
   delete DescriptorProto_reflection_;
+  DescriptorProto_ExtensionRange::default_instance_.Shutdown();
   delete DescriptorProto_ExtensionRange_reflection_;
   delete DescriptorProto_ExtensionRange_reflection_;
+  DescriptorProto_ReservedRange::default_instance_.Shutdown();
   delete DescriptorProto_ReservedRange_reflection_;
   delete DescriptorProto_ReservedRange_reflection_;
+  FieldDescriptorProto::default_instance_.Shutdown();
   delete FieldDescriptorProto_reflection_;
   delete FieldDescriptorProto_reflection_;
+  OneofDescriptorProto::default_instance_.Shutdown();
   delete OneofDescriptorProto_reflection_;
   delete OneofDescriptorProto_reflection_;
+  EnumDescriptorProto::default_instance_.Shutdown();
   delete EnumDescriptorProto_reflection_;
   delete EnumDescriptorProto_reflection_;
+  EnumValueDescriptorProto::default_instance_.Shutdown();
   delete EnumValueDescriptorProto_reflection_;
   delete EnumValueDescriptorProto_reflection_;
+  ServiceDescriptorProto::default_instance_.Shutdown();
   delete ServiceDescriptorProto_reflection_;
   delete ServiceDescriptorProto_reflection_;
+  MethodDescriptorProto::default_instance_.Shutdown();
   delete MethodDescriptorProto_reflection_;
   delete MethodDescriptorProto_reflection_;
+  FileOptions::default_instance_.Shutdown();
   delete FileOptions_reflection_;
   delete FileOptions_reflection_;
+  MessageOptions::default_instance_.Shutdown();
   delete MessageOptions_reflection_;
   delete MessageOptions_reflection_;
+  FieldOptions::default_instance_.Shutdown();
   delete FieldOptions_reflection_;
   delete FieldOptions_reflection_;
+  OneofOptions::default_instance_.Shutdown();
   delete OneofOptions_reflection_;
   delete OneofOptions_reflection_;
+  EnumOptions::default_instance_.Shutdown();
   delete EnumOptions_reflection_;
   delete EnumOptions_reflection_;
+  EnumValueOptions::default_instance_.Shutdown();
   delete EnumValueOptions_reflection_;
   delete EnumValueOptions_reflection_;
+  ServiceOptions::default_instance_.Shutdown();
   delete ServiceOptions_reflection_;
   delete ServiceOptions_reflection_;
+  MethodOptions::default_instance_.Shutdown();
   delete MethodOptions_reflection_;
   delete MethodOptions_reflection_;
+  UninterpretedOption::default_instance_.Shutdown();
   delete UninterpretedOption_reflection_;
   delete UninterpretedOption_reflection_;
+  UninterpretedOption_NamePart::default_instance_.Shutdown();
   delete UninterpretedOption_NamePart_reflection_;
   delete UninterpretedOption_NamePart_reflection_;
+  SourceCodeInfo::default_instance_.Shutdown();
   delete SourceCodeInfo_reflection_;
   delete SourceCodeInfo_reflection_;
+  SourceCodeInfo_Location::default_instance_.Shutdown();
   delete SourceCodeInfo_Location_reflection_;
   delete SourceCodeInfo_Location_reflection_;
+  GeneratedCodeInfo::default_instance_.Shutdown();
   delete GeneratedCodeInfo_reflection_;
   delete GeneratedCodeInfo_reflection_;
+  GeneratedCodeInfo_Annotation::default_instance_.Shutdown();
   delete GeneratedCodeInfo_Annotation_reflection_;
   delete GeneratedCodeInfo_Annotation_reflection_;
 }
 }
 
 
@@ -1231,8 +1256,10 @@ void FileDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
-  delete source_code_info_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+    delete source_code_info_;
+  }
 }
 }
 
 
 void FileDescriptorProto::SetCachedSize(int size) const {
 void FileDescriptorProto::SetCachedSize(int size) const {
@@ -3137,7 +3164,9 @@ DescriptorProto::~DescriptorProto() {
 
 
 void DescriptorProto::SharedDtor() {
 void DescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void DescriptorProto::SetCachedSize(int size) const {
 void DescriptorProto::SetCachedSize(int size) const {
@@ -4380,7 +4409,9 @@ void FieldDescriptorProto::SharedDtor() {
   extendee_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   extendee_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void FieldDescriptorProto::SetCachedSize(int size) const {
 void FieldDescriptorProto::SetCachedSize(int size) const {
@@ -5511,7 +5542,9 @@ OneofDescriptorProto::~OneofDescriptorProto() {
 
 
 void OneofDescriptorProto::SharedDtor() {
 void OneofDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void OneofDescriptorProto::SetCachedSize(int size) const {
 void OneofDescriptorProto::SetCachedSize(int size) const {
@@ -5932,7 +5965,9 @@ EnumDescriptorProto::~EnumDescriptorProto() {
 
 
 void EnumDescriptorProto::SharedDtor() {
 void EnumDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void EnumDescriptorProto::SetCachedSize(int size) const {
 void EnumDescriptorProto::SetCachedSize(int size) const {
@@ -6429,7 +6464,9 @@ EnumValueDescriptorProto::~EnumValueDescriptorProto() {
 
 
 void EnumValueDescriptorProto::SharedDtor() {
 void EnumValueDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void EnumValueDescriptorProto::SetCachedSize(int size) const {
 void EnumValueDescriptorProto::SetCachedSize(int size) const {
@@ -6911,7 +6948,9 @@ ServiceDescriptorProto::~ServiceDescriptorProto() {
 
 
 void ServiceDescriptorProto::SharedDtor() {
 void ServiceDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void ServiceDescriptorProto::SetCachedSize(int size) const {
 void ServiceDescriptorProto::SetCachedSize(int size) const {
@@ -7416,7 +7455,9 @@ void MethodDescriptorProto::SharedDtor() {
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   input_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   input_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   output_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
   output_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
-  delete options_;
+  if (this != &default_instance_.get()) {
+    delete options_;
+  }
 }
 }
 
 
 void MethodDescriptorProto::SetCachedSize(int size) const {
 void MethodDescriptorProto::SetCachedSize(int size) const {

+ 1 - 0
src/google/protobuf/duration.pb.cc

@@ -71,6 +71,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fduration_2eproto() {
+  Duration::default_instance_.Shutdown();
   delete Duration_reflection_;
   delete Duration_reflection_;
 }
 }
 
 

+ 1 - 0
src/google/protobuf/empty.pb.cc

@@ -69,6 +69,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fempty_2eproto() {
+  Empty::default_instance_.Shutdown();
   delete Empty_reflection_;
   delete Empty_reflection_;
 }
 }
 
 

+ 1 - 0
src/google/protobuf/field_mask.pb.cc

@@ -70,6 +70,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2ffield_5fmask_2eproto() {
+  FieldMask::default_instance_.Shutdown();
   delete FieldMask_reflection_;
   delete FieldMask_reflection_;
 }
 }
 
 

+ 6 - 0
src/google/protobuf/generated_message_util.h

@@ -84,6 +84,12 @@ class ExplicitlyConstructed {
   }
   }
 
 
   bool IsInitialized() { return init_; }
   bool IsInitialized() { return init_; }
+  void Shutdown() {
+    if (init_) {
+      init_ = false;
+      get_mutable()->~T();
+    }
+  }
 
 
   const T& get() const { return reinterpret_cast<const T&>(union_); }
   const T& get() const { return reinterpret_cast<const T&>(union_); }
   T* get_mutable() { return reinterpret_cast<T*>(&union_); }
   T* get_mutable() { return reinterpret_cast<T*>(&union_); }

+ 1 - 0
src/google/protobuf/source_context.pb.cc

@@ -70,6 +70,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fsource_5fcontext_2eproto() {
+  SourceContext::default_instance_.Shutdown();
   delete SourceContext_reflection_;
   delete SourceContext_reflection_;
 }
 }
 
 

+ 3 - 0
src/google/protobuf/struct.pb.cc

@@ -137,9 +137,12 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fstruct_2eproto() {
+  Struct::default_instance_.Shutdown();
   delete Struct_reflection_;
   delete Struct_reflection_;
+  Value::default_instance_.Shutdown();
   delete Value_default_oneof_instance_;
   delete Value_default_oneof_instance_;
   delete Value_reflection_;
   delete Value_reflection_;
+  ListValue::default_instance_.Shutdown();
   delete ListValue_reflection_;
   delete ListValue_reflection_;
 }
 }
 
 

+ 1 - 0
src/google/protobuf/timestamp.pb.cc

@@ -71,6 +71,7 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2ftimestamp_2eproto() {
+  Timestamp::default_instance_.Shutdown();
   delete Timestamp_reflection_;
   delete Timestamp_reflection_;
 }
 }
 
 

+ 14 - 3
src/google/protobuf/type.pb.cc

@@ -173,10 +173,15 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2ftype_2eproto() {
+  Type::default_instance_.Shutdown();
   delete Type_reflection_;
   delete Type_reflection_;
+  Field::default_instance_.Shutdown();
   delete Field_reflection_;
   delete Field_reflection_;
+  Enum::default_instance_.Shutdown();
   delete Enum_reflection_;
   delete Enum_reflection_;
+  EnumValue::default_instance_.Shutdown();
   delete EnumValue_reflection_;
   delete EnumValue_reflection_;
+  Option::default_instance_.Shutdown();
   delete Option_reflection_;
   delete Option_reflection_;
 }
 }
 
 
@@ -390,7 +395,9 @@ void Type::SharedDtor() {
   }
   }
 
 
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
-  delete source_context_;
+  if (this != &default_instance_.get()) {
+    delete source_context_;
+  }
 }
 }
 
 
 void Type::ArenaDtor(void* object) {
 void Type::ArenaDtor(void* object) {
@@ -2295,7 +2302,9 @@ void Enum::SharedDtor() {
   }
   }
 
 
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
-  delete source_context_;
+  if (this != &default_instance_.get()) {
+    delete source_context_;
+  }
 }
 }
 
 
 void Enum::ArenaDtor(void* object) {
 void Enum::ArenaDtor(void* object) {
@@ -3424,7 +3433,9 @@ void Option::SharedDtor() {
   }
   }
 
 
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
   name_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena);
-  delete value_;
+  if (this != &default_instance_.get()) {
+    delete value_;
+  }
 }
 }
 
 
 void Option::ArenaDtor(void* object) {
 void Option::ArenaDtor(void* object) {

+ 9 - 0
src/google/protobuf/wrappers.pb.cc

@@ -222,14 +222,23 @@ void protobuf_RegisterTypes(const ::std::string&) {
 }  // namespace
 }  // namespace
 
 
 void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto() {
 void protobuf_ShutdownFile_google_2fprotobuf_2fwrappers_2eproto() {
+  DoubleValue::default_instance_.Shutdown();
   delete DoubleValue_reflection_;
   delete DoubleValue_reflection_;
+  FloatValue::default_instance_.Shutdown();
   delete FloatValue_reflection_;
   delete FloatValue_reflection_;
+  Int64Value::default_instance_.Shutdown();
   delete Int64Value_reflection_;
   delete Int64Value_reflection_;
+  UInt64Value::default_instance_.Shutdown();
   delete UInt64Value_reflection_;
   delete UInt64Value_reflection_;
+  Int32Value::default_instance_.Shutdown();
   delete Int32Value_reflection_;
   delete Int32Value_reflection_;
+  UInt32Value::default_instance_.Shutdown();
   delete UInt32Value_reflection_;
   delete UInt32Value_reflection_;
+  BoolValue::default_instance_.Shutdown();
   delete BoolValue_reflection_;
   delete BoolValue_reflection_;
+  StringValue::default_instance_.Shutdown();
   delete StringValue_reflection_;
   delete StringValue_reflection_;
+  BytesValue::default_instance_.Shutdown();
   delete BytesValue_reflection_;
   delete BytesValue_reflection_;
 }
 }