Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1015)

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 14980002: Fix for issue 10395, call noSUchMethod if a method is not found when using the Dart C API. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/dart_api_impl_test.cc » ('j') | runtime/vm/dart_api_impl_test.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_api_impl.cc
===================================================================
--- runtime/vm/dart_api_impl.cc (revision 22402)
+++ runtime/vm/dart_api_impl.cc (working copy)
@@ -3805,7 +3805,7 @@
}
if (obj.IsNull() || obj.IsInstance()) {
- Instance& instance = Instance::Handle(isolate);
Ivan Posva 2013/05/07 09:58:43 Any particular reason for dropping the isolate par
siva 2013/05/07 15:40:52 No particular reason. I initially tries to change
+ Instance& instance = Instance::Handle();
instance ^= obj.raw();
const Function& function = Function::Handle(
isolate,
@@ -3813,16 +3813,16 @@
function_name,
(number_of_arguments + 1),
Resolver::kIsQualified));
- // TODO(5415268): Invoke noSuchMethod instead of failing.
+ args.SetAt(0, instance);
if (function.IsNull()) {
- const Type& type = Type::Handle(isolate, instance.GetType());
- const String& cls_name = String::Handle(isolate, type.ClassName());
- return Api::NewError("%s: did not find instance method '%s.%s'.",
- CURRENT_FUNC,
- cls_name.ToCString(),
- function_name.ToCString());
+ const Array& args_descriptor =
+ Array::Handle(ArgumentsDescriptor::New(args.Length()));
+ return Api::NewHandle(isolate,
+ DartEntry::InvokeNoSuchMethod(instance,
+ function_name,
+ args,
+ args_descriptor));
}
- args.SetAt(0, instance);
return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, args));
} else if (obj.IsClass()) {
@@ -3933,9 +3933,9 @@
// field.
const Instance& instance = Instance::Cast(obj);
Class& cls = Class::Handle(isolate, instance.clazz());
+ String& getter_name =
+ String::Handle(isolate, Field::GetterName(field_name));
while (!cls.IsNull()) {
- String& getter_name =
- String::Handle(isolate, Field::GetterName(field_name));
getter = cls.LookupDynamicFunctionAllowPrivate(getter_name);
if (!getter.IsNull()) {
break;
@@ -3943,15 +3943,19 @@
cls = cls.SuperClass();
}
- if (getter.IsNull()) {
- return Api::NewError("%s: did not find instance field '%s'.",
- CURRENT_FUNC, field_name.ToCString());
- }
-
// Invoke the getter and return the result.
const int kNumArgs = 1;
const Array& args = Array::Handle(isolate, Array::New(kNumArgs));
args.SetAt(0, instance);
+ if (getter.IsNull()) {
+ const Array& args_descriptor =
+ Array::Handle(ArgumentsDescriptor::New(args.Length()));
+ return Api::NewHandle(isolate,
+ DartEntry::InvokeNoSuchMethod(instance,
+ getter_name,
+ args,
+ args_descriptor));
+ }
return Api::NewHandle(isolate, DartEntry::InvokeFunction(getter, args));
} else if (obj.IsClass()) {
@@ -4055,14 +4059,14 @@
// field.
const Instance& instance = Instance::Cast(obj);
Class& cls = Class::Handle(isolate, instance.clazz());
+ String& setter_name =
+ String::Handle(isolate, Field::SetterName(field_name));
while (!cls.IsNull()) {
field = cls.LookupInstanceField(field_name);
if (!field.IsNull() && field.is_final()) {
return Api::NewError("%s: cannot set final field '%s'.",
CURRENT_FUNC, field_name.ToCString());
}
- String& setter_name =
- String::Handle(isolate, Field::SetterName(field_name));
setter = cls.LookupDynamicFunctionAllowPrivate(setter_name);
if (!setter.IsNull()) {
break;
@@ -4070,16 +4074,20 @@
cls = cls.SuperClass();
}
- if (setter.IsNull()) {
- return Api::NewError("%s: did not find instance field '%s'.",
- CURRENT_FUNC, field_name.ToCString());
- }
-
// Invoke the setter and return the result.
const int kNumArgs = 2;
const Array& args = Array::Handle(isolate, Array::New(kNumArgs));
args.SetAt(0, instance);
args.SetAt(1, value_instance);
+ if (setter.IsNull()) {
+ const Array& args_descriptor =
+ Array::Handle(ArgumentsDescriptor::New(args.Length()));
+ return Api::NewHandle(isolate,
+ DartEntry::InvokeNoSuchMethod(instance,
+ setter_name,
+ args,
+ args_descriptor));
+ }
return Api::NewHandle(isolate, DartEntry::InvokeFunction(setter, args));
} else if (obj.IsClass()) {
« no previous file with comments | « no previous file | runtime/vm/dart_api_impl_test.cc » ('j') | runtime/vm/dart_api_impl_test.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698