Index: third_party/protobuf/src/google/protobuf/dynamic_message.cc |
diff --git a/third_party/protobuf/src/google/protobuf/dynamic_message.cc b/third_party/protobuf/src/google/protobuf/dynamic_message.cc |
index bb4004769d4d5e9b3a333cbb187fe8f71acc8e06..9e83bd2918e4e828312026515a6b4c5ec4399856 100644 |
--- a/third_party/protobuf/src/google/protobuf/dynamic_message.cc |
+++ b/third_party/protobuf/src/google/protobuf/dynamic_message.cc |
@@ -267,6 +267,16 @@ class DynamicMessage : public Message { |
Metadata GetMetadata() const; |
+ // We actually allocate more memory than sizeof(*this) when this |
+ // class's memory is allocated via the global operator new. Thus, we need to |
+ // manually call the global operator delete. Calling the destructor is taken |
+ // care of for us. This makes DynamicMessage compatible with -fsized-delete. |
+ // It doesn't work for MSVC though. |
+#ifndef _MSC_VER |
+ static void operator delete(void* ptr) { |
+ ::operator delete(ptr); |
+ } |
+#endif // !_MSC_VER |
private: |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage); |
@@ -419,7 +429,7 @@ DynamicMessage::~DynamicMessage() { |
} |
// We need to manually run the destructors for repeated fields and strings, |
- // just as we ran their constructors in the the DynamicMessage constructor. |
+ // just as we ran their constructors in the DynamicMessage constructor. |
// We also need to manually delete oneof fields if it is set and is string |
// or message. |
// Additionally, if any singular embedded messages have been allocated, we |
@@ -442,8 +452,10 @@ DynamicMessage::~DynamicMessage() { |
case FieldOptions::STRING: { |
const ::std::string* default_value = |
&(reinterpret_cast<const ArenaStringPtr*>( |
- type_info_->prototype->OffsetToPointer( |
- type_info_->offsets[i]))->Get(NULL)); |
+ reinterpret_cast<uint8*>( |
+ type_info_->default_oneof_instance) |
+ + type_info_->offsets[i]) |
+ ->Get(NULL)); |
reinterpret_cast<ArenaStringPtr*>(field_ptr)->Destroy( |
default_value, NULL); |
break; |
@@ -704,7 +716,7 @@ const Message* DynamicMessageFactory::GetPrototypeNoLock( |
// Oneof fields do not use any space. |
if (!type->field(i)->containing_oneof()) { |
int field_size = FieldSpaceUsed(type->field(i)); |
- size = AlignTo(size, min(kSafeAlignment, field_size)); |
+ size = AlignTo(size, std::min(kSafeAlignment, field_size)); |
offsets[i] = size; |
size += field_size; |
} |
@@ -748,7 +760,7 @@ const Message* DynamicMessageFactory::GetPrototypeNoLock( |
for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { |
const FieldDescriptor* field = type->oneof_decl(i)->field(j); |
int field_size = OneofFieldSpaceUsed(field); |
- oneof_size = AlignTo(oneof_size, min(kSafeAlignment, field_size)); |
+ oneof_size = AlignTo(oneof_size, std::min(kSafeAlignment, field_size)); |
offsets[field->index()] = oneof_size; |
oneof_size += field_size; |
} |