diff --git a/lib/ui/window/platform_message_response_dart.cc b/lib/ui/window/platform_message_response_dart.cc index dca1ab74f9d58..38bb75cebbe31 100644 --- a/lib/ui/window/platform_message_response_dart.cc +++ b/lib/ui/window/platform_message_response_dart.cc @@ -19,30 +19,40 @@ namespace { // Avoid copying the contents of messages beyond a certain size. const int kMessageCopyThreshold = 1000; +class DataWrapper { + public: + DataWrapper(void* data) { data_ = data; } + + ~DataWrapper() { free(data_); } + + private: + void* data_; +}; + void MessageDataFinalizer(void* isolate_callback_data, Dart_WeakPersistentHandle handle, void* peer) { - std::vector* data = reinterpret_cast*>(peer); + DataWrapper* data = reinterpret_cast(peer); delete data; } -Dart_Handle WrapByteData(std::vector data) { - if (data.size() < kMessageCopyThreshold) { +Dart_Handle WrapByteData(std::unique_ptr mapping) { + size_t size = mapping->GetSize(); + if (size < kMessageCopyThreshold) { + std::vector data(size); + memcpy(data.data(), mapping->GetMapping(), size); return ToByteData(data); } else { - std::vector* heap_data = new std::vector(std::move(data)); - return Dart_NewExternalTypedDataWithFinalizer( - Dart_TypedData_kByteData, heap_data->data(), heap_data->size(), - heap_data, heap_data->size(), MessageDataFinalizer); + void* data = malloc(size); + memset(data, 0, size); + memcpy(data, mapping->GetMapping(), size); + DataWrapper* wrapper = new DataWrapper(data); + return Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_kByteData, + data, size, wrapper, size, + MessageDataFinalizer); } } -Dart_Handle WrapByteData(std::unique_ptr mapping) { - std::vector data(mapping->GetSize()); - memcpy(data.data(), mapping->GetMapping(), mapping->GetSize()); - return WrapByteData(std::move(data)); -} - } // anonymous namespace PlatformMessageResponseDart::PlatformMessageResponseDart(