diff --git a/DEPS b/DEPS index 0538c65450..ef49449d7c 100644 --- a/DEPS +++ b/DEPS @@ -31,7 +31,7 @@ vars = { # Dart is: https://github.com/dart-lang/sdk/blob/master/DEPS. # You can use //tools/dart/create_updated_flutter_deps.py to produce # updated revision list of existing dependencies. - 'dart_revision': 'a5c11d7d0329432ca37e35bb249b20f60aa0aa31', + 'dart_revision': '46ab040e589adc5200370dec7952ce5150850822', 'dart_args_tag': '1.4.1', 'dart_async_tag': '2.0.6', @@ -126,7 +126,7 @@ deps = { Var('fuchsia_git') + '/garnet' + '@' + 'b7492b5f34e32248b164eb48ae8e67995aebda67', 'src/topaz': - Var('fuchsia_git') + '/topaz' + '@' + '5fa651cf9cc5f338379e34964ff5dd70052f6237', + Var('fuchsia_git') + '/topaz' + '@' + 'e331f910c1003d154a4de6e1b5356f8d785fd6ec', 'src/third_party/benchmark': Var('fuchsia_git') + '/third_party/benchmark' + '@' + '296537bc48d380adf21567c5d736ab79f5363d22', diff --git a/engine/src/flutter/runtime/dart_isolate.cc b/engine/src/flutter/runtime/dart_isolate.cc index 91c91f4905..976e5d22a1 100644 --- a/engine/src/flutter/runtime/dart_isolate.cc +++ b/engine/src/flutter/runtime/dart_isolate.cc @@ -541,10 +541,10 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate( // thread. service_isolate->ResetWeakPtrFactory(); - const bool isolate_snapshot_is_dart_2 = Dart_IsDart2Snapshot( - vm->GetIsolateSnapshot()->GetData()->GetSnapshotPointer()); + const bool isolate_snapshot_is_dart_2 = + Dart_IsDart2Snapshot(vm->GetIsolateSnapshot()->GetData()->GetSnapshotPointer()); const bool is_preview_dart2 = - (vm->GetPlatformKernel().GetSize() > 0) || isolate_snapshot_is_dart_2; + vm->GetPlatformKernel() != nullptr || isolate_snapshot_is_dart_2; const bool running_from_sources = !DartVM::IsRunningPrecompiledCode() && !is_preview_dart2; @@ -648,16 +648,14 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair( // Create the Dart VM isolate and give it the embedder object as the baton. Dart_Isolate isolate = - (vm->GetPlatformKernel().GetSize() > 0) - ? Dart_CreateIsolateFromKernel( - advisory_script_uri, // - advisory_script_entrypoint, // - vm->GetPlatformKernel().GetMapping(), // - vm->GetPlatformKernel().GetSize(), // - flags, // - embedder_isolate.get(), // - error // - ) + vm->GetPlatformKernel() != nullptr + ? Dart_CreateIsolateFromKernel(advisory_script_uri, // + advisory_script_entrypoint, // + vm->GetPlatformKernel(), // + flags, // + embedder_isolate.get(), // + error // + ) : Dart_CreateIsolate(advisory_script_uri, // advisory_script_entrypoint, // embedder_isolate->GetIsolateSnapshot() diff --git a/engine/src/flutter/runtime/dart_vm.cc b/engine/src/flutter/runtime/dart_vm.cc index eeb395257c..378a642681 100644 --- a/engine/src/flutter/runtime/dart_vm.cc +++ b/engine/src/flutter/runtime/dart_vm.cc @@ -278,6 +278,18 @@ DartVM::DartVM(const Settings& settings, FXL_DCHECK(isolate_snapshot_ && isolate_snapshot_->IsValid()) << "Isolate snapshot must be valid."; + if (platform_kernel_mapping_->GetSize() > 0) { + // The platform kernel mapping lifetime is managed by this instance of the + // DartVM and hence will exceed that of the PlatformKernel. So provide an + // empty release callback. + Dart_ReleaseBufferCallback empty = [](auto arg) {}; + platform_kernel_ = reinterpret_cast(Dart_ReadKernelBinary( + platform_kernel_mapping_->GetMapping(), // buffer + platform_kernel_mapping_->GetSize(), // buffer size + empty // buffer deleter + )); + } + { TRACE_EVENT0("flutter", "dart::bin::BootstrapDartIo"); dart::bin::BootstrapDartIo(); @@ -328,11 +340,11 @@ DartVM::DartVM(const Settings& settings, Dart_IsDart2Snapshot(isolate_snapshot_->GetData()->GetSnapshotPointer()); const bool is_preview_dart2 = - (platform_kernel_mapping_->GetSize() > 0) || isolate_snapshot_is_dart_2; + platform_kernel_ != nullptr || isolate_snapshot_is_dart_2; FXL_DLOG(INFO) << "Dart 2 " << (is_preview_dart2 ? "is" : "is NOT") << " enabled. Platform kernel: " - << static_cast(platform_kernel_mapping_->GetSize() > 0) + << static_cast(platform_kernel_) << " Isolate Snapshot is Dart 2: " << isolate_snapshot_is_dart_2; @@ -441,8 +453,8 @@ const Settings& DartVM::GetSettings() const { return settings_; } -const fml::Mapping& DartVM::GetPlatformKernel() const { - return *platform_kernel_mapping_.get(); +DartVM::PlatformKernel* DartVM::GetPlatformKernel() const { + return platform_kernel_; } const DartSnapshot& DartVM::GetVMSnapshot() const { diff --git a/engine/src/flutter/runtime/dart_vm.h b/engine/src/flutter/runtime/dart_vm.h index 12ac1c6b21..e8feb9ba1d 100644 --- a/engine/src/flutter/runtime/dart_vm.h +++ b/engine/src/flutter/runtime/dart_vm.h @@ -25,6 +25,8 @@ namespace blink { class DartVM : public fxl::RefCountedThreadSafe { public: + class PlatformKernel; + static fxl::RefPtr ForProcess(Settings settings); static fxl::RefPtr ForProcess( @@ -38,7 +40,7 @@ class DartVM : public fxl::RefCountedThreadSafe { const Settings& GetSettings() const; - const fml::Mapping& GetPlatformKernel() const; + PlatformKernel* GetPlatformKernel() const; const DartSnapshot& GetVMSnapshot() const; @@ -53,6 +55,7 @@ class DartVM : public fxl::RefCountedThreadSafe { const fxl::RefPtr vm_snapshot_; const fxl::RefPtr isolate_snapshot_; std::unique_ptr platform_kernel_mapping_; + PlatformKernel* platform_kernel_ = nullptr; ServiceProtocol service_protocol_; fxl::WeakPtrFactory weak_factory_; diff --git a/engine/src/flutter/runtime/dart_vm_unittests.cc b/engine/src/flutter/runtime/dart_vm_unittests.cc index d0664d1111..5b2f5e6ee8 100644 --- a/engine/src/flutter/runtime/dart_vm_unittests.cc +++ b/engine/src/flutter/runtime/dart_vm_unittests.cc @@ -15,7 +15,7 @@ TEST(DartVM, SimpleInitialization) { ASSERT_TRUE(vm); ASSERT_EQ(vm, DartVM::ForProcess(settings)); ASSERT_FALSE(DartVM::IsRunningPrecompiledCode()); - ASSERT_EQ(vm->GetPlatformKernel().GetSize(), 0u); + ASSERT_EQ(vm->GetPlatformKernel(), nullptr); } } // namespace blink diff --git a/engine/src/flutter/shell/common/BUILD.gn b/engine/src/flutter/shell/common/BUILD.gn index 02e5f12b7d..5817d1616f 100644 --- a/engine/src/flutter/shell/common/BUILD.gn +++ b/engine/src/flutter/shell/common/BUILD.gn @@ -103,6 +103,7 @@ source_set("common") { "$flutter_root/third_party/txt", "//garnet/public/lib/fxl", "//third_party/dart/runtime:dart_api", + "//third_party/dart/runtime/platform:libdart_platform", "//third_party/rapidjson", "//third_party/skia", "//third_party/skia:gpu", diff --git a/engine/src/flutter/shell/testing/BUILD.gn b/engine/src/flutter/shell/testing/BUILD.gn index e0384da218..36bc9acc45 100644 --- a/engine/src/flutter/shell/testing/BUILD.gn +++ b/engine/src/flutter/shell/testing/BUILD.gn @@ -21,6 +21,8 @@ executable("testing") { "//garnet/public/lib/fxl", "//third_party/dart/runtime:libdart_jit", "//third_party/dart/runtime/bin:embedded_dart_io", + "//third_party/dart/runtime/bin:libdart_builtin", + "//third_party/dart/runtime/platform:libdart_platform", "//third_party/skia", "//topaz/lib/tonic", ]