diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 8f242cda1f13b..c9ee5f920035d 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -196,6 +196,26 @@ bool DartVM::IsRunningPrecompiledCode() { return Dart_IsPrecompiledRuntime(); } +bool DartVM::IsKernelMapping(const fml::FileMapping* mapping) { + if (mapping == nullptr) { + return false; + } + + const uint8_t kKernelHeaderMagic[] = {0x90, 0xAB, 0xCD, 0xEF}; + const size_t kKernelHeaderMagicSize = sizeof(kKernelHeaderMagic); + + if (mapping->GetSize() < kKernelHeaderMagicSize) { + return false; + } + + if (memcmp(kKernelHeaderMagic, mapping->GetMapping(), + kKernelHeaderMagicSize) != 0) { + return false; + } + + return true; +} + static std::vector ProfilingFlags(bool enable_profiling) { // Disable Dart's built in profiler when building a debug build. This // works around a race condition that would sometimes stop a crash's diff --git a/runtime/dart_vm.h b/runtime/dart_vm.h index 71ac0b1707d2d..ebb41edadb479 100644 --- a/runtime/dart_vm.h +++ b/runtime/dart_vm.h @@ -38,6 +38,8 @@ class DartVM : public fml::RefCountedThreadSafe { static bool IsRunningPrecompiledCode(); + static bool IsKernelMapping(const fml::FileMapping* mapping); + const Settings& GetSettings() const; const fml::Mapping& GetPlatformKernel() const; @@ -47,6 +49,7 @@ class DartVM : public fml::RefCountedThreadSafe { IsolateNameServer* GetIsolateNameServer(); fml::RefPtr GetIsolateSnapshot() const; + fml::RefPtr GetSharedSnapshot() const; fml::WeakPtr GetWeakPtr(); diff --git a/shell/common/shell.cc b/shell/common/shell.cc index c992bc4b3fc40..47bb2fac5991d 100644 --- a/shell/common/shell.cc +++ b/shell/common/shell.cc @@ -856,19 +856,6 @@ bool Shell::OnServiceProtocolScreenshotSKP( return false; } -static bool FileNameIsDill(const std::string& name) { - const std::string suffix = ".dill"; - - if (name.size() < suffix.size()) { - return false; - } - - if (name.rfind(suffix, name.size()) == name.size() - suffix.size()) { - return true; - } - return false; -} - // Service protocol handler bool Shell::OnServiceProtocolRunInView( const blink::ServiceProtocol::Handler::ServiceProtocolMap& params, @@ -900,10 +887,13 @@ bool Shell::OnServiceProtocolRunInView( auto main_script_file = fml::paths::AbsolutePath(params.at("mainScript").ToString()); + auto main_script_file_mapping = + std::make_unique(main_script_file, false); + auto isolate_configuration = - FileNameIsDill(main_script_file) + blink::DartVM::IsKernelMapping(main_script_file_mapping.get()) ? IsolateConfiguration::CreateForSnapshot( - std::make_unique(main_script_file, false)) + std::move(main_script_file_mapping)) : IsolateConfiguration::CreateForSource( main_script_file, params.at("packagesFile").ToString()); diff --git a/shell/testing/tester_main.cc b/shell/testing/tester_main.cc index c9ab7055679b1..274ef7bb64a6c 100644 --- a/shell/testing/tester_main.cc +++ b/shell/testing/tester_main.cc @@ -89,19 +89,6 @@ class ScriptCompletionTaskObserver { FML_DISALLOW_COPY_AND_ASSIGN(ScriptCompletionTaskObserver); }; -static bool FileNameIsDill(const std::string& name) { - const std::string suffix = ".dill"; - - if (name.size() < suffix.size()) { - return false; - } - - if (name.rfind(suffix, name.size()) == name.size() - suffix.size()) { - return true; - } - return false; -} - int RunTester(const blink::Settings& settings, bool run_forever) { const auto thread_label = "io.flutter.test"; @@ -142,12 +129,13 @@ int RunTester(const blink::Settings& settings, bool run_forever) { return EXIT_FAILURE; } + auto main_dart_file_mapping = std::make_unique( + fml::paths::AbsolutePath(settings.main_dart_file_path), false); + auto isolate_configuration = - FileNameIsDill(settings.main_dart_file_path) + blink::DartVM::IsKernelMapping(main_dart_file_mapping.get()) ? IsolateConfiguration::CreateForSnapshot( - std::make_unique( - fml::paths::AbsolutePath(settings.main_dart_file_path), - false)) + std::move(main_dart_file_mapping)) : IsolateConfiguration::CreateForSource(settings.main_dart_file_path, settings.packages_file_path);