Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index febf56539d1d82ebf8ee61138346a52a4eff9452..f67ade566f075fa6a6f7fa31eb9b0eee835bc6c0 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -3690,13 +3690,13 @@ bool Class::TypeTestNonRecursive(const Class& cls, |
} |
if (other.IsFunctionClass()) { |
// Check if type S has a call() method. |
- Function& function = |
- Function::Handle(zone, thsi.LookupDynamicFunction(Symbols::Call())); |
+ Function& function = Function::Handle(zone, |
+ thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call())); |
if (function.IsNull()) { |
// Walk up the super_class chain. |
Class& cls = Class::Handle(zone, thsi.SuperClass()); |
while (!cls.IsNull() && function.IsNull()) { |
- function = cls.LookupDynamicFunction(Symbols::Call()); |
+ function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
cls = cls.SuperClass(); |
} |
} |
@@ -3819,6 +3819,12 @@ RawFunction* Class::LookupDynamicFunction(const String& name) const { |
} |
+RawFunction* Class::LookupDynamicFunctionAllowAbstract( |
+ const String& name) const { |
+ return LookupFunction(name, kInstanceAllowAbstract); |
+} |
+ |
+ |
RawFunction* Class::LookupDynamicFunctionAllowPrivate( |
const String& name) const { |
return LookupFunctionAllowPrivate(name, kInstance); |
@@ -3891,8 +3897,8 @@ static bool MatchesAccessorName(const String& name, |
RawFunction* Class::CheckFunctionType(const Function& func, MemberKind kind) { |
- if (kind == kInstance) { |
- if (func.IsDynamicFunction()) { |
+ if ((kind == kInstance) || (kind == kInstanceAllowAbstract)) { |
+ if (func.IsDynamicFunction(kind == kInstanceAllowAbstract)) { |
return func.raw(); |
} |
} else if (kind == kStatic) { |
@@ -14289,13 +14295,13 @@ bool Instance::IsInstanceOf(const AbstractType& other, |
const bool other_is_dart_function = instantiated_other.IsDartFunctionType(); |
if (other_is_dart_function || instantiated_other.IsFunctionType()) { |
// Check if this instance understands a call() method of a compatible type. |
- Function& call = |
- Function::Handle(zone, cls.LookupDynamicFunction(Symbols::Call())); |
+ Function& call = Function::Handle(zone, |
+ cls.LookupDynamicFunctionAllowAbstract(Symbols::Call())); |
if (call.IsNull()) { |
// Walk up the super_class chain. |
Class& super_cls = Class::Handle(zone, cls.SuperClass()); |
while (!super_cls.IsNull() && call.IsNull()) { |
- call = super_cls.LookupDynamicFunction(Symbols::Call()); |
+ call = super_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
super_cls = super_cls.SuperClass(); |
} |
} |
@@ -15056,13 +15062,13 @@ bool AbstractType::TypeTest(TypeTestKind test_kind, |
space); |
} |
// Check if type S has a call() method of function type T. |
- Function& function = |
- Function::Handle(zone, type_cls.LookupDynamicFunction(Symbols::Call())); |
+ Function& function = Function::Handle(zone, |
+ type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call())); |
if (function.IsNull()) { |
// Walk up the super_class chain. |
Class& cls = Class::Handle(zone, type_cls.SuperClass()); |
while (!cls.IsNull() && function.IsNull()) { |
- function = cls.LookupDynamicFunction(Symbols::Call()); |
+ function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
cls = cls.SuperClass(); |
} |
} |