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

Unified Diff: runtime/vm/code_generator.cc

Issue 11523002: Pass the proper invocation mirror argument to noSuchMethod. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years 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 | « runtime/vm/bootstrap_natives.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/code_generator.cc
===================================================================
--- runtime/vm/code_generator.cc (revision 15938)
+++ runtime/vm/code_generator.cc (working copy)
@@ -1184,9 +1184,9 @@
getter_function_name,
kNumArguments,
kNumNamedArguments));
- Code& code = Code::Handle();
+ const Object& null_object = Object::Handle();
if (function.IsNull()) {
- arguments.SetReturn(code);
+ arguments.SetReturn(null_object);
return; // No getter function found so can't be an implicit closure.
}
GrowableArray<const Object*> invoke_arguments(0);
@@ -1199,7 +1199,7 @@
if (result.IsError()) {
if (result.IsUnhandledException()) {
// If the getter throws an exception, treat as no such method.
- arguments.SetReturn(code);
+ arguments.SetReturn(null_object);
return;
} else {
Exceptions::PropagateError(Error::Cast(result));
@@ -1226,7 +1226,6 @@
// TODO(regis): Resolve and invoke "call" method, if existing.
- const Object& null_object = Object::Handle();
dart_arguments.Add(&result);
dart_arguments.Add(&function_name);
dart_arguments.Add(&function_args);
@@ -1281,13 +1280,13 @@
const Instructions& instrs = Instructions::Handle(code.instructions());
ASSERT(!instrs.IsNull());
- // Receiver parameter has already been skipped by caller.
// The closure object is passed as implicit first argument to closure
// functions, since it may be needed to throw a NoSuchMethodError, in case
// the wrong number of arguments is passed.
- GrowableArray<const Object*> invoke_arguments(func_arguments.Length() + 1);
+ // Replace the original receiver in the arguments array by the closure.
+ GrowableArray<const Object*> invoke_arguments(func_arguments.Length());
invoke_arguments.Add(&closure);
- for (intptr_t i = 0; i < func_arguments.Length(); i++) {
+ for (intptr_t i = 1; i < func_arguments.Length(); i++) {
const Object& value = Object::Handle(func_arguments.At(i));
invoke_arguments.Add(&value);
}
@@ -1317,12 +1316,9 @@
const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
const String& original_function_name = String::Handle(ic_data.target_name());
- ASSERT(!Array::CheckedHandle(arguments.ArgAt(2)).IsNull());
+ const Array& orig_arguments_desc = Array::CheckedHandle(arguments.ArgAt(2));
const Array& orig_arguments = Array::CheckedHandle(arguments.ArgAt(3));
// Allocate an InvocationMirror object.
- // TODO(regis): Fill in the InvocationMirror object correctly at
- // this point we do not deal with named arguments and treat them
- // all as positional.
const Library& core_lib = Library::Handle(Library::CoreLibrary());
const String& invocation_mirror_name = String::Handle(
Symbols::InvocationMirror());
@@ -1336,8 +1332,9 @@
allocation_function_name,
Resolver::kIsQualified));
ASSERT(!allocation_function.IsNull());
- GrowableArray<const Object*> allocation_arguments(2);
+ GrowableArray<const Object*> allocation_arguments(3);
allocation_arguments.Add(&original_function_name);
+ allocation_arguments.Add(&orig_arguments_desc);
allocation_arguments.Add(&orig_arguments);
const Array& kNoArgumentNames = Array::Handle();
const Object& invocation_mirror = Object::Handle(
@@ -1369,7 +1366,7 @@
// A non-closure object was invoked as a closure, so call the "call" method
// on it.
// Arg0: non-closure object.
-// Arg1: arguments array.
+// Arg1: arguments array, including non-closure object.
// TODO(regis): Rename this entry?
DEFINE_RUNTIME_ENTRY(ReportObjectNotClosure, 2) {
ASSERT(arguments.ArgCount() ==
« no previous file with comments | « runtime/vm/bootstrap_natives.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698