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

Side by Side Diff: runtime/vm/stub_code_x64.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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | tests/co19/co19-runtime.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/assembler_macros.h" 9 #include "vm/assembler_macros.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 __ cmpq(RCX, raw_null); 336 __ cmpq(RCX, raw_null);
337 Label function_not_found; 337 Label function_not_found;
338 __ j(EQUAL, &function_not_found); 338 __ j(EQUAL, &function_not_found);
339 339
340 // RCX: Closure object. 340 // RCX: Closure object.
341 // R10: Arguments descriptor array. 341 // R10: Arguments descriptor array.
342 __ pushq(raw_null); // Setup space on stack for result from invoking Closure. 342 __ pushq(raw_null); // Setup space on stack for result from invoking Closure.
343 __ pushq(RCX); // Closure object. 343 __ pushq(RCX); // Closure object.
344 __ pushq(R10); // Arguments descriptor. 344 __ pushq(R10); // Arguments descriptor.
345 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset())); 345 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
346 __ SmiUntag(R13); 346 __ SmiUntag(R13); // Arguments array length, including the original receiver.
347 __ subq(R13, Immediate(1)); // Arguments array length, minus the receiver.
348 PushArgumentsArray(assembler, (kWordSize * 6)); 347 PushArgumentsArray(assembler, (kWordSize * 6));
349 // Stack layout explaining "(kWordSize * 6)" offset. 348 // Stack layout explaining "(kWordSize * 6)" offset.
350 // TOS + 0: Argument array. 349 // TOS + 0: Argument array.
351 // TOS + 1: Arguments descriptor array. 350 // TOS + 1: Arguments descriptor array.
352 // TOS + 2: Closure object. 351 // TOS + 2: Closure object.
353 // TOS + 3: Place for result from closure function. 352 // TOS + 3: Place for result from closure function.
354 // TOS + 4: PC marker => RawInstruction object. 353 // TOS + 4: PC marker => RawInstruction object.
355 // TOS + 5: Saved RBP of previous frame. <== RBP 354 // TOS + 5: Saved RBP of previous frame. <== RBP
356 // TOS + 6: Dart code return address 355 // TOS + 6: Dart code return address
357 // TOS + 7: Last argument of caller. 356 // TOS + 7: Last argument of caller.
358 // .... 357 // ....
359 358
360 __ CallRuntime(kInvokeImplicitClosureFunctionRuntimeEntry); 359 __ CallRuntime(kInvokeImplicitClosureFunctionRuntimeEntry);
361 // Remove arguments. 360 // Remove arguments.
362 __ popq(RAX); 361 __ popq(RAX);
363 __ popq(RAX); 362 __ popq(RAX);
364 __ popq(RAX); 363 __ popq(RAX);
365 __ popq(RAX); // Get result into RAX. 364 __ popq(RAX); // Get result into RAX.
366 365
367 // Remove the stub frame as we are about to return. 366 // Remove the stub frame as we are about to return.
368 __ LeaveFrame(); 367 __ LeaveFrame();
369 __ ret(); 368 __ ret();
370 369
371 __ Bind(&function_not_found); 370 __ Bind(&function_not_found);
372 // The target function was not found, so invoke method 371 // The target function was not found, so invoke method
373 // "void noSuchMethod(function_name, args_array)". 372 // "dynamic noSuchMethod(InvocationMirror invocation)".
374 // RAX: receiver. 373 // RAX: receiver.
375 // RBX: ic-data. 374 // RBX: ic-data.
376 // R10: arguments descriptor array. 375 // R10: arguments descriptor array.
377 376
378 __ pushq(raw_null); // Setup space on stack for result from noSuchMethod. 377 __ pushq(raw_null); // Setup space on stack for result from noSuchMethod.
379 __ pushq(RAX); // Receiver. 378 __ pushq(RAX); // Receiver.
380 __ pushq(RBX); // IC-data array. 379 __ pushq(RBX); // IC-data array.
381 __ pushq(R10); // Arguments descriptor array. 380 __ pushq(R10); // Arguments descriptor array.
382 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset())); 381 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
383 __ SmiUntag(R13); 382 __ SmiUntag(R13); // Arguments array length, including the original receiver.
384 __ subq(R13, Immediate(1)); // Arguments array length, minus the receiver.
385 // See stack layout below explaining "wordSize * 7" offset. 383 // See stack layout below explaining "wordSize * 7" offset.
386 PushArgumentsArray(assembler, (kWordSize * 7)); 384 PushArgumentsArray(assembler, (kWordSize * 7));
387 385
388 // Stack: 386 // Stack:
389 // TOS + 0: Arguments array. 387 // TOS + 0: Arguments array.
390 // TOS + 1: Arguments descriptor array. 388 // TOS + 1: Arguments descriptor array.
391 // TOS + 2: IC-data array. 389 // TOS + 2: IC-data array.
392 // TOS + 3: Receiver. 390 // TOS + 3: Receiver.
393 // TOS + 4: Place for result from noSuchMethod. 391 // TOS + 4: Place for result from noSuchMethod.
394 // TOS + 5: PC marker => RawInstruction object. 392 // TOS + 5: PC marker => RawInstruction object.
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 // R10: arguments descriptor array. 767 // R10: arguments descriptor array.
770 768
771 // Create a stub frame as we are pushing some objects on the stack before 769 // Create a stub frame as we are pushing some objects on the stack before
772 // calling into the runtime. 770 // calling into the runtime.
773 AssemblerMacros::EnterStubFrame(assembler); 771 AssemblerMacros::EnterStubFrame(assembler);
774 772
775 __ pushq(raw_null); // Setup space on stack for result from error reporting. 773 __ pushq(raw_null); // Setup space on stack for result from error reporting.
776 __ pushq(R13); // Non-closure object. 774 __ pushq(R13); // Non-closure object.
777 // Load num_args. 775 // Load num_args.
778 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset())); 776 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
779 __ SmiUntag(R13); 777 __ SmiUntag(R13); // Arguments array length, including the non-closure.
780 __ subq(R13, Immediate(1)); // Arguments array length, minus the closure.
781 // See stack layout below explaining "wordSize * 5" offset. 778 // See stack layout below explaining "wordSize * 5" offset.
782 PushArgumentsArray(assembler, (kWordSize * 5)); 779 PushArgumentsArray(assembler, (kWordSize * 5));
783 780
784 // Stack: 781 // Stack:
785 // TOS + 0: Argument array. 782 // TOS + 0: Argument array.
786 // TOS + 1: Non-closure object. 783 // TOS + 1: Non-closure object.
787 // TOS + 2: Place for result from reporting the error. 784 // TOS + 2: Place for result from reporting the error.
788 // TOS + 3: PC marker => RawInstruction object. 785 // TOS + 3: PC marker => RawInstruction object.
789 // TOS + 4: Saved RBP of previous frame. <== RBP 786 // TOS + 4: Saved RBP of previous frame. <== RBP
790 // TOS + 5: Dart code return address 787 // TOS + 5: Dart code return address
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 // Input parameters: 1419 // Input parameters:
1423 // RBP - 8 : PC marker => RawInstruction object. 1420 // RBP - 8 : PC marker => RawInstruction object.
1424 // RBP : points to previous frame pointer. 1421 // RBP : points to previous frame pointer.
1425 // RBP + 8 : points to return address. 1422 // RBP + 8 : points to return address.
1426 // RBP + 16 : address of last argument (arg n-1). 1423 // RBP + 16 : address of last argument (arg n-1).
1427 // RBP + 16 + 8*(n-1) : address of first argument (arg 0). 1424 // RBP + 16 + 8*(n-1) : address of first argument (arg 0).
1428 // RBX : ic-data. 1425 // RBX : ic-data.
1429 // R10 : arguments descriptor array. 1426 // R10 : arguments descriptor array.
1430 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) { 1427 void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
1431 // The target function was not found, so invoke method 1428 // The target function was not found, so invoke method
1432 // "void noSuchMethod(function_name, Array arguments)". 1429 // "dynamic noSuchMethod(InvocationMirror invocation)".
1433 // TODO(regis): For now, we simply pass the actual arguments, both positional
1434 // and named, as the argument array. This is not correct if out-of-order
1435 // named arguments were passed.
1436 // The signature of the "noSuchMethod" method has to change from
1437 // noSuchMethod(String name, Array arguments) to something like
1438 // noSuchMethod(InvocationMirror call).
1439 // Also, the class NoSuchMethodError has to be modified accordingly.
1440 const Immediate raw_null = 1430 const Immediate raw_null =
1441 Immediate(reinterpret_cast<intptr_t>(Object::null())); 1431 Immediate(reinterpret_cast<intptr_t>(Object::null()));
1442 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset())); 1432 __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
1443 __ SmiUntag(R13); 1433 __ SmiUntag(R13);
1444 __ movq(RAX, Address(RBP, R13, TIMES_8, kWordSize)); // Get receiver. 1434 __ movq(RAX, Address(RBP, R13, TIMES_8, kWordSize)); // Get receiver.
1445 1435
1446 // Create a stub frame. 1436 // Create a stub frame.
1447 AssemblerMacros::EnterStubFrame(assembler); 1437 AssemblerMacros::EnterStubFrame(assembler);
1448 1438
1449 __ pushq(raw_null); // Setup space on stack for result from noSuchMethod. 1439 __ pushq(raw_null); // Setup space on stack for result from noSuchMethod.
1450 __ pushq(RAX); // Receiver. 1440 __ pushq(RAX); // Receiver.
1451 __ pushq(RBX); // IC data array. 1441 __ pushq(RBX); // IC data array.
1452 __ pushq(R10); // Arguments descriptor array. 1442 __ pushq(R10); // Arguments descriptor array.
1453 __ subq(R13, Immediate(1)); // Arguments array length, minus the receiver. 1443 // R13: Arguments array length, including the receiver.
1454 // See stack layout below explaining "wordSize * 10" offset. 1444 // See stack layout below explaining "wordSize * 10" offset.
1455 PushArgumentsArray(assembler, (kWordSize * 10)); 1445 PushArgumentsArray(assembler, (kWordSize * 10));
1456 1446
1457 // Stack: 1447 // Stack:
1458 // TOS + 0: Argument array. 1448 // TOS + 0: Argument array.
1459 // TOS + 1: Arguments descriptor array. 1449 // TOS + 1: Arguments descriptor array.
1460 // TOS + 2: Ic-data array. 1450 // TOS + 2: Ic-data array.
1461 // TOS + 3: Receiver. 1451 // TOS + 3: Receiver.
1462 // TOS + 4: Place for result from noSuchMethod. 1452 // TOS + 4: Place for result from noSuchMethod.
1463 // TOS + 5: PC marker => RawInstruction object. 1453 // TOS + 5: PC marker => RawInstruction object.
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
2171 __ cmpq(left, right); 2161 __ cmpq(left, right);
2172 __ Bind(&done); 2162 __ Bind(&done);
2173 __ popq(right); 2163 __ popq(right);
2174 __ popq(left); 2164 __ popq(left);
2175 __ ret(); 2165 __ ret();
2176 } 2166 }
2177 2167
2178 } // namespace dart 2168 } // namespace dart
2179 2169
2180 #endif // defined TARGET_ARCH_X64 2170 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | tests/co19/co19-runtime.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698