| Index: runtime/vm/flow_graph_compiler_x64.cc
|
| diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
|
| index 30382e6e81dd26cbca8c9ba3aab6572bbee1f2fa..5e176e5df1936242a55d5dc8ed85611f5a27c45c 100644
|
| --- a/runtime/vm/flow_graph_compiler_x64.cc
|
| +++ b/runtime/vm/flow_graph_compiler_x64.cc
|
| @@ -274,7 +274,7 @@ FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
|
| __ Comment("InstantiatedTypeWithArgumentsTest");
|
| ASSERT(type.IsInstantiated());
|
| const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
|
| - ASSERT((type_class.NumTypeArguments() > 0) || type_class.IsSignatureClass());
|
| + ASSERT(type.IsFunctionType() || (type_class.NumTypeArguments() > 0));
|
| const Register kInstanceReg = RAX;
|
| Error& bound_error = Error::Handle(zone());
|
| const Type& int_type = Type::Handle(zone(), Type::IntType());
|
| @@ -287,15 +287,15 @@ FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
|
| } else {
|
| __ j(ZERO, is_not_instance_lbl);
|
| }
|
| - const intptr_t num_type_args = type_class.NumTypeArguments();
|
| - const intptr_t num_type_params = type_class.NumTypeParameters();
|
| - const intptr_t from_index = num_type_args - num_type_params;
|
| - const TypeArguments& type_arguments =
|
| - TypeArguments::ZoneHandle(zone(), type.arguments());
|
| - const bool is_raw_type = type_arguments.IsNull() ||
|
| - type_arguments.IsRaw(from_index, num_type_params);
|
| - // Signature class is an instantiated parameterized type.
|
| - if (!type_class.IsSignatureClass()) {
|
| + // A function type test requires checking the function signature.
|
| + if (!type.IsFunctionType()) {
|
| + const intptr_t num_type_args = type_class.NumTypeArguments();
|
| + const intptr_t num_type_params = type_class.NumTypeParameters();
|
| + const intptr_t from_index = num_type_args - num_type_params;
|
| + const TypeArguments& type_arguments =
|
| + TypeArguments::ZoneHandle(zone(), type.arguments());
|
| + const bool is_raw_type = type_arguments.IsNull() ||
|
| + type_arguments.IsRaw(from_index, num_type_params);
|
| if (is_raw_type) {
|
| const Register kClassIdReg = R10;
|
| // dynamic type argument, check only classes.
|
| @@ -362,6 +362,10 @@ bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
|
| Label* is_not_instance_lbl) {
|
| __ Comment("InstantiatedTypeNoArgumentsTest");
|
| ASSERT(type.IsInstantiated());
|
| + if (type.IsFunctionType()) {
|
| + // Fallthrough.
|
| + return true;
|
| + }
|
| const Class& type_class = Class::Handle(zone(), type.type_class());
|
| ASSERT(type_class.NumTypeArguments() == 0);
|
|
|
| @@ -392,12 +396,10 @@ bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
|
| __ jmp(is_not_instance_lbl);
|
| return false;
|
| }
|
| - if (type.IsFunctionType()) {
|
| + if (type.IsDartFunctionType()) {
|
| // Check if instance is a closure.
|
| - __ LoadClassById(R13, kClassIdReg);
|
| - __ movq(R13, FieldAddress(R13, Class::signature_function_offset()));
|
| - __ CompareObject(R13, Object::null_object());
|
| - __ j(NOT_EQUAL, is_instance_lbl);
|
| + __ cmpq(kClassIdReg, Immediate(kClosureCid));
|
| + __ j(EQUAL, is_instance_lbl);
|
| }
|
| // Custom checking for numbers (Smi, Mint, Bigint and Double).
|
| // Note that instance is not Smi (checked above).
|
| @@ -549,10 +551,10 @@ RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
|
| }
|
| if (type.IsInstantiated()) {
|
| const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
|
| - // A class equality check is only applicable with a dst type of a
|
| - // non-parameterized class, non-signature class, or with a raw dst type of
|
| + // A class equality check is only applicable with a dst type (not a
|
| + // function type) of a non-parameterized class or with a raw dst type of
|
| // a parameterized class.
|
| - if (type_class.IsSignatureClass() || (type_class.NumTypeArguments() > 0)) {
|
| + if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) {
|
| return GenerateInstantiatedTypeWithArgumentsTest(token_pos,
|
| type,
|
| is_instance_lbl,
|
|
|