From 8ff061dc9234fba640dfcfcf44629049b158f48a Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Wed, 19 Oct 2016 16:49:36 -0700 Subject: [PATCH] Switch from char to uint8_t to represent memory (flutter/engine#3147) Previously we had a mix of the two. --- engine/src/flutter/glue/drain_data_pipe_job.h | 2 +- .../flutter/glue/drain_data_pipe_job_base.cc | 4 ++-- .../glue/drain_data_pipe_job_fuchsia.cc | 4 ++-- .../flutter/lib/ui/painting/image_decoding.cc | 15 ++++++------- .../flutter/lib/ui/window/platform_message.cc | 2 +- .../flutter/lib/ui/window/platform_message.h | 6 ++--- .../lib/ui/window/platform_message_response.h | 2 +- .../window/platform_message_response_dart.cc | 4 ++-- .../window/platform_message_response_dart.h | 2 +- .../lib/ui/window/pointer_data_packet.cc | 2 +- .../lib/ui/window/pointer_data_packet.h | 6 ++--- engine/src/flutter/lib/ui/window/window.cc | 13 ++++++----- engine/src/flutter/lib/ui/window/window.h | 3 ++- engine/src/flutter/shell/common/engine.cc | 6 ++--- .../platform/android/platform_view_android.cc | 22 ++++++++++--------- .../platform/android/platform_view_android.h | 3 ++- .../framework/Source/FlutterViewController.mm | 4 ++-- .../Source/application_messages_impl.mm | 9 ++++---- 18 files changed, 57 insertions(+), 52 deletions(-) diff --git a/engine/src/flutter/glue/drain_data_pipe_job.h b/engine/src/flutter/glue/drain_data_pipe_job.h index 74d604475a..3a80f2867b 100644 --- a/engine/src/flutter/glue/drain_data_pipe_job.h +++ b/engine/src/flutter/glue/drain_data_pipe_job.h @@ -16,7 +16,7 @@ namespace glue { class DrainDataPipeJob { public: - using ResultCallback = std::function)>; + using ResultCallback = std::function)>; DrainDataPipeJob(mojo::ScopedDataPipeConsumerHandle handle, const ResultCallback& callback); diff --git a/engine/src/flutter/glue/drain_data_pipe_job_base.cc b/engine/src/flutter/glue/drain_data_pipe_job_base.cc index 2e01f710e6..871c992ccd 100644 --- a/engine/src/flutter/glue/drain_data_pipe_job_base.cc +++ b/engine/src/flutter/glue/drain_data_pipe_job_base.cc @@ -21,13 +21,13 @@ class DrainDataPipeJob::JobImpl : public DataPipeDrainer::Client { private: // mojo::common::DataPipeDrainer::Client void OnDataAvailable(const void* data, size_t num_bytes) override { - const char* bytes = static_cast(data); + const uint8_t* bytes = static_cast(data); buffer_.insert(buffer_.end(), bytes, bytes + num_bytes); } void OnDataComplete() override { callback_(std::move(buffer_)); } - std::vector buffer_; + std::vector buffer_; ResultCallback callback_; DataPipeDrainer drainer_; diff --git a/engine/src/flutter/glue/drain_data_pipe_job_fuchsia.cc b/engine/src/flutter/glue/drain_data_pipe_job_fuchsia.cc index a528d5ee3f..3f25501d00 100644 --- a/engine/src/flutter/glue/drain_data_pipe_job_fuchsia.cc +++ b/engine/src/flutter/glue/drain_data_pipe_job_fuchsia.cc @@ -23,13 +23,13 @@ class DrainDataPipeJob::JobImpl : public DataPipeDrainer::Client { private: // mojo::common::DataPipeDrainer::Client void OnDataAvailable(const void* data, size_t num_bytes) override { - const char* bytes = static_cast(data); + const uint8_t* bytes = static_cast(data); buffer_.insert(buffer_.end(), bytes, bytes + num_bytes); } void OnDataComplete() override { callback_(std::move(buffer_)); } - std::vector buffer_; + std::vector buffer_; ResultCallback callback_; DataPipeDrainer drainer_; diff --git a/engine/src/flutter/lib/ui/painting/image_decoding.cc b/engine/src/flutter/lib/ui/painting/image_decoding.cc index ea6fb2279e..e1e946e781 100644 --- a/engine/src/flutter/lib/ui/painting/image_decoding.cc +++ b/engine/src/flutter/lib/ui/painting/image_decoding.cc @@ -26,7 +26,7 @@ using tonic::ToDart; namespace blink { namespace { -sk_sp DecodeImage(std::vector buffer) { +sk_sp DecodeImage(std::vector buffer) { TRACE_EVENT0("blink", "DecodeImage"); if (buffer.empty()) @@ -70,7 +70,7 @@ void InvokeImageCallback(sk_sp image, void DecodeImageAndInvokeImageCallback( glue::MovableWrapper> callback, - std::vector buffer) { + std::vector buffer) { sk_sp image = DecodeImage(std::move(buffer)); Threads::UI()->PostTask([callback, image]() mutable { InvokeImageCallback(image, callback.Unwrap()); @@ -100,7 +100,7 @@ void DecodeImageFromDataPipe(Dart_NativeArguments args) { Threads::IO()->PostTask([callback, consumer]() mutable { glue::DrainDataPipeJob* job = nullptr; job = new glue::DrainDataPipeJob( - consumer.Unwrap(), [callback, job](std::vector buffer) { + consumer.Unwrap(), [callback, job](std::vector buffer) { delete job; DecodeImageAndInvokeImageCallback(callback, std::move(buffer)); }); @@ -126,12 +126,11 @@ void DecodeImageFromList(Dart_NativeArguments args) { auto callback = glue::WrapMovable(std::unique_ptr( new DartPersistentValue(tonic::DartState::Current(), callback_handle))); - const char* bytes = reinterpret_cast(list.data()); - auto buffer = glue::WrapMovable(std::unique_ptr>( - new std::vector(bytes, bytes + list.num_elements()))); + const uint8_t* bytes = reinterpret_cast(list.data()); + std::vector buffer(bytes, bytes + list.num_elements()); - Threads::IO()->PostTask([callback, buffer]() mutable { - DecodeImageAndInvokeImageCallback(callback, std::move(*buffer.Unwrap())); + Threads::IO()->PostTask([ callback, buffer = std::move(buffer) ]() mutable { + DecodeImageAndInvokeImageCallback(callback, std::move(buffer)); }); } diff --git a/engine/src/flutter/lib/ui/window/platform_message.cc b/engine/src/flutter/lib/ui/window/platform_message.cc index e5224fbc43..4446ba13d6 100644 --- a/engine/src/flutter/lib/ui/window/platform_message.cc +++ b/engine/src/flutter/lib/ui/window/platform_message.cc @@ -9,7 +9,7 @@ namespace blink { PlatformMessage::PlatformMessage(std::string name, - std::vector data, + std::vector data, ftl::RefPtr response) : name_(std::move(name)), data_(std::move(data)), diff --git a/engine/src/flutter/lib/ui/window/platform_message.h b/engine/src/flutter/lib/ui/window/platform_message.h index 2969875dbd..ad91182c5f 100644 --- a/engine/src/flutter/lib/ui/window/platform_message.h +++ b/engine/src/flutter/lib/ui/window/platform_message.h @@ -20,7 +20,7 @@ class PlatformMessage : public ftl::RefCountedThreadSafe { public: const std::string& name() const { return name_; } - const std::vector& data() const { return data_; } + const std::vector& data() const { return data_; } const ftl::RefPtr& response() const { return response_; @@ -28,12 +28,12 @@ class PlatformMessage : public ftl::RefCountedThreadSafe { private: PlatformMessage(std::string name, - std::vector data, + std::vector data, ftl::RefPtr response); ~PlatformMessage(); std::string name_; - std::vector data_; + std::vector data_; ftl::RefPtr response_; }; diff --git a/engine/src/flutter/lib/ui/window/platform_message_response.h b/engine/src/flutter/lib/ui/window/platform_message_response.h index f99b302ed5..a5d6fecc2c 100644 --- a/engine/src/flutter/lib/ui/window/platform_message_response.h +++ b/engine/src/flutter/lib/ui/window/platform_message_response.h @@ -18,7 +18,7 @@ class PlatformMessageResponse public: // Callable on any thread. - virtual void Complete(std::vector data) = 0; + virtual void Complete(std::vector data) = 0; // TODO(abarth): You should be able to pass data with the error. virtual void CompleteWithError() = 0; diff --git a/engine/src/flutter/lib/ui/window/platform_message_response_dart.cc b/engine/src/flutter/lib/ui/window/platform_message_response_dart.cc index a2bec962c6..bd3d0caf4c 100644 --- a/engine/src/flutter/lib/ui/window/platform_message_response_dart.cc +++ b/engine/src/flutter/lib/ui/window/platform_message_response_dart.cc @@ -26,7 +26,7 @@ PlatformMessageResponseDart::~PlatformMessageResponseDart() { } } -void PlatformMessageResponseDart::Complete(std::vector data) { +void PlatformMessageResponseDart::Complete(std::vector data) { if (callback_.is_empty()) return; FTL_DCHECK(!is_complete_); @@ -63,7 +63,7 @@ void PlatformMessageResponseDart::Complete(std::vector data) { void PlatformMessageResponseDart::CompleteWithError() { // TODO(abarth): We should have a dedicated error pathway. - Complete(std::vector()); + Complete(std::vector()); } } // namespace blink diff --git a/engine/src/flutter/lib/ui/window/platform_message_response_dart.h b/engine/src/flutter/lib/ui/window/platform_message_response_dart.h index 83436ddbc6..6209ab44fe 100644 --- a/engine/src/flutter/lib/ui/window/platform_message_response_dart.h +++ b/engine/src/flutter/lib/ui/window/platform_message_response_dart.h @@ -15,7 +15,7 @@ class PlatformMessageResponseDart : public PlatformMessageResponse { public: // Callable on any thread. - void Complete(std::vector data) override; + void Complete(std::vector data) override; void CompleteWithError() override; protected: diff --git a/engine/src/flutter/lib/ui/window/pointer_data_packet.cc b/engine/src/flutter/lib/ui/window/pointer_data_packet.cc index 1b669c72a3..b276f92fce 100644 --- a/engine/src/flutter/lib/ui/window/pointer_data_packet.cc +++ b/engine/src/flutter/lib/ui/window/pointer_data_packet.cc @@ -11,7 +11,7 @@ namespace blink { PointerDataPacket::PointerDataPacket(size_t count) : data_(count * sizeof(PointerData)) {} -PointerDataPacket::PointerDataPacket(char* data, size_t num_bytes) +PointerDataPacket::PointerDataPacket(uint8_t* data, size_t num_bytes) : data_(data, data + num_bytes) {} PointerDataPacket::~PointerDataPacket() = default; diff --git a/engine/src/flutter/lib/ui/window/pointer_data_packet.h b/engine/src/flutter/lib/ui/window/pointer_data_packet.h index 6d3cf7eb65..786a183ccf 100644 --- a/engine/src/flutter/lib/ui/window/pointer_data_packet.h +++ b/engine/src/flutter/lib/ui/window/pointer_data_packet.h @@ -17,14 +17,14 @@ namespace blink { class PointerDataPacket { public: explicit PointerDataPacket(size_t count); - PointerDataPacket(char* data, size_t num_bytes); + PointerDataPacket(uint8_t* data, size_t num_bytes); ~PointerDataPacket(); void SetPointerData(size_t i, const PointerData& data); - const std::vector& data() const { return data_; } + const std::vector& data() const { return data_; } private: - std::vector data_; + std::vector data_; FTL_DISALLOW_COPY_AND_ASSIGN(PointerDataPacket); }; diff --git a/engine/src/flutter/lib/ui/window/window.cc b/engine/src/flutter/lib/ui/window/window.cc index ff60ce1ce5..f5b0c490bb 100644 --- a/engine/src/flutter/lib/ui/window/window.cc +++ b/engine/src/flutter/lib/ui/window/window.cc @@ -21,7 +21,7 @@ using tonic::ToDart; namespace blink { namespace { -Dart_Handle ToByteData(const std::vector buffer) { +Dart_Handle ToByteData(const std::vector& buffer) { if (buffer.empty()) return Dart_Null(); @@ -72,7 +72,7 @@ void SendPlatformMessage(Dart_Handle window, Dart_Handle callback, const tonic::DartByteData& data) { UIDartState* dart_state = UIDartState::Current(); - const char* buffer = static_cast(data.data()); + const uint8_t* buffer = static_cast(data.data()); ftl::RefPtr response; if (!Dart_IsNull(callback)) { @@ -82,7 +82,7 @@ void SendPlatformMessage(Dart_Handle window, UIDartState::Current()->window()->client()->HandlePlatformMessage( ftl::MakeRefCounted( - name, std::vector(buffer, buffer + data.length_in_bytes()), + name, std::vector(buffer, buffer + data.length_in_bytes()), response)); } @@ -93,9 +93,10 @@ void _SendPlatformMessage(Dart_NativeArguments args) { void RespondToPlatformMessage(Dart_Handle window, int response_id, const tonic::DartByteData& data) { - const char* buffer = static_cast(data.data()); + const uint8_t* buffer = static_cast(data.data()); UIDartState::Current()->window()->CompletePlatformMessageResponse( - response_id, std::vector(buffer, buffer + data.length_in_bytes())); + response_id, + std::vector(buffer, buffer + data.length_in_bytes())); } void _RespondToPlatformMessage(Dart_NativeArguments args) { @@ -244,7 +245,7 @@ void Window::OnAppLifecycleStateChanged(sky::AppLifecycleState state) { } void Window::CompletePlatformMessageResponse(int response_id, - std::vector data) { + std::vector data) { if (!response_id) return; auto it = pending_responses_.find(response_id); diff --git a/engine/src/flutter/lib/ui/window/window.h b/engine/src/flutter/lib/ui/window/window.h index 6524e7f53d..3c61619095 100644 --- a/engine/src/flutter/lib/ui/window/window.h +++ b/engine/src/flutter/lib/ui/window/window.h @@ -54,7 +54,8 @@ class Window { void OnAppLifecycleStateChanged(sky::AppLifecycleState state); - void CompletePlatformMessageResponse(int response_id, std::vector data); + void CompletePlatformMessageResponse(int response_id, + std::vector data); static void RegisterNatives(tonic::DartLibraryNatives* natives); diff --git a/engine/src/flutter/shell/common/engine.cc b/engine/src/flutter/shell/common/engine.cc index cfe29beb27..2c9a84c5a6 100644 --- a/engine/src/flutter/shell/common/engine.cc +++ b/engine/src/flutter/shell/common/engine.cc @@ -186,11 +186,11 @@ void Engine::RunFromSnapshotStream( TRACE_EVENT0("flutter", "Engine::RunFromSnapshotStream"); ConfigureRuntime(script_uri); snapshot_drainer_.reset(new glue::DrainDataPipeJob( - std::move(snapshot), [this](std::vector snapshot) { + std::move(snapshot), [this](std::vector snapshot) { FTL_DCHECK(runtime_); FTL_DCHECK(runtime_->dart_controller()); - runtime_->dart_controller()->RunFromSnapshot( - reinterpret_cast(snapshot.data()), snapshot.size()); + runtime_->dart_controller()->RunFromSnapshot(snapshot.data(), + snapshot.size()); })); } diff --git a/engine/src/flutter/shell/platform/android/platform_view_android.cc b/engine/src/flutter/shell/platform/android/platform_view_android.cc index 489fae4c8c..76b26d4a0b 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android.cc +++ b/engine/src/flutter/shell/platform/android/platform_view_android.cc @@ -36,7 +36,7 @@ class PlatformMessageResponseAndroid : public blink::PlatformMessageResponse { FRIEND_MAKE_REF_COUNTED(PlatformMessageResponseAndroid); public: - void Complete(std::vector data) override { + void Complete(std::vector data) override { ftl::RefPtr self(this); blink::Threads::Platform()->PostTask( [ self, data = std::move(data) ]() mutable { @@ -48,7 +48,7 @@ class PlatformMessageResponseAndroid : public blink::PlatformMessageResponse { }); } - void CompleteWithError() override { Complete(std::vector()); } + void CompleteWithError() override { Complete(std::vector()); } private: PlatformMessageResponseAndroid(int response_id, @@ -151,10 +151,10 @@ void PlatformViewAndroid::DispatchPlatformMessage(JNIEnv* env, response_id, GetWeakPtr()); } + const uint8_t* buffer = reinterpret_cast(data.data()); PlatformView::DispatchPlatformMessage( ftl::MakeRefCounted( - std::move(name), - std::vector(data.data(), data.data() + data.size()), + std::move(name), std::vector(buffer, buffer + data.size()), std::move(response))); } @@ -162,7 +162,7 @@ void PlatformViewAndroid::DispatchPointerDataPacket(JNIEnv* env, jobject obj, jobject buffer, jint position) { - char* data = static_cast(env->GetDirectBufferAddress(buffer)); + uint8_t* data = static_cast(env->GetDirectBufferAddress(buffer)); blink::Threads::UI()->PostTask(ftl::MakeCopyable([ engine = engine_->GetWeakPtr(), @@ -190,7 +190,7 @@ void PlatformViewAndroid::InvokePlatformMessageResponseCallback( pending_responses_.erase(it); // TODO(abarth): There's an extra copy here. message_response->Complete( - std::vector(response.data(), response.data() + response.size())); + std::vector(response.data(), response.data() + response.size())); } void PlatformViewAndroid::HandlePlatformMessage( @@ -209,7 +209,8 @@ void PlatformViewAndroid::HandlePlatformMessage( base::StringPiece message_name = message->name(); auto data = message->data(); - base::StringPiece message_data(data.data(), data.size()); + base::StringPiece message_data(reinterpret_cast(data.data()), + data.size()); auto java_message_name = base::android::ConvertUTF8ToJavaString(env, message_name); @@ -225,13 +226,14 @@ void PlatformViewAndroid::HandlePlatformMessage( void PlatformViewAndroid::HandlePlatformMessageResponse( int response_id, - std::vector data) { + std::vector data) { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef view = flutter_view_.get(env); if (view.is_null()) return; - base::StringPiece message_data(data.data(), data.size()); + base::StringPiece message_data(reinterpret_cast(data.data()), + data.size()); auto java_message_data = base::android::ConvertUTF8ToJavaString(env, message_data); @@ -281,7 +283,7 @@ void PlatformViewAndroid::UpdateSemantics( num_bytes += node.children.size() * kBytesPerChild; } - std::vector buffer(num_bytes); + std::vector buffer(num_bytes); int32_t* buffer_int32 = reinterpret_cast(&buffer[0]); float* buffer_float32 = reinterpret_cast(&buffer[0]); diff --git a/engine/src/flutter/shell/platform/android/platform_view_android.h b/engine/src/flutter/shell/platform/android/platform_view_android.h index 942064cb43..b4f7fc3596 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android.h +++ b/engine/src/flutter/shell/platform/android/platform_view_android.h @@ -67,7 +67,8 @@ class PlatformViewAndroid : public PlatformView { void HandlePlatformMessage( ftl::RefPtr message) override; - void HandlePlatformMessageResponse(int response_id, std::vector data); + void HandlePlatformMessageResponse(int response_id, + std::vector data); void RunFromSource(const std::string& main, const std::string& packages, diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index dd13c728ee..999eb8cf82 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -489,11 +489,11 @@ static inline PointerChangeMapperPhase PointerChangePhaseFromUITouchPhase( NSData* data = [NSJSONSerialization dataWithJSONObject:message options:0 error:nil]; if (!data) return; - const char* bytes = static_cast(data.bytes); + const uint8_t* bytes = static_cast(data.bytes); _platformView->DispatchPlatformMessage( ftl::MakeRefCounted( messageName.UTF8String, - std::vector(bytes, bytes + data.length), + std::vector(bytes, bytes + data.length), nullptr)); } diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/application_messages_impl.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/application_messages_impl.mm index cbfa881e5c..09fd9dacae 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/application_messages_impl.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/application_messages_impl.mm @@ -11,11 +11,12 @@ namespace shell { namespace { -std::vector SysNSStringToVector(NSString* string) { +std::vector SysNSStringToVector(NSString* string) { if (!string.length) - return std::vector(); - const char* utf8 = string.UTF8String; - return std::vector(utf8, utf8 + strlen(utf8)); + return std::vector(); + const char* chars = string.UTF8String; + const uint8_t* bytes = reinterpret_cast(chars); + return std::vector(bytes, bytes + strlen(chars)); } } // namespace