From 4941ff7bf608e0bca764e1edad769a3f8cca797f Mon Sep 17 00:00:00 2001 From: Ben Konyi Date: Fri, 14 Feb 2020 13:55:38 -0800 Subject: [PATCH] Remove usage of Dart_AllocateWithNativeFields from tonic (#16588) This API is being removed from the Dart SDK. --- lib/ui/painting.dart | 6 ++++++ third_party/tonic/dart_wrappable.cc | 14 +++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart index e44287a96..8e7e8ea69 100644 --- a/lib/ui/painting.dart +++ b/lib/ui/painting.dart @@ -1890,6 +1890,12 @@ class Path extends NativeFieldWrapperClass2 { /// Create a new empty [Path] object. @pragma('vm:entry-point') Path() { _constructor(); } + + // Workaround for tonic, which expects classes with native fields to have a + // private constructor. + @pragma('vm:entry-point') + Path._() { _constructor(); } + void _constructor() native 'Path_constructor'; /// Creates a copy of another [Path]. diff --git a/third_party/tonic/dart_wrappable.cc b/third_party/tonic/dart_wrappable.cc index 96b5e44ed..b5edf4f8f 100644 --- a/third_party/tonic/dart_wrappable.cc +++ b/third_party/tonic/dart_wrappable.cc @@ -22,13 +22,17 @@ Dart_Handle DartWrappable::CreateDartWrapper(DartState* dart_state) { Dart_PersistentHandle type = dart_state->class_library().GetClass(info); TONIC_DCHECK(!LogIfError(type)); - intptr_t native_fields[kNumberOfNativeFields]; - native_fields[kPeerIndex] = reinterpret_cast(this); - native_fields[kWrapperInfoIndex] = reinterpret_cast(&info); - Dart_Handle wrapper = - Dart_AllocateWithNativeFields(type, kNumberOfNativeFields, native_fields); + Dart_Handle private_constructor_name = Dart_NewStringFromCString("_"); + Dart_Handle wrapper = Dart_New(type, private_constructor_name, 0, nullptr); TONIC_DCHECK(!LogIfError(wrapper)); + Dart_Handle res = Dart_SetNativeInstanceField( + wrapper, kPeerIndex, reinterpret_cast(this)); + TONIC_DCHECK(!LogIfError(res)); + res = Dart_SetNativeInstanceField(wrapper, kWrapperInfoIndex, + reinterpret_cast(&info)); + TONIC_DCHECK(!LogIfError(res)); + this->RetainDartWrappableReference(); // Balanced in FinalizeDartWrapper. dart_wrapper_ = Dart_NewWeakPersistentHandle( wrapper, this, GetAllocationSize(), &FinalizeDartWrapper); -- GitLab