From cd3ddede99bc3d58843118dd81972316c2b4a38d Mon Sep 17 00:00:00 2001 From: asiva Date: Fri, 7 Sep 2018 21:22:13 +0000 Subject: [PATCH] Move flags strong/sync-async/reify-generic-functions back to global vm flags (they are not set as isolate specific flags). Change-Id: I4d5cba4f5ac657a0834e3755312147cff1fbc001 Reviewed-on: https://dart-review.googlesource.com/71426 Commit-Queue: Siva Annamalai Reviewed-by: Zach Anderson --- runtime/bin/BUILD.gn | 7 +++ runtime/bin/main.cc | 12 ++-- runtime/bin/main_options.cc | 9 --- runtime/bin/main_options.h | 1 - runtime/bin/run_vm_tests.cc | 21 ++++++- runtime/include/dart_api.h | 5 +- runtime/lib/isolate.cc | 2 +- runtime/lib/object.cc | 2 +- runtime/vm/class_finalizer.cc | 17 +++--- runtime/vm/compiler/backend/flow_graph.cc | 4 +- .../backend/flow_graph_compiler_arm.cc | 2 +- .../backend/flow_graph_compiler_arm64.cc | 2 +- .../backend/flow_graph_compiler_ia32.cc | 2 +- .../backend/flow_graph_compiler_x64.cc | 2 +- runtime/vm/compiler/backend/il.cc | 2 +- runtime/vm/compiler/backend/il.h | 4 +- runtime/vm/compiler/backend/il_arm.cc | 8 +-- runtime/vm/compiler/backend/il_arm64.cc | 8 +-- runtime/vm/compiler/backend/il_ia32.cc | 8 +-- runtime/vm/compiler/backend/il_x64.cc | 8 +-- runtime/vm/compiler/backend/inliner.cc | 3 +- .../vm/compiler/backend/type_propagator.cc | 4 +- runtime/vm/compiler/call_specializer.cc | 2 +- .../compiler/frontend/constant_evaluator.cc | 4 +- .../compiler/frontend/flow_graph_builder.cc | 16 ++--- .../frontend/kernel_binary_flowgraph.cc | 34 +++++------ .../compiler/frontend/kernel_fingerprints.cc | 6 +- runtime/vm/compiler/frontend/kernel_to_il.cc | 13 ++-- .../frontend/kernel_translation_helper.cc | 4 +- .../vm/compiler/frontend/prologue_builder.cc | 5 +- runtime/vm/compiler/frontend/scope_builder.cc | 2 +- runtime/vm/dart.cc | 12 ++-- runtime/vm/dart_api_impl.cc | 4 +- runtime/vm/dart_entry.cc | 2 +- runtime/vm/flag_list.h | 6 +- runtime/vm/isolate.cc | 6 ++ runtime/vm/isolate.h | 11 +--- runtime/vm/kernel.cc | 2 +- runtime/vm/kernel_isolate.cc | 10 +--- runtime/vm/mixin_test.cc | 3 +- runtime/vm/native_arguments.h | 2 +- runtime/vm/object.cc | 60 +++++++++---------- runtime/vm/object.h | 2 +- runtime/vm/parser.cc | 31 +++++----- 44 files changed, 182 insertions(+), 188 deletions(-) diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn index 86847438cab..242e9766ab7 100644 --- a/runtime/bin/BUILD.gn +++ b/runtime/bin/BUILD.gn @@ -661,6 +661,13 @@ gen_snapshot_action("generate_snapshot_bin") { ] args = [ "--deterministic", + + # TODO(asiva) remove these flags once the core snapshot is switched to + # dart 2. + "--no-strong", + "--no-sync-async", + "--reify-generic-functions", + "--snapshot_kind=" + dart_core_snapshot_kind, "--vm_snapshot_data=" + rebase_path(vm_snapshot_data, root_build_dir), "--vm_snapshot_instructions=" + diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc index 2c18c3bd9de..992dd7fbcff 100644 --- a/runtime/bin/main.cc +++ b/runtime/bin/main.cc @@ -448,7 +448,7 @@ static Dart_Isolate CreateAndSetupKernelIsolate(const char* script_uri, packages_config = Options::packages_file(); } - Dart_Isolate isolate; + Dart_Isolate isolate = NULL; IsolateData* isolate_data = NULL; bool isolate_run_app_snapshot = false; AppSnapshot* app_snapshot = NULL; @@ -470,7 +470,8 @@ static Dart_Isolate CreateAndSetupKernelIsolate(const char* script_uri, DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data, isolate_snapshot_instructions, app_isolate_shared_data, app_isolate_shared_instructions, flags, isolate_data, error); - } else { + } + if (isolate == NULL) { const uint8_t* kernel_service_buffer = NULL; intptr_t kernel_service_buffer_size = 0; dfe.LoadKernelService(&kernel_service_buffer, &kernel_service_buffer_size); @@ -890,7 +891,7 @@ bool RunMainIsolate(const char* script_name, CommandLineOptions* dart_options) { } Dart_Isolate isolate = NULL; - if (flags.strong && Options::gen_snapshot_kind() == kAppAOT) { + if (Options::preview_dart_2() && Options::gen_snapshot_kind() == kAppAOT) { isolate = IsolateSetupHelperAotCompilationDart2( script_name, "main", Options::package_root(), Options::packages_file(), &flags, &error, &exit_code); @@ -1261,8 +1262,9 @@ void main(int argc, char** argv) { init_params.entropy_source = DartUtils::EntropySource; init_params.get_service_assets = GetVMServiceAssetsArchiveCallback; #if !defined(DART_PRECOMPILED_RUNTIME) - init_params.start_kernel_isolate = - dfe.UseDartFrontend() && dfe.CanUseDartFrontend(); + init_params.start_kernel_isolate = Options::preview_dart_2() && + dfe.UseDartFrontend() && + dfe.CanUseDartFrontend(); #else init_params.start_kernel_isolate = false; #endif diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc index 9e7a323d378..faf5a26803a 100644 --- a/runtime/bin/main_options.cc +++ b/runtime/bin/main_options.cc @@ -63,12 +63,6 @@ ENUM_OPTIONS_LIST(ENUM_OPTION_DEFINITION) CB_OPTIONS_LIST(CB_OPTION_DEFINITION) #undef CB_OPTION_DEFINITION -void Options::SetDart2Options(CommandLineOptions* vm_options) { - vm_options->AddArgument("--strong"); - vm_options->AddArgument("--reify-generic-functions"); - vm_options->AddArgument("--sync-async"); -} - void Options::SetDart1Options(CommandLineOptions* vm_options) { vm_options->AddArgument("--no-strong"); vm_options->AddArgument("--no-reify-generic-functions"); @@ -348,9 +342,6 @@ int Options::ParseArguments(int argc, const char* kPrefix = "--"; const intptr_t kPrefixLen = strlen(kPrefix); - // Set Dart 2 as the default option. - Options::SetDart2Options(vm_options); - // Store the executable name. Platform::SetExecutableName(argv[0]); diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h index 53184a443a0..f5672eb61e4 100644 --- a/runtime/bin/main_options.h +++ b/runtime/bin/main_options.h @@ -112,7 +112,6 @@ class Options { #undef CB_OPTIONS_DECL static bool preview_dart_2() { return !no_preview_dart_2(); } - static void SetDart2Options(CommandLineOptions* vm_options); static void SetDart1Options(CommandLineOptions* vm_options); static dart::SimpleHashMap* environment() { return environment_; } diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc index ebd050ec686..75fb96188be 100644 --- a/runtime/bin/run_vm_tests.cc +++ b/runtime/bin/run_vm_tests.cc @@ -150,7 +150,8 @@ static Dart_Isolate CreateIsolateAndSetup(const char* script_uri, isolate = Dart_CreateIsolate( DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data, isolate_snapshot_instructions, NULL, NULL, flags, isolate_data, error); - } else { + } + if (isolate == NULL) { bin::dfe.Init(); bin::dfe.LoadKernelService(&kernel_service_buffer, &kernel_service_buffer_size); @@ -262,13 +263,27 @@ static int Main(int argc, const char** argv) { dart_argc = argc - 2; dart_argv = &argv[1]; } + const char* error; + if (!start_kernel_isolate) { + int extra_argc = dart_argc + 3; + const char** extra_argv = new const char*[extra_argc]; + for (intptr_t i = 0; i < dart_argc; i++) { + extra_argv[i] = dart_argv[i]; + } + extra_argv[dart_argc] = "--no-strong"; + extra_argv[dart_argc + 1] = "--no-reify-generic-arguments"; + extra_argv[dart_argc + 2] = "--no-sync-async"; + error = Flags::ProcessCommandLineFlags(extra_argc, extra_argv); + ASSERT(error == NULL); + } else { + error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv); + ASSERT(error == NULL); + } bin::Thread::InitOnce(); bin::TimerUtils::InitOnce(); bin::EventHandler::Start(); - const char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv); - ASSERT(error == NULL); error = Dart::InitOnce( dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions, diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h index eef2f9fbf67..c1c02df0e87 100644 --- a/runtime/include/dart_api.h +++ b/runtime/include/dart_api.h @@ -553,7 +553,7 @@ typedef struct { * for each part. */ -#define DART_FLAGS_CURRENT_VERSION (0x00000006) +#define DART_FLAGS_CURRENT_VERSION (0x00000007) typedef struct { int32_t version; @@ -566,10 +566,7 @@ typedef struct { bool use_dart_frontend; bool obfuscate; Dart_QualifiedFunctionName* entry_points; - bool reify_generic_functions; - bool strong; bool load_vmservice_library; - bool sync_async; bool unsafe_trust_strong_mode_types; } Dart_IsolateFlags; diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc index 289c4aa3e36..261ed5d34fd 100644 --- a/runtime/lib/isolate.cc +++ b/runtime/lib/isolate.cc @@ -361,7 +361,7 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) { Dart_IsolateFlags* flags = state->isolate_flags(); flags->enable_asserts = is_checked; // Do not enable type checks in strong mode. - flags->enable_type_checks = is_checked && !flags->strong; + flags->enable_type_checks = is_checked && !FLAG_strong; } ThreadPool::Task* spawn_task = new SpawnIsolateTask(state); diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc index 7b0537f0c1c..58da284fd23 100644 --- a/runtime/lib/object.cc +++ b/runtime/lib/object.cc @@ -380,7 +380,7 @@ DEFINE_NATIVE_ENTRY(Internal_extractTypeArguments, 2) { Class& interface_cls = Class::Handle(zone); intptr_t num_type_args = 0; // Remains 0 when executing Dart 1.0 code. // TODO(regis): Check for strong mode too? - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { const TypeArguments& function_type_args = TypeArguments::Handle(zone, arguments->NativeTypeArgs()); if (function_type_args.Length() == 1) { diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc index a8e852af992..c5e9f7fd79f 100644 --- a/runtime/vm/class_finalizer.cc +++ b/runtime/vm/class_finalizer.cc @@ -449,8 +449,7 @@ void ClassFinalizer::ResolveRedirectingFactoryTarget( return; } - Isolate* isolate = Isolate::Current(); - if (isolate->error_on_bad_override() && !isolate->strong()) { + if (!FLAG_strong && Isolate::Current()->error_on_bad_override()) { // Verify that the target is compatible with the redirecting factory. Error& error = Error::Handle(); if (!target.HasCompatibleParametersWith(factory, &error)) { @@ -564,7 +563,7 @@ void ClassFinalizer::ResolveTypeClass(const Class& cls, const Type& type) { (type.signature() != Function::null())); // In non-strong mode, replace FutureOr type of async library with dynamic. - if (type_class.IsFutureOrClass() && !Isolate::Current()->strong()) { + if (type_class.IsFutureOrClass() && !FLAG_strong) { Type::Cast(type).set_type_class(Class::Handle(Object::dynamic_class())); type.set_arguments(Object::null_type_arguments()); } @@ -1226,7 +1225,7 @@ RawAbstractType* ClassFinalizer::FinalizeType(const Class& cls, // malformed. if ((finalization >= kCanonicalize) && !type.IsMalformed() && !type.IsCanonical() && type.IsType()) { - if (!Isolate::Current()->strong()) { + if (!FLAG_strong) { CheckTypeBounds(cls, type); } return type.Canonicalize(); @@ -1370,7 +1369,7 @@ RawAbstractType* ClassFinalizer::FinalizeType(const Class& cls, // If we are done finalizing a graph of mutually recursive types, check their // bounds. - if (is_root_type && !Isolate::Current()->strong()) { + if (is_root_type && !FLAG_strong) { for (intptr_t i = pending_types->length() - 1; i >= 0; i--) { const AbstractType& type = pending_types->At(i); if (!type.IsMalformed() && !type.IsCanonical()) { @@ -1634,7 +1633,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) { String& other_name = String::Handle(zone); Class& super_class = Class::Handle(zone); const intptr_t num_fields = array.Length(); - const bool track_exactness = isolate->strong() && isolate->use_field_guards(); + const bool track_exactness = FLAG_strong && isolate->use_field_guards(); for (intptr_t i = 0; i < num_fields; i++) { field ^= array.At(i); type = field.type(); @@ -1743,7 +1742,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) { // If we check for bad overrides, collect interfaces, super interfaces, and // super classes of this class. GrowableArray interfaces(zone, 4); - if (isolate->error_on_bad_override() && !isolate->strong()) { + if (isolate->error_on_bad_override() && !FLAG_strong) { CollectInterfaces(cls, &interfaces); // Include superclasses in list of interfaces and super interfaces. super_class = cls.SuperClass(); @@ -1765,7 +1764,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) { FinalizeSignature(cls, function); name = function.name(); // Report signature conflicts only. - if (isolate->error_on_bad_override() && !isolate->strong() && + if (isolate->error_on_bad_override() && !FLAG_strong && !function.is_static() && !function.IsGenerativeConstructor()) { // A constructor cannot override anything. for (intptr_t i = 0; i < interfaces.length(); i++) { @@ -2787,7 +2786,7 @@ void ClassFinalizer::FinalizeClass(const Class& cls) { } // Ensure interfaces are finalized in case we check for bad overrides. Isolate* isolate = Isolate::Current(); - if (isolate->error_on_bad_override() && !isolate->strong()) { + if (isolate->error_on_bad_override() && !FLAG_strong) { GrowableArray interfaces(4); CollectInterfaces(cls, &interfaces); for (intptr_t i = 0; i < interfaces.length(); i++) { diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc index e92b11051c3..015c375c398 100644 --- a/runtime/vm/compiler/backend/flow_graph.cc +++ b/runtime/vm/compiler/backend/flow_graph.cc @@ -1048,7 +1048,7 @@ void FlowGraph::Rename(GrowableArray* live_phis, // Check if inlining_parameters include a type argument vector parameter. const intptr_t inlined_type_args_param = - (isolate()->reify_generic_functions() && (inlining_parameters != NULL) && + (FLAG_reify_generic_functions && (inlining_parameters != NULL) && function().IsGeneric()) ? 1 : 0; @@ -1091,7 +1091,7 @@ void FlowGraph::Rename(GrowableArray* live_phis, if (!IsCompiledForOsr()) { const bool reify_generic_argument = - function().IsGeneric() && isolate()->reify_generic_functions(); + function().IsGeneric() && FLAG_reify_generic_functions; // Replace the type arguments slot with a special parameter. if (reify_generic_argument) { diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc index d4958ef422b..a6ff28b02a7 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc @@ -1119,7 +1119,7 @@ void FlowGraphCompiler::EmitOptimizedStaticCall( Code::EntryKind entry_kind) { ASSERT(!function.IsClosureFunction()); if (function.HasOptionalParameters() || - (isolate()->reify_generic_functions() && function.IsGeneric())) { + (FLAG_reify_generic_functions && function.IsGeneric())) { __ LoadObject(R4, arguments_descriptor); } else { __ LoadImmediate(R4, 0); // GC safe smi zero because of stub. diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc index 99af7c4a0ba..9e67fe9df7b 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc @@ -1088,7 +1088,7 @@ void FlowGraphCompiler::EmitOptimizedStaticCall( // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64. ASSERT(!function.IsClosureFunction()); if (function.HasOptionalParameters() || - (isolate()->reify_generic_functions() && function.IsGeneric())) { + (FLAG_reify_generic_functions && function.IsGeneric())) { __ LoadObject(R4, arguments_descriptor); } else { __ LoadImmediate(R4, 0); // GC safe smi zero because of stub. diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc index 41c287ca9c8..93dde40e221 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc @@ -1001,7 +1001,7 @@ void FlowGraphCompiler::EmitOptimizedStaticCall( Code::EntryKind entry_kind) { // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32. if (function.HasOptionalParameters() || - (isolate()->reify_generic_functions() && function.IsGeneric())) { + (FLAG_reify_generic_functions && function.IsGeneric())) { __ LoadObject(EDX, arguments_descriptor); } else { __ xorl(EDX, EDX); // GC safe smi zero because of stub. diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc index 4bc4f9280cf..5c1329a133c 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc @@ -1096,7 +1096,7 @@ void FlowGraphCompiler::EmitOptimizedStaticCall( Code::EntryKind entry_kind) { ASSERT(!function.IsClosureFunction()); if (function.HasOptionalParameters() || - (isolate()->reify_generic_functions() && function.IsGeneric())) { + (FLAG_reify_generic_functions && function.IsGeneric())) { __ LoadObject(R10, arguments_descriptor); } else { __ xorl(R10, R10); // GC safe smi zero because of stub. diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc index bdc71222665..490f94b4d67 100644 --- a/runtime/vm/compiler/backend/il.cc +++ b/runtime/vm/compiler/backend/il.cc @@ -2695,7 +2695,7 @@ Definition* AssertBooleanInstr::Canonicalize(FlowGraph* flow_graph) { // In strong mode type is already verified either by static analysis // or runtime checks, so AssertBoolean just ensures that value is not null. - if (Isolate::Current()->strong() && !value()->Type()->is_nullable()) { + if (FLAG_strong && !value()->Type()->is_nullable()) { return value()->definition(); } } diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h index 46cfc602925..405f28fce0d 100644 --- a/runtime/vm/compiler/backend/il.h +++ b/runtime/vm/compiler/backend/il.h @@ -4251,7 +4251,7 @@ class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> { Assembler::CanBeSmi CanValueBeSmi() const { Isolate* isolate = Isolate::Current(); - if (isolate->type_checks() && !isolate->strong()) { + if (isolate->type_checks() && !FLAG_strong) { // Dart 1 sometimes places a store into a context before a parameter // type check. return Assembler::kValueCanBeSmi; @@ -4424,7 +4424,7 @@ class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> { private: Assembler::CanBeSmi CanValueBeSmi() const { Isolate* isolate = Isolate::Current(); - if (isolate->type_checks() && !isolate->strong()) { + if (isolate->type_checks() && !FLAG_strong) { // Dart 1 sometimes places a store into a context before a parameter // type check. return Assembler::kValueCanBeSmi; diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc index 2d80341e954..b004f10f643 100644 --- a/runtime/vm/compiler/backend/il_arm.cc +++ b/runtime/vm/compiler/backend/il_arm.cc @@ -501,7 +501,7 @@ static void EmitAssertBoolean(Register reg, __ CompareObject(reg, Bool::False()); __ b(&done, EQ); } else { - ASSERT(isolate->asserts() || isolate->strong()); + ASSERT(isolate->asserts() || FLAG_strong); __ CompareObject(reg, Object::null_instance()); __ b(&done, NE); } @@ -937,9 +937,9 @@ void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { const Register result = locs()->out(0).reg(); // All arguments are already @SP due to preceding PushArgument()s. - ASSERT(ArgumentCount() == function().NumParameters() + - (function().IsGeneric() && - Isolate::Current()->reify_generic_functions()) + ASSERT(ArgumentCount() == + function().NumParameters() + + (function().IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0); diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc index de564dfd862..f4e58f58c4f 100644 --- a/runtime/vm/compiler/backend/il_arm64.cc +++ b/runtime/vm/compiler/backend/il_arm64.cc @@ -497,7 +497,7 @@ static void EmitAssertBoolean(Register reg, __ CompareObject(reg, Bool::False()); __ b(&done, EQ); } else { - ASSERT(isolate->asserts() || isolate->strong()); + ASSERT(isolate->asserts() || FLAG_strong); __ CompareObject(reg, Object::null_instance()); __ b(&done, NE); } @@ -824,9 +824,9 @@ void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { const Register result = locs()->out(0).reg(); // All arguments are already @SP due to preceding PushArgument()s. - ASSERT(ArgumentCount() == function().NumParameters() + - (function().IsGeneric() && - Isolate::Current()->reify_generic_functions()) + ASSERT(ArgumentCount() == + function().NumParameters() + + (function().IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0); diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc index 18f3279d331..f81f45d8603 100644 --- a/runtime/vm/compiler/backend/il_ia32.cc +++ b/runtime/vm/compiler/backend/il_ia32.cc @@ -320,7 +320,7 @@ static void EmitAssertBoolean(Register reg, __ CompareObject(reg, Bool::False()); __ j(EQUAL, &done, Assembler::kNearJump); } else { - ASSERT(isolate->asserts() || isolate->strong()); + ASSERT(isolate->asserts() || FLAG_strong); __ CompareObject(reg, Object::null_instance()); __ j(NOT_EQUAL, &done, Assembler::kNearJump); } @@ -821,9 +821,9 @@ void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); // All arguments are already @ESP due to preceding PushArgument()s. - ASSERT(ArgumentCount() == function().NumParameters() + - (function().IsGeneric() && - Isolate::Current()->reify_generic_functions()) + ASSERT(ArgumentCount() == + function().NumParameters() + + (function().IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0); diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc index 313be83fc8a..dc503fb92c0 100644 --- a/runtime/vm/compiler/backend/il_x64.cc +++ b/runtime/vm/compiler/backend/il_x64.cc @@ -473,7 +473,7 @@ static void EmitAssertBoolean(Register reg, __ CompareObject(reg, Bool::False()); __ j(EQUAL, &done, Assembler::kNearJump); } else { - ASSERT(isolate->asserts() || isolate->strong()); + ASSERT(isolate->asserts() || FLAG_strong); __ CompareObject(reg, Object::null_instance()); __ j(NOT_EQUAL, &done, Assembler::kNearJump); } @@ -847,9 +847,9 @@ void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); // All arguments are already @RSP due to preceding PushArgument()s. - ASSERT(ArgumentCount() == function().NumParameters() + - (function().IsGeneric() && - Isolate::Current()->reify_generic_functions()) + ASSERT(ArgumentCount() == + function().NumParameters() + + (function().IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0); diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc index ccacbd2e390..97a1c1730e4 100644 --- a/runtime/vm/compiler/backend/inliner.cc +++ b/runtime/vm/compiler/backend/inliner.cc @@ -1011,8 +1011,7 @@ class CallSiteInliner : public ValueObject { // TODO(zerny): Put more information in the stubs, eg, type information. const intptr_t first_actual_param_index = call_data->first_arg_index; const intptr_t inlined_type_args_param = - (isolate->reify_generic_functions() && function.IsGeneric()) ? 1 - : 0; + (FLAG_reify_generic_functions && function.IsGeneric()) ? 1 : 0; const intptr_t num_inlined_params = inlined_type_args_param + function.NumParameters(); ZoneGrowableArray* param_stubs = diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc index b5aaa9537ec..2dfe0324638 100644 --- a/runtime/vm/compiler/backend/type_propagator.cc +++ b/runtime/vm/compiler/backend/type_propagator.cc @@ -753,7 +753,7 @@ const AbstractType* CompileType::ToAbstractType() { Isolate* I = Isolate::Current(); const Class& type_class = Class::Handle(I->class_table()->At(cid_)); if (type_class.NumTypeArguments() > 0) { - if (I->strong()) { + if (FLAG_strong) { type_ = &AbstractType::ZoneHandle(type_class.RareType()); } else { type_ = &Object::dynamic_type(); @@ -1189,7 +1189,7 @@ CompileType StaticCallInstr::ComputeType() const { } const Isolate* isolate = Isolate::Current(); - if ((isolate->can_use_strong_mode_types()) || isolate->type_checks()) { + if (isolate->can_use_strong_mode_types() || isolate->type_checks()) { const AbstractType& result_type = AbstractType::ZoneHandle(function().result_type()); // TODO(dartbug.com/30480): instantiate generic result_type if possible. diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc index b119b074757..471b5b9b97c 100644 --- a/runtime/vm/compiler/call_specializer.cc +++ b/runtime/vm/compiler/call_specializer.cc @@ -1005,7 +1005,7 @@ bool CallSpecializer::TryInlineInstanceSetter(InstanceCallInstr* instr, // Compute if we need to type check the value. Always type check if // not in strong mode or if at a dynamic invocation. bool needs_check = true; - if (I->strong() && !instr->interface_target().IsNull() && + if (FLAG_strong && !instr->interface_target().IsNull() && (field.kernel_offset() >= 0)) { bool is_covariant = false; bool is_generic_covariant = false; diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc index 90e561128ca..e5e9367d682 100644 --- a/runtime/vm/compiler/frontend/constant_evaluator.cc +++ b/runtime/vm/compiler/frontend/constant_evaluator.cc @@ -830,7 +830,7 @@ const Object& ConstantEvaluator::RunFunction(TokenPosition position, // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so // we should never end up evaluating constants using the VM's constant // evaluator. - if (I->strong() && FLAG_precompiled_mode) { + if (FLAG_strong && FLAG_precompiled_mode) { UNREACHABLE(); } @@ -912,7 +912,7 @@ RawObject* ConstantEvaluator::EvaluateConstConstructorCall( // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so // we should never end up evaluating constants using the VM's constant // evaluator. - if (I->strong() && FLAG_precompiled_mode) { + if (FLAG_strong && FLAG_precompiled_mode) { UNREACHABLE(); } diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc index c72445b7655..933606730bb 100644 --- a/runtime/vm/compiler/frontend/flow_graph_builder.cc +++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc @@ -941,7 +941,7 @@ BlockEntryInstr* TestGraphVisitor::CreateFalseSuccessor() const { void TestGraphVisitor::ReturnValue(Value* value) { Isolate* isolate = Isolate::Current(); - if (isolate->strong() || isolate->type_checks() || isolate->asserts()) { + if (FLAG_strong || isolate->type_checks() || isolate->asserts()) { value = Bind(new (Z) AssertBooleanInstr(condition_token_pos(), value, owner()->GetNextDeoptId())); } @@ -1286,7 +1286,7 @@ void EffectGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) { node->left()->Visit(&for_left); EffectGraphVisitor empty(owner()); Isolate* isolate = Isolate::Current(); - if (isolate->strong() || isolate->type_checks() || isolate->asserts()) { + if (FLAG_strong || isolate->type_checks() || isolate->asserts()) { ValueGraphVisitor for_right(owner()); node->right()->Visit(&for_right); Value* right_value = for_right.value(); @@ -1350,7 +1350,7 @@ void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) { node->right()->Visit(&for_right); Value* right_value = for_right.value(); Isolate* isolate = Isolate::Current(); - if (isolate->strong() || isolate->type_checks() || isolate->asserts()) { + if (FLAG_strong || isolate->type_checks() || isolate->asserts()) { right_value = for_right.Bind(new (Z) AssertBooleanInstr( node->right()->token_pos(), right_value, owner()->GetNextDeoptId())); } @@ -1622,7 +1622,7 @@ void EffectGraphVisitor::VisitComparisonNode(ComparisonNode* node) { owner()->ic_data_array(), owner()->GetNextDeoptId()); if (node->kind() == Token::kNE) { Isolate* isolate = Isolate::Current(); - if (isolate->strong() || isolate->type_checks() || isolate->asserts()) { + if (FLAG_strong || isolate->type_checks() || isolate->asserts()) { Value* value = Bind(result); result = new (Z) AssertBooleanInstr(node->token_pos(), value, owner()->GetNextDeoptId()); @@ -1666,7 +1666,7 @@ void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) { Append(for_value); Value* value = for_value.value(); Isolate* isolate = Isolate::Current(); - if (isolate->strong() || isolate->type_checks() || isolate->asserts()) { + if (FLAG_strong || isolate->type_checks() || isolate->asserts()) { value = Bind(new (Z) AssertBooleanInstr( node->operand()->token_pos(), value, owner()->GetNextDeoptId())); } @@ -2744,7 +2744,7 @@ Value* EffectGraphVisitor::BuildFunctionTypeArguments(TokenPosition token_pos) { LocalVariable* function_type_arguments_var = owner()->parsed_function().function_type_arguments(); if (function_type_arguments_var == NULL) { - ASSERT(!owner()->isolate()->reify_generic_functions()); + ASSERT(!FLAG_reify_generic_functions); return BuildNullValue(token_pos); } return Bind(BuildLoadLocal(*function_type_arguments_var, token_pos)); @@ -3383,7 +3383,7 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) { const String& name = String::ZoneHandle(Z, function.native_name()); const intptr_t num_params = function.NumParameters(); ZoneGrowableArray* args = NULL; - if (function.IsGeneric() && owner()->isolate()->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { args = new (Z) ZoneGrowableArray(1 + num_params); LocalVariable* type_args = pf.RawTypeArgumentsVariable(); ASSERT(type_args != NULL); @@ -3834,7 +3834,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) { // Load the passed-in type argument vector from the temporary stack slot, // prepend the function type arguments of the generic parent function, and // store it to the final location, possibly in the context. - if (owner()->isolate()->reify_generic_functions() && is_top_level_sequence && + if (FLAG_reify_generic_functions && is_top_level_sequence && function.IsGeneric()) { const ParsedFunction& parsed_function = owner()->parsed_function(); LocalVariable* type_args_var = parsed_function.function_type_arguments(); diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc index 777e05c8f9d..8d2a5212e35 100644 --- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc +++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc @@ -428,7 +428,7 @@ Fragment StreamingFlowGraphBuilder::BuildInitializers( Fragment StreamingFlowGraphBuilder::BuildDefaultTypeHandling( const Function& function, intptr_t type_parameters_offset) { - if (function.IsGeneric() && I->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); SetOffset(type_parameters_offset); intptr_t num_type_params = ReadListLength(); @@ -544,7 +544,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction( FunctionNodeHelper::kPositionalParameters); intptr_t type_args_len = 0; - if (I->reify_generic_functions() && function.IsGeneric()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { type_args_len = function.NumTypeParameters(); ASSERT(parsed_function()->function_type_arguments() != NULL); body += LoadLocal(parsed_function()->function_type_arguments()); @@ -703,7 +703,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfNoSuchMethodForwarder( body += IntConstant(0); body += StoreLocal(TokenPosition::kNoSource, argument_count_var); body += Drop(); - if (function.IsGeneric() && Isolate::Current()->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { Fragment then; Fragment otherwise; otherwise += IntConstant(1); @@ -752,7 +752,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfNoSuchMethodForwarder( // arguments[0] = function_type_arguments; // i = 1; // } - if (function.IsGeneric() && Isolate::Current()->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { Fragment store; store += LoadLocal(arguments); store += IntConstant(0); @@ -965,7 +965,7 @@ void StreamingFlowGraphBuilder::BuildArgumentTypeChecks( } const bool has_reified_type_arguments = - I->strong() && I->reify_generic_functions(); + FLAG_strong && FLAG_reify_generic_functions; TypeParameter& forwarding_param = TypeParameter::Handle(Z); Fragment check_bounds; @@ -1094,7 +1094,7 @@ void StreamingFlowGraphBuilder::BuildArgumentTypeChecks( } Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) { - ASSERT(I->strong()); + ASSERT(FLAG_strong); FunctionNodeHelper function_node_helper(this); function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters); @@ -1109,7 +1109,7 @@ Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) { helper.Finish(); } - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { body += LoadLocal(parsed_function()->function_type_arguments()); body += PushArgument(); pushed->type_args_len = num_type_params; @@ -1318,7 +1318,7 @@ Fragment StreamingFlowGraphBuilder::TypeArgumentsHandling( if (dart_function.IsClosureFunction() && dart_function.NumParentTypeParameters() > 0 && - I->reify_generic_functions()) { + FLAG_reify_generic_functions) { LocalVariable* closure = parsed_function()->node_sequence()->scope()->VariableAt(0); @@ -2981,7 +2981,7 @@ Fragment StreamingFlowGraphBuilder::BuildPropertyGet(TokenPosition* p) { const Function* interface_target = &Function::null_function(); const NameIndex itarget_name = ReadCanonicalNameReference(); // read interface_target_reference. - if (I->strong() && !H.IsRoot(itarget_name) && + if (FLAG_strong && !H.IsRoot(itarget_name) && (H.IsGetter(itarget_name) || H.IsField(itarget_name))) { interface_target = &Function::ZoneHandle( Z, @@ -3061,7 +3061,7 @@ Fragment StreamingFlowGraphBuilder::BuildPropertySet(TokenPosition* p) { const Function* interface_target = &Function::null_function(); const NameIndex itarget_name = ReadCanonicalNameReference(); // read interface_target_reference. - if (I->strong() && !H.IsRoot(itarget_name)) { + if (FLAG_strong && !H.IsRoot(itarget_name)) { interface_target = &Function::ZoneHandle( Z, H.LookupMethodByMember(itarget_name, H.DartSetterName(itarget_name))); @@ -3571,7 +3571,7 @@ Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) { intptr_t type_args_len = 0; LocalVariable* type_arguments_temp = NULL; - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); SkipExpression(); // skip receiver SkipName(); // skip method name @@ -3659,7 +3659,7 @@ Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) { const Function* interface_target = &Function::null_function(); const NameIndex itarget_name = ReadCanonicalNameReference(); // read interface_target_reference. - if (I->strong() && !H.IsRoot(itarget_name) && !H.IsField(itarget_name)) { + if (FLAG_strong && !H.IsRoot(itarget_name) && !H.IsField(itarget_name)) { interface_target = &Function::ZoneHandle( Z, H.LookupMethodByMember(itarget_name, H.DartProcedureName(itarget_name))); @@ -3750,7 +3750,7 @@ Fragment StreamingFlowGraphBuilder::BuildDirectMethodInvocation( Fragment instructions; intptr_t type_args_len = 0; - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); SkipExpression(); // skip receiver ReadCanonicalNameReference(); // skip target reference @@ -3816,7 +3816,7 @@ Fragment StreamingFlowGraphBuilder::BuildSuperMethodInvocation( inferred_type_metadata_helper_.GetInferredType(offset); intptr_t type_args_len = 0; - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); SkipName(); // skip method name ReadUInt(); // read argument count. @@ -3920,7 +3920,7 @@ Fragment StreamingFlowGraphBuilder::BuildSuperMethodInvocation( } else { Fragment instructions; - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); ReadUInt(); // read argument count. intptr_t list_length = ReadListLength(); // read types list length. @@ -4019,7 +4019,7 @@ Fragment StreamingFlowGraphBuilder::BuildStaticInvocation(bool is_const, const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass); instructions += TranslateInstantiatedTypeArguments(type_arguments); instructions += PushArgument(); - } else if (!special_case && I->reify_generic_functions()) { + } else if (!special_case && FLAG_reify_generic_functions) { AlternativeReadingScope alt(&reader_); ReadUInt(); // read argument count. intptr_t list_length = ReadListLength(); // read types list length. @@ -4224,7 +4224,7 @@ Fragment StreamingFlowGraphBuilder::TranslateLogicalExpressionForValue( const bool is_bool = top->IsStrictCompare() || top->IsBooleanNegate(); if (!is_bool) { right_value += CheckBoolean(position); - if (!I->strong()) { + if (!FLAG_strong) { right_value += Constant(Bool::True()); right_value += StrictCompare(Token::kEQ_STRICT); } diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc index 0f88c259d45..1df89e83777 100644 --- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc +++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc @@ -297,14 +297,14 @@ void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(bool simple) { void KernelFingerprintHelper::CalculateGetterNameFingerprint() { const NameIndex name = ReadCanonicalNameReference(); - if (I->strong() && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) { + if (FLAG_strong && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) { BuildHash(H.DartGetterName(name).Hash()); } } void KernelFingerprintHelper::CalculateSetterNameFingerprint() { const NameIndex name = ReadCanonicalNameReference(); - if (I->strong() && !H.IsRoot(name)) { + if (FLAG_strong && !H.IsRoot(name)) { BuildHash(H.DartSetterName(name).Hash()); } } @@ -312,7 +312,7 @@ void KernelFingerprintHelper::CalculateSetterNameFingerprint() { void KernelFingerprintHelper::CalculateMethodNameFingerprint() { const NameIndex name = ReadCanonicalNameReference(); // read interface_target_reference. - if (I->strong() && !H.IsRoot(name) && !H.IsField(name)) { + if (FLAG_strong && !H.IsRoot(name) && !H.IsField(name)) { BuildHash(H.DartProcedureName(name).Hash()); } } diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc index a68d9b9acf0..c81353cfac0 100644 --- a/runtime/vm/compiler/frontend/kernel_to_il.cc +++ b/runtime/vm/compiler/frontend/kernel_to_il.cc @@ -152,7 +152,7 @@ Fragment FlowGraphBuilder::LoadInstantiatorTypeArguments() { // arguments of the current function. Fragment FlowGraphBuilder::LoadFunctionTypeArguments() { Fragment instructions; - if (!Isolate::Current()->reify_generic_functions()) { + if (!FLAG_reify_generic_functions) { instructions += NullConstant(); return instructions; } @@ -451,9 +451,7 @@ Fragment FlowGraphBuilder::NativeCall(const String* name, InlineBailout("kernel::FlowGraphBuilder::NativeCall"); const intptr_t num_args = function->NumParameters() + - ((function->IsGeneric() && Isolate::Current()->reify_generic_functions()) - ? 1 - : 0); + ((function->IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0); ArgumentArray arguments = GetArguments(num_args); NativeCallInstr* call = new (Z) NativeCallInstr(name, function, FLAG_link_natives_lazily, @@ -470,7 +468,7 @@ Fragment FlowGraphBuilder::Return(TokenPosition position, // Emit a type check of the return type in checked mode for all functions // and in strong mode for native functions. if (!omit_result_type_check && - (I->type_checks() || (function.is_native() && I->strong()))) { + (I->type_checks() || (function.is_native() && FLAG_strong))) { const AbstractType& return_type = AbstractType::Handle(Z, function.result_type()); instructions += CheckAssignable(return_type, Symbols::FunctionResult()); @@ -928,8 +926,7 @@ Fragment FlowGraphBuilder::NativeFunctionBody(const Function& function, break; default: { String& name = String::ZoneHandle(Z, function.native_name()); - if (function.IsGeneric() && - Isolate::Current()->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { body += LoadLocal(parsed_function_->RawTypeArgumentsVariable()); body += PushArgument(); } @@ -1046,7 +1043,7 @@ Fragment FlowGraphBuilder::EvaluateAssertion() { Fragment FlowGraphBuilder::CheckBoolean(TokenPosition position) { Fragment instructions; - if (I->strong() || I->type_checks() || I->asserts()) { + if (FLAG_strong || I->type_checks() || I->asserts()) { LocalVariable* top_of_stack = MakeTemporary(); instructions += LoadLocal(top_of_stack); instructions += AssertBool(position); diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc index 14a60fe1cfd..313106e3551 100644 --- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc +++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc @@ -2865,7 +2865,7 @@ void TypeTranslator::BuildTypeParameterType() { : 0; if (procedure_type_parameter_count > 0) { if (procedure_type_parameter_count > parameter_index) { - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { result_ ^= TypeArguments::Handle(Z, active_class_->member->type_parameters()) .TypeAt(parameter_index); @@ -2884,7 +2884,7 @@ void TypeTranslator::BuildTypeParameterType() { if (active_class_->local_type_parameters != NULL) { if (parameter_index < active_class_->local_type_parameters->Length()) { - if (I->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { result_ ^= active_class_->local_type_parameters->TypeAt(parameter_index); } else { diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc index 0ab23155ebc..88490a4af05 100644 --- a/runtime/vm/compiler/frontend/prologue_builder.cc +++ b/runtime/vm/compiler/frontend/prologue_builder.cc @@ -34,8 +34,7 @@ bool PrologueBuilder::HasEmptyPrologue(const Function& function) { BlockEntryInstr* PrologueBuilder::BuildPrologue(BlockEntryInstr* entry, PrologueInfo* prologue_info) { - Isolate* isolate = Isolate::Current(); - const bool strong = isolate->strong(); + const bool strong = FLAG_strong; // We always have to build the graph, but we only link it sometimes. const bool link = !is_inlining_ && !compiling_for_osr_; @@ -44,7 +43,7 @@ BlockEntryInstr* PrologueBuilder::BuildPrologue(BlockEntryInstr* entry, const bool load_optional_arguments = function_.HasOptionalParameters(); const bool expect_type_args = - function_.IsGeneric() && isolate->reify_generic_functions(); + function_.IsGeneric() && FLAG_reify_generic_functions; const bool check_arguments = function_.IsClosureFunction(); Fragment prologue = Fragment(entry); diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc index 4baa72b9d77..da1176487dd 100644 --- a/runtime/vm/compiler/frontend/scope_builder.cc +++ b/runtime/vm/compiler/frontend/scope_builder.cc @@ -116,7 +116,7 @@ ScopeBuildingResult* ScopeBuilder::BuildScopes() { scope_->set_end_token_pos(function.end_token_pos()); // Add function type arguments variable before current context variable. - if (I->reify_generic_functions() && + if (FLAG_reify_generic_functions && (function.IsGeneric() || function.HasGenericParent())) { LocalVariable* type_args_var = MakeVariable( TokenPosition::kNoSource, TokenPosition::kNoSource, diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc index d78ff5cc14b..b366d4b9311 100644 --- a/runtime/vm/dart.cc +++ b/runtime/vm/dart.cc @@ -694,7 +694,7 @@ const char* Dart::FeaturesString(Isolate* isolate, // isolate is always initialized from a vm_snapshot generated in non strong // mode. if (!is_vm_isolate) { - ADD_FLAG(strong, strong, FLAG_strong); + buffer.AddString(FLAG_strong ? " strong" : " no-strong"); } if (Snapshot::IncludesCode(kind)) { @@ -706,9 +706,10 @@ const char* Dart::FeaturesString(Isolate* isolate, ADD_FLAG(error_on_bad_override, enable_error_on_bad_override, FLAG_error_on_bad_override); // sync-async and reify_generic_functions also affect deopt_ids. - ADD_FLAG(sync_async, sync_async, FLAG_sync_async); - ADD_FLAG(reify_generic_functions, reify_generic_functions, - FLAG_reify_generic_functions); + buffer.AddString(FLAG_sync_async ? " sync_async" : " no-sync_async"); + buffer.AddString(FLAG_reify_generic_functions + ? " reify_generic_functions" + : " no-reify_generic_functions"); if (kind == Snapshot::kFullJIT) { ADD_FLAG(use_field_guards, use_field_guards, FLAG_use_field_guards); ADD_FLAG(use_osr, use_osr, FLAG_use_osr); @@ -780,6 +781,9 @@ void Dart::ShutdownIsolate(Isolate* isolate) { void Dart::ShutdownIsolate() { Isolate* isolate = Isolate::Current(); isolate->Shutdown(); + if (KernelIsolate::IsKernelIsolate(isolate)) { + KernelIsolate::SetKernelIsolate(NULL); + } delete isolate; } diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc index 5cf89d73763..717daf367d9 100644 --- a/runtime/vm/dart_api_impl.cc +++ b/runtime/vm/dart_api_impl.cc @@ -1487,7 +1487,7 @@ Dart_CreateScriptSnapshot(uint8_t** script_snapshot_buffer, Isolate* I = T->isolate(); CHECK_NULL(script_snapshot_buffer); CHECK_NULL(script_snapshot_size); - if (I->strong()) { + if (I->use_dart_frontend()) { return Api::NewError("Script snapshots are not supported in Dart 2"); } // Finalize all classes if needed. @@ -5078,7 +5078,7 @@ DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer, if (buffer == NULL) { RETURN_NULL_ERROR(buffer); } - if (I->strong()) { + if (I->use_dart_frontend()) { return Api::NewError("Script snapshots are not supported in Dart 2"); } NoHeapGrowthControlScope no_growth_control; diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc index e9827361ed3..435fb268b8e 100644 --- a/runtime/vm/dart_entry.cc +++ b/runtime/vm/dart_entry.cc @@ -116,7 +116,7 @@ RawObject* DartEntry::InvokeFunction(const Function& function, // and never start the VM service isolate. So we should never end up invoking // any dart code in the Dart 2.0 AOT compiler. #if !defined(DART_PRECOMPILED_RUNTIME) - if (Isolate::Current()->strong() && FLAG_precompiled_mode) { + if (FLAG_strong && FLAG_precompiled_mode) { UNREACHABLE(); } #endif // !defined(DART_PRECOMPILED_RUNTIME) diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h index 54ee710685d..ed632b09219 100644 --- a/runtime/vm/flag_list.h +++ b/runtime/vm/flag_list.h @@ -156,13 +156,13 @@ constexpr bool kDartPrecompiledRuntime = false; R(profiler, false, bool, false, "Enable the profiler.") \ R(profiler_native_memory, false, bool, false, \ "Enable native memory statistic collection.") \ - P(reify_generic_functions, bool, false, \ + P(reify_generic_functions, bool, true, \ "Enable reification of generic functions (not yet supported).") \ P(reorder_basic_blocks, bool, true, "Reorder basic blocks") \ C(stress_async_stacks, false, false, bool, false, \ "Stress test async stack traces") \ - P(strong, bool, false, "Enable strong mode.") \ - P(sync_async, bool, false, "Start `async` functions synchronously.") \ + P(strong, bool, true, "Enable strong mode.") \ + P(sync_async, bool, true, "Start `async` functions synchronously.") \ R(support_ast_printer, false, bool, true, "Support the AST printer.") \ R(support_compiler_stats, false, bool, true, "Support compiler stats.") \ R(support_disassembler, false, bool, true, "Support the disassembler.") \ diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc index 00996d2a75d..af54df85721 100644 --- a/runtime/vm/isolate.cc +++ b/runtime/vm/isolate.cc @@ -1083,6 +1083,12 @@ Isolate* Isolate::Init(const char* name_prefix, if (!Thread::EnterIsolate(result)) { // We failed to enter the isolate, it is possible the VM is shutting down, // return back a NULL so that CreateIsolate reports back an error. + if (KernelIsolate::IsKernelIsolate(result)) { + KernelIsolate::SetKernelIsolate(NULL); + } + if (ServiceIsolate::IsServiceIsolate(result)) { + ServiceIsolate::SetServiceIsolate(NULL); + } delete result; return NULL; } diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h index dfd3422b3c5..b40651f0249 100644 --- a/runtime/vm/isolate.h +++ b/runtime/vm/isolate.h @@ -141,10 +141,6 @@ typedef FixedCache CatchEntryStateCache; V(NONPRODUCT, type_checks, EnableTypeChecks, enable_type_checks, \ FLAG_enable_type_checks) \ V(NONPRODUCT, asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts) \ - V(PRODUCT, reify_generic_functions, ReifyGenericFunctions, \ - reify_generic_functions, FLAG_reify_generic_functions) \ - V(PRODUCT, sync_async, SyncAsync, sync_async, FLAG_sync_async) \ - V(PRODUCT, strong, Strong, strong, FLAG_strong) \ V(NONPRODUCT, error_on_bad_type, ErrorOnBadType, enable_error_on_bad_type, \ FLAG_error_on_bad_type) \ V(NONPRODUCT, error_on_bad_override, ErrorOnBadOverride, \ @@ -705,7 +701,7 @@ class Isolate : public BaseIsolate { } bool can_use_strong_mode_types() const { - return strong() && FLAG_use_strong_mode_types && + return FLAG_strong && FLAG_use_strong_mode_types && !unsafe_trust_strong_mode_types(); } @@ -769,7 +765,7 @@ class Isolate : public BaseIsolate { } bool should_emit_strong_mode_checks() const { - return strong() && !unsafe_trust_strong_mode_types(); + return FLAG_strong && !unsafe_trust_strong_mode_types(); } static void KillAllIsolates(LibMsgId msg_id); @@ -884,9 +880,6 @@ class Isolate : public BaseIsolate { V(EnableAsserts) \ V(ErrorOnBadType) \ V(ErrorOnBadOverride) \ - V(ReifyGenericFunctions) \ - V(SyncAsync) \ - V(Strong) \ V(UseFieldGuards) \ V(UseOsr) \ V(Obfuscate) \ diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc index b3e05e60ef0..7bbc8f8aaec 100644 --- a/runtime/vm/kernel.cc +++ b/runtime/vm/kernel.cc @@ -593,7 +593,7 @@ RawObject* BuildParameterDescriptor(const Function& function) { } bool NeedsDynamicInvocationForwarder(const Function& function) { - ASSERT(Isolate::Current()->strong()); + ASSERT(FLAG_strong); Thread* thread = Thread::Current(); Zone* zone = thread->zone(); diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc index 863f5ed4463..7a132b56005 100644 --- a/runtime/vm/kernel_isolate.cc +++ b/runtime/vm/kernel_isolate.cc @@ -93,10 +93,7 @@ class RunKernelTask : public ThreadPool::Task { api_flags.enable_error_on_bad_type = false; api_flags.enable_error_on_bad_override = false; api_flags.use_dart_frontend = true; - api_flags.reify_generic_functions = true; - api_flags.strong = true; api_flags.unsafe_trust_strong_mode_types = false; - api_flags.sync_async = true; #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) api_flags.use_field_guards = true; #endif @@ -177,9 +174,6 @@ class RunKernelTask : public ThreadPool::Task { if (FLAG_trace_kernel) { OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Shutdown.\n"); } - // This should be the last line so the check - // IsKernelIsolate works during the shutdown process. - KernelIsolate::SetKernelIsolate(NULL); } bool RunMain(Isolate* I) { @@ -451,7 +445,7 @@ class KernelCompilationRequest : public ValueObject { Dart_CObject dart_sync_async; dart_sync_async.type = Dart_CObject_kBool; - dart_sync_async.value.as_bool = isolate->sync_async(); + dart_sync_async.value.as_bool = FLAG_sync_async; Dart_CObject* message_arr[] = {&tag, &send_port, @@ -571,7 +565,7 @@ class KernelCompilationRequest : public ValueObject { Dart_CObject dart_sync_async; dart_sync_async.type = Dart_CObject_kBool; - dart_sync_async.value.as_bool = isolate->sync_async(); + dart_sync_async.value.as_bool = FLAG_sync_async; Dart_CObject package_config_uri; if (package_config != NULL) { diff --git a/runtime/vm/mixin_test.cc b/runtime/vm/mixin_test.cc index 04556da77b0..0a10a173bc4 100644 --- a/runtime/vm/mixin_test.cc +++ b/runtime/vm/mixin_test.cc @@ -84,11 +84,10 @@ TEST_CASE(Mixin_PrivateSuperResolutionCrossLibraryShouldFail) { }}; // clang-format on - Isolate* isolate = Isolate::Current(); Dart_Handle lib = TestCase::LoadTestScriptWithDFE( sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles, /* resolver= */ NULL, /* finalize= */ true, /* incrementally= */ true); - if (isolate->strong()) { + if (FLAG_strong) { EXPECT_ERROR(lib, "Error: Superclass has no method named '_bar'."); } else { EXPECT_VALID(lib); diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h index 38fac512ea2..1b904c5fbab 100644 --- a/runtime/vm/native_arguments.h +++ b/runtime/vm/native_arguments.h @@ -182,7 +182,7 @@ class NativeArguments { if (function.IsClosureFunction()) { function_bits |= kClosureFunctionBit; } - if (function.IsGeneric() && Isolate::Current()->reify_generic_functions()) { + if (function.IsGeneric() && FLAG_reify_generic_functions) { function_bits |= kGenericFunctionBit; argc++; } diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index ac1b716a354..9520a9620a4 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -4335,7 +4335,6 @@ bool Class::TypeTestNonRecursive(const Class& cls, // instead of recursing, reset it to the super class and loop. Thread* thread = Thread::Current(); Zone* zone = thread->zone(); - Isolate* isolate = thread->isolate(); Class& this_class = Class::Handle(zone, cls.raw()); while (true) { // Each occurrence of DynamicType in type T is interpreted as the dynamic @@ -4351,13 +4350,12 @@ bool Class::TypeTestNonRecursive(const Class& cls, } // Class FutureOr is mapped to dynamic in non-strong mode. // Detect snapshots compiled in strong mode and run in non-strong mode. - ASSERT(isolate->strong() || !other.IsFutureOrClass()); + ASSERT(FLAG_strong || !other.IsFutureOrClass()); // In strong mode, check if 'other' is 'FutureOr'. // If so, apply additional subtyping rules. - if (isolate->strong() && - this_class.FutureOrTypeTest(zone, type_arguments, other, - other_type_arguments, bound_error, - bound_trail, space)) { + if (FLAG_strong && this_class.FutureOrTypeTest( + zone, type_arguments, other, other_type_arguments, + bound_error, bound_trail, space)) { return true; } // In the case of a subtype test, each occurrence of DynamicType in type S @@ -4365,7 +4363,7 @@ bool Class::TypeTestNonRecursive(const Class& cls, // strong mode. // However, DynamicType is not more specific than any type. if (this_class.IsDynamicClass()) { - return !isolate->strong() && (test_kind == Class::kIsSubtypeOf); + return !FLAG_strong && (test_kind == Class::kIsSubtypeOf); } // If other is neither Object, dynamic or void, then ObjectType/VoidType // can't be a subtype of other. @@ -4392,14 +4390,14 @@ bool Class::TypeTestNonRecursive(const Class& cls, // Other type can't be more specific than this one because for that // it would have to have all dynamic type arguments which is checked // above. - return !isolate->strong() && (test_kind == Class::kIsSubtypeOf); + return !FLAG_strong && (test_kind == Class::kIsSubtypeOf); } return type_arguments.TypeTest(test_kind, other_type_arguments, from_index, num_type_params, bound_error, bound_trail, space); } // In strong mode, subtyping rules of callable instances are restricted. - if (!isolate->strong() && other.IsDartFunctionClass()) { + if (!FLAG_strong && other.IsDartFunctionClass()) { // Check if type S has a call() method. const Function& call_function = Function::Handle(zone, this_class.LookupCallFunctionForTypeTest()); @@ -4459,7 +4457,7 @@ bool Class::TypeTestNonRecursive(const Class& cls, } } // In Dart 2, implementing Function has no meaning. - if (isolate->strong() && interface_class.IsDartFunctionClass()) { + if (FLAG_strong && interface_class.IsDartFunctionClass()) { continue; } if (interface_class.TypeTest(test_kind, interface_args, other, @@ -4505,7 +4503,7 @@ bool Class::FutureOrTypeTest(Zone* zone, Heap::Space space) const { // In strong mode, there is no difference between 'is subtype of' and // 'is more specific than'. - ASSERT(Isolate::Current()->strong()); + ASSERT(FLAG_strong); if (other.IsFutureOrClass()) { if (other_type_arguments.IsNull()) { return true; @@ -5242,7 +5240,7 @@ RawString* TypeArguments::SubvectorName(intptr_t from_index, name = type.BuildName(name_visibility); } else { // Show dynamic type argument in strong mode. - ASSERT(thread->isolate()->strong()); + ASSERT(FLAG_strong); name = Symbols::Dynamic().raw(); } pieces.Add(name); @@ -7060,7 +7058,7 @@ const char* Function::ToQualifiedCString() const { bool Function::HasCompatibleParametersWith(const Function& other, Error* bound_error) const { ASSERT(Isolate::Current()->error_on_bad_override()); - ASSERT(!Isolate::Current()->strong()); + ASSERT(!FLAG_strong); ASSERT((bound_error != NULL) && bound_error->IsNull()); // Check that this function's signature type is a subtype of the other // function's signature type. @@ -7235,7 +7233,7 @@ bool Function::TestParameterType(TypeTestKind test_kind, Error* bound_error, TrailPtr bound_trail, Heap::Space space) const { - if (Isolate::Current()->strong()) { + if (FLAG_strong) { const AbstractType& param_type = AbstractType::Handle(ParameterTypeAt(parameter_position)); if (param_type.IsTopType()) { @@ -7326,8 +7324,7 @@ bool Function::TypeTest(TypeTestKind test_kind, (num_opt_named_params < other_num_opt_named_params)) { return false; } - Isolate* isolate = Isolate::Current(); - if (isolate->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { // Check the type parameters and bounds of generic functions. if (!HasSameTypeParametersAndBounds(other)) { return false; @@ -7338,7 +7335,7 @@ bool Function::TypeTest(TypeTestKind test_kind, // Check the result type. const AbstractType& other_res_type = AbstractType::Handle(zone, other.result_type()); - if (isolate->strong()) { + if (FLAG_strong) { // In strong mode, 'void Function()' is a subtype of 'Object Function()'. if (!other_res_type.IsTopType()) { const AbstractType& res_type = AbstractType::Handle(zone, result_type()); @@ -7710,7 +7707,7 @@ RawFunction* Function::ImplicitClosureFunction() const { // In strong mode, change covariant parameter types to Object in the implicit // closure of a method compiled by kernel. // The VM's parser erases covariant types immediately in strong mode. - if (thread->isolate()->strong() && !is_static() && kernel_offset() > 0) { + if (FLAG_strong && !is_static() && kernel_offset() > 0) { const Script& function_script = Script::Handle(zone, script()); kernel::TranslationHelper translation_helper(thread); translation_helper.InitFromScript(function_script); @@ -7874,7 +7871,7 @@ RawString* Function::BuildSignature(NameVisibility name_visibility) const { Zone* zone = thread->zone(); GrowableHandlePtrArray pieces(zone, 4); String& name = String::Handle(zone); - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { const TypeArguments& type_params = TypeArguments::Handle(zone, type_parameters()); if (!type_params.IsNull()) { @@ -17244,7 +17241,6 @@ bool Instance::IsInstanceOf( } Thread* thread = Thread::Current(); Zone* zone = thread->zone(); - Isolate* isolate = thread->isolate(); const Class& cls = Class::Handle(zone, clazz()); if (cls.IsClosureClass()) { if (other.IsTopType() || other.IsDartFunctionType() || @@ -17269,7 +17265,7 @@ bool Instance::IsInstanceOf( return true; } } - if (isolate->strong() && + if (FLAG_strong && IsFutureOrInstanceOf(zone, instantiated_other, bound_error)) { return true; } @@ -17319,7 +17315,7 @@ bool Instance::IsInstanceOf( other_type_arguments = instantiated_other.arguments(); const bool other_is_dart_function = instantiated_other.IsDartFunctionType(); // In strong mode, subtyping rules of callable instances are restricted. - if (!isolate->strong() && + if (!FLAG_strong && (other_is_dart_function || instantiated_other.IsFunctionType())) { // Check if this instance understands a call() method of a compatible type. Function& sig_fun = @@ -17355,7 +17351,7 @@ bool Instance::IsInstanceOf( ASSERT(cls.IsNullClass()); // As of Dart 1.5, the null instance and Null type are handled differently. // We already checked other for dynamic and void. - if (isolate->strong() && + if (FLAG_strong && IsFutureOrInstanceOf(zone, instantiated_other, bound_error)) { return true; } @@ -17368,7 +17364,7 @@ bool Instance::IsInstanceOf( bool Instance::IsFutureOrInstanceOf(Zone* zone, const AbstractType& other, Error* bound_error) const { - ASSERT(Isolate::Current()->strong()); + ASSERT(FLAG_strong); if (other.IsType() && Class::Handle(zone, other.type_class()).IsFutureOrClass()) { if (other.arguments() == TypeArguments::null()) { @@ -17947,7 +17943,7 @@ RawString* AbstractType::BuildName(NameVisibility name_visibility) const { } else { ASSERT(num_args == 0); // Type is raw. // No need to fill up with "dynamic", unless running in strong mode. - if (!thread->isolate()->strong()) { + if (!FLAG_strong) { num_type_params = 0; } } @@ -17968,8 +17964,7 @@ RawString* AbstractType::BuildName(NameVisibility name_visibility) const { GrowableHandlePtrArray pieces(zone, 4); pieces.Add(class_name); if ((num_type_params == 0) || - (!thread->isolate()->strong() && - args.IsRaw(first_type_param_index, num_type_params))) { + (!FLAG_strong && args.IsRaw(first_type_param_index, num_type_params))) { // Do nothing. } else { const String& args_name = String::Handle( @@ -18132,7 +18127,6 @@ bool AbstractType::TypeTest(TypeTestKind test_kind, } Thread* thread = Thread::Current(); Zone* zone = thread->zone(); - Isolate* isolate = thread->isolate(); if (IsBoundedType() || other.IsBoundedType()) { if (Equals(other)) { return true; @@ -18212,7 +18206,7 @@ bool AbstractType::TypeTest(TypeTestKind test_kind, } // In strong mode, check if 'other' is 'FutureOr'. // If so, apply additional subtyping rules. - if (isolate->strong() && + if (FLAG_strong && FutureOrTypeTest(zone, other, bound_error, bound_trail, space)) { return true; } @@ -18239,7 +18233,7 @@ bool AbstractType::TypeTest(TypeTestKind test_kind, space); } // In strong mode, subtyping rules of callable instances are restricted. - if (!isolate->strong()) { + if (!FLAG_strong) { // Check if type S has a call() method of function type T. const Function& call_function = Function::Handle(zone, type_cls.LookupCallFunctionForTypeTest()); @@ -18277,7 +18271,7 @@ bool AbstractType::TypeTest(TypeTestKind test_kind, if (IsFunctionType()) { // In strong mode, check if 'other' is 'FutureOr'. // If so, apply additional subtyping rules. - if (isolate->strong() && + if (FLAG_strong && FutureOrTypeTest(zone, other, bound_error, bound_trail, space)) { return true; } @@ -18296,7 +18290,7 @@ bool AbstractType::FutureOrTypeTest(Zone* zone, Heap::Space space) const { // In strong mode, there is no difference between 'is subtype of' and // 'is more specific than'. - ASSERT(Isolate::Current()->strong()); + ASSERT(FLAG_strong); if (other.IsType() && Class::Handle(zone, other.type_class()).IsFutureOrClass()) { if (other.arguments() == TypeArguments::null()) { @@ -18777,7 +18771,7 @@ bool Type::IsEquivalent(const Instance& other, TrailPtr trail) const { const Function& other_sig_fun = Function::Handle(zone, other_type.signature()); - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { // Compare function type parameters and their bounds. // Check the type parameters and bounds of generic functions. if (!sig_fun.HasSameTypeParametersAndBounds(other_sig_fun)) { diff --git a/runtime/vm/object.h b/runtime/vm/object.h index 959070ce5d5..da5971c9a6b 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h @@ -2537,7 +2537,7 @@ class Function : public Object { bool IsInFactoryScope() const; bool NeedsArgumentTypeChecks(Isolate* I) const { - if (I->strong()) { + if (FLAG_strong) { if (!I->should_emit_strong_mode_checks()) { return false; } diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc index d55273e1bfb..1ec727e7619 100644 --- a/runtime/vm/parser.cc +++ b/runtime/vm/parser.cc @@ -197,7 +197,7 @@ ParsedFunction::ParsedFunction(Thread* thread, const Function& function) current_context_var_ = temp; const bool reify_generic_argument = - function.IsGeneric() && Isolate::Current()->reify_generic_functions(); + function.IsGeneric() && FLAG_reify_generic_functions; const bool load_optional_arguments = function.HasOptionalParameters(); @@ -1247,7 +1247,7 @@ void Parser::ParseFunction(ParsedFunction* parsed_function) { } } // ParseFunc has recorded the generic function type arguments variable. - ASSERT(!Isolate::Current()->reify_generic_functions() || + ASSERT(!FLAG_reify_generic_functions || !parser.current_function().IsGeneric() || (parsed_function->function_type_arguments() != NULL)); } @@ -1573,7 +1573,7 @@ SequenceNode* Parser::ParseImplicitClosure(const Function& func) { const Function& parent = Function::Handle(func.parent_function()); intptr_t type_args_len = 0; // Length of type args vector passed to parent. LocalVariable* type_args_var = NULL; - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { // The parent function of an implicit closure is the original function, i.e. // non-closurized. It is not an enclosing function in the usual sense of a // parent function. Do not set parent_type_arguments() in parsed_function_. @@ -3545,7 +3545,7 @@ SequenceNode* Parser::ParseFunc(const Function& func, bool check_semicolon) { current_block_->scope->AddVariable(parsed_function_->arg_desc_var()); } - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { // Lookup function type arguments variable in parent function scope, if any. if (func.HasGenericParent()) { const String* variable_name = &Symbols::FunctionTypeArgumentsVar(); @@ -3802,7 +3802,7 @@ SequenceNode* Parser::ParseFunc(const Function& func, bool check_semicolon) { func.end_token_pos() == end_token_pos); func.set_end_token_pos(end_token_pos); SequenceNode* body = CloseBlock(); - if (Isolate::Current()->reify_generic_functions() && func.IsGeneric() && + if (FLAG_reify_generic_functions && func.IsGeneric() && !generated_body_closure.IsNull()) { LocalVariable* existing_var = body->scope()->LookupVariable( Symbols::FunctionTypeArgumentsVar(), false); @@ -7629,7 +7629,7 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, const TokenPosition token_pos = ST(closure_body->token_pos()); Function& completer_constructor = Function::ZoneHandle(Z); - if (I->sync_async()) { + if (FLAG_sync_async) { const Class& completer_class = Class::Handle( Z, async_lib.LookupClassAllowPrivate(Symbols::_AsyncAwaitCompleter())); ASSERT(!completer_class.IsNull()); @@ -7739,7 +7739,7 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, current_block_->statements->Add(store_async_catch_error_callback); - if (I->sync_async()) { + if (FLAG_sync_async) { // Add to AST: // :async_completer.start(:async_op); ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos); @@ -7823,7 +7823,6 @@ void Parser::FinalizeFormalParameterTypes(const ParamList* params) { // with the formal parameter types and names. void Parser::AddFormalParamsToFunction(const ParamList* params, const Function& func) { - Isolate* isolate = Isolate::Current(); ASSERT((params != NULL) && (params->parameters != NULL)); ASSERT((params->num_optional_parameters > 0) == (params->has_optional_positional_parameters || @@ -7859,7 +7858,7 @@ void Parser::AddFormalParamsToFunction(const ParamList* params, } // In non-strong mode, the covariant keyword is ignored. In strong mode, // the parameter type is changed to Object. - if (isolate->strong()) { + if (FLAG_strong) { param_type = Type::ObjectType(); } } @@ -7940,7 +7939,7 @@ void Parser::CaptureInstantiator() { void Parser::CaptureFunctionTypeArguments() { ASSERT(InGenericFunctionScope()); ASSERT(FunctionLevel() > 0); - if (!Isolate::Current()->reify_generic_functions()) { + if (!FLAG_reify_generic_functions) { return; } const String* variable_name = &Symbols::FunctionTypeArgumentsVar(); @@ -11971,7 +11970,7 @@ AstNode* Parser::LoadTypeParameter(PrimaryNode* primary) { type_parameter ^= CanonicalizeType(type_parameter); } else { ASSERT(type_parameter.IsFunctionTypeParameter()); - if (!Isolate::Current()->reify_generic_functions()) { + if (!FLAG_reify_generic_functions) { Type& type = Type::ZoneHandle(Z, Type::DynamicType()); return new (Z) TypeNode(primary_pos, type); } @@ -12016,7 +12015,7 @@ AstNode* Parser::ParseSelectors(AstNode* primary, bool is_cascade) { if (CurrentToken() == Token::kLT) { // Type arguments. func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() && (FunctionLevel() > 0)) { // Make sure that the instantiators are captured. @@ -12112,7 +12111,7 @@ AstNode* Parser::ParseSelectors(AstNode* primary, bool is_cascade) { if (CurrentToken() == Token::kLT) { // Type arguments. func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() && (FunctionLevel() > 0)) { // Make sure that the instantiators are captured. @@ -12338,7 +12337,7 @@ void Parser::ResolveTypeParameters(AbstractType* type) { String::Handle(Z, type_parameter.name()).ToCString()); return; } - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { ASSERT(!type_parameter.IsMalformed()); *type = type_parameter.raw(); } else { @@ -12943,7 +12942,7 @@ AstNode* Parser::ResolveIdent(TokenPosition ident_pos, if ((resolved == NULL) || (resolved_func_level < type_param_func_level)) { // The identifier is a function type parameter, possibly shadowing // 'resolved'. - if (!Isolate::Current()->reify_generic_functions()) { + if (!FLAG_reify_generic_functions) { Type& type = Type::ZoneHandle(Z, Type::DynamicType()); return new (Z) TypeNode(ident_pos, type); } @@ -14414,7 +14413,7 @@ AstNode* Parser::ParsePrimary() { if (CurrentToken() == Token::kLT) { // Type arguments. func_type_args = ParseTypeArguments(ClassFinalizer::kCanonicalize); - if (Isolate::Current()->reify_generic_functions()) { + if (FLAG_reify_generic_functions) { if (!func_type_args.IsNull() && !func_type_args.IsInstantiated() && (FunctionLevel() > 0)) { // Make sure that the instantiators are captured.