diff options
author | Feng Xiao <xfxyjwf@gmail.com> | 2014-11-10 17:34:54 -0800 |
---|---|---|
committer | Feng Xiao <xfxyjwf@gmail.com> | 2014-11-10 17:34:54 -0800 |
commit | 6ef984af4b0c63c1c33127a12dcfc8e6359f0c9e (patch) | |
tree | d17c61ff9f3ae28224fbddac6d26bfc59e2cf755 /src/google/protobuf/extension_set_heavy.cc | |
parent | baca1a8a1aa180c42de6278d3b8286c4496c6a10 (diff) | |
download | protobuf-6ef984af4b0c63c1c33127a12dcfc8e6359f0c9e.tar.gz protobuf-6ef984af4b0c63c1c33127a12dcfc8e6359f0c9e.tar.bz2 protobuf-6ef984af4b0c63c1c33127a12dcfc8e6359f0c9e.zip |
Down-integrate from internal code base.
Diffstat (limited to 'src/google/protobuf/extension_set_heavy.cc')
-rw-r--r-- | src/google/protobuf/extension_set_heavy.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/google/protobuf/extension_set_heavy.cc b/src/google/protobuf/extension_set_heavy.cc index eae4d574..5f4ca1c3 100644 --- a/src/google/protobuf/extension_set_heavy.cc +++ b/src/google/protobuf/extension_set_heavy.cc @@ -169,7 +169,7 @@ MessageLite* ExtensionSet::MutableMessage(const FieldDescriptor* descriptor, const MessageLite* prototype = factory->GetPrototype(descriptor->message_type()); extension->is_lazy = false; - extension->message_value = prototype->New(); + extension->message_value = prototype->New(arena_); extension->is_cleared = false; return extension->message_value; } else { @@ -196,9 +196,16 @@ MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, if (iter->second.is_lazy) { ret = iter->second.lazymessage_value->ReleaseMessage( *factory->GetPrototype(descriptor->message_type())); - delete iter->second.lazymessage_value; + if (arena_ == NULL) { + delete iter->second.lazymessage_value; + } } else { - ret = iter->second.message_value; + if (arena_ != NULL) { + ret = (iter->second.message_value)->New(); + ret->CheckTypeAndMergeFrom(*(iter->second.message_value)); + } else { + ret = iter->second.message_value; + } } extensions_.erase(descriptor->number()); return ret; @@ -213,7 +220,7 @@ MessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor, GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); extension->is_repeated = true; extension->repeated_message_value = - new RepeatedPtrField<MessageLite>(); + ::google::protobuf::Arena::Create<RepeatedPtrField<MessageLite> >(arena_, arena_); } else { GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); } @@ -230,7 +237,7 @@ MessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor, } else { prototype = &extension->repeated_message_value->Get(0); } - result = prototype->New(); + result = prototype->New(arena_); extension->repeated_message_value->AddAllocated(result); } return result; |