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

Unified Diff: runtime/vm/stub_code_ia32.cc

Issue 11442010: Introduce a class encapsulating arguments descriptor arrays. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Incorporated review comments. 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
Index: runtime/vm/stub_code_ia32.cc
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 140eb70bb1eab70ac52fe2ed55645e6e3f312b9a..289f1c04fbb900ff40f715f6b92e2948b47b8dda 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -8,6 +8,7 @@
#include "vm/assembler.h"
#include "vm/assembler_macros.h"
#include "vm/compiler.h"
+#include "vm/dart_entry.h"
#include "vm/flow_graph_compiler.h"
#include "vm/instructions.h"
#include "vm/object_store.h"
@@ -183,7 +184,7 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
// Input parameters:
-// EDX: arguments descriptor array (num_args is first Smi element).
+// EDX: arguments descriptor array.
void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -204,7 +205,7 @@ void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
// Called from a static call only when an invalid code has been entered
// (invalid because its function was optimized or deoptimized).
-// EDX: arguments descriptor array (num_args is first Smi element).
+// EDX: arguments descriptor array.
void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -257,7 +258,7 @@ static void PushArgumentsArray(Assembler* assembler, intptr_t arg_offset) {
// Input parameters:
// ECX: ic-data.
-// EDX: arguments descriptor array (num_args is first Smi element).
+// EDX: arguments descriptor array.
// Note: The receiver object is the first argument to the function being
// called, the stub accesses the receiver from this location directly
// when trying to resolve the call.
@@ -277,8 +278,7 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
// TOS + 2: Dart code return address
// TOS + 3: Last argument of caller.
// ....
- // Total number of args is the first Smi in args descriptor array (EDX).
- __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ movl(EAX, Address(EBP, EAX, TIMES_2, kWordSize)); // Get receiver.
__ pushl(EDX); // Preserve arguments descriptor array.
__ pushl(EAX); // Preserve receiver.
@@ -377,7 +377,7 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
__ pushl(raw_null); // Setup space on stack for result from invoking Closure.
__ pushl(ECX); // Closure object.
__ pushl(EDI); // Arguments descriptor.
- __ movl(EDI, FieldAddress(EDI, Array::data_offset()));
+ __ movl(EDI, FieldAddress(EDI, ArgumentsDescriptor::count_offset()));
__ SmiUntag(EDI);
__ subl(EDI, Immediate(1)); // Arguments array length, minus the receiver.
PushArgumentsArray(assembler, (kWordSize * 6));
@@ -409,21 +409,21 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
// EAX: receiver.
// EDX: ic-data.
// ECX: raw_null.
- // EDI: argument descriptor array.
+ // EDI: arguments descriptor array.
__ pushl(raw_null); // Setup space on stack for result from noSuchMethod.
__ pushl(EAX); // Receiver.
__ pushl(EDX); // IC-data.
- __ pushl(EDI); // Argument descriptor array.
- __ movl(EDI, FieldAddress(EDI, Array::data_offset()));
+ __ pushl(EDI); // Arguments descriptor array.
+ __ movl(EDI, FieldAddress(EDI, ArgumentsDescriptor::count_offset()));
__ SmiUntag(EDI);
__ subl(EDI, Immediate(1)); // Arguments array length, minus the receiver.
// See stack layout below explaining "wordSize * 7" offset.
PushArgumentsArray(assembler, (kWordSize * 7));
// Stack:
- // TOS + 0: Argument array.
- // TOS + 1: Argument descriptor array.
+ // TOS + 0: Arguments array.
+ // TOS + 1: Arguments descriptor array.
// TOS + 2: IC-data.
// TOS + 3: Receiver
// TOS + 4: Place for result from noSuchMethod.
@@ -704,8 +704,7 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
// Input parameters:
-// EDX: Arguments descriptor array (num_args is first Smi element, closure
-// object is included in num_args and is first argument).
+// EDX: Arguments descriptor array.
// Note: The closure object is the first argument to the function being
// called, the stub accesses the closure from this location directly
// when trying to resolve the call.
@@ -714,8 +713,8 @@ void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
- // Total number of args is the first Smi in args descriptor array (EDX).
- __ movl(EAX, FieldAddress(EDX, Array::data_offset())); // Load num_args.
+ // Load num_args.
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
// Load closure object in EDI.
__ movl(EDI, Address(ESP, EAX, TIMES_2, 0)); // EAX is a Smi.
@@ -764,7 +763,7 @@ void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
__ Bind(&function_compiled);
// EAX: Code.
// ECX: Function.
- // EDX: Arguments descriptor array (num_args is first Smi element).
+ // EDX: Arguments descriptor array.
__ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
__ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
@@ -774,8 +773,7 @@ void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
// Call runtime to report that a closure call was attempted on a non-closure
// object, passing the non-closure object and its arguments array.
// EDI: non-closure object.
- // EDX: arguments descriptor array (num_args is first Smi element, closure
- // object is included in num_args).
+ // EDX: arguments descriptor array.
// Create a stub frame as we are pushing some objects on the stack before
// calling into the runtime.
@@ -783,8 +781,8 @@ void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
__ pushl(raw_null); // Setup space on stack for result from error reporting.
__ pushl(EDI); // Non-closure object.
- // Total number of args is the first Smi in args descriptor array (EDX).
- __ movl(EDI, FieldAddress(EDX, Array::data_offset())); // Load num_args.
+ // Load num_args.
+ __ movl(EDI, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ SmiUntag(EDI);
__ subl(EDI, Immediate(1)); // Arguments array length, minus the closure.
// See stack layout below explaining "wordSize * 5" offset.
@@ -860,7 +858,7 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
__ movl(EDX, Address(EDX, VMHandles::kOffsetOfRawPtrInHandle));
// Load number of arguments into EBX.
- __ movl(EBX, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EBX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ SmiUntag(EBX);
// Set up arguments for the dart call.
@@ -887,10 +885,10 @@ void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
__ movl(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
// Reread the arguments descriptor array to obtain the number of passed
- // arguments, which is the first element of the array, a Smi.
+ // arguments.
__ movl(EDX, Address(EBP, kArgumentsDescOffset));
__ movl(EDX, Address(EDX, VMHandles::kOffsetOfRawPtrInHandle));
- __ movl(EDX, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EDX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
// Get rid of arguments pushed on the stack.
__ leal(ESP, Address(ESP, EDX, TIMES_2, 0)); // EDX is a Smi.
@@ -1448,10 +1446,9 @@ void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
// noSuchMethod(String name, Array arguments) to something like
// noSuchMethod(InvocationMirror call).
// Also, the class NoSuchMethodError has to be modified accordingly.
- // Total number of args is the first Smi in args descriptor array (EDX).
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
- __ movl(EDI, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EDI, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ SmiUntag(EDI);
__ movl(EAX, Address(EBP, EDI, TIMES_4, kWordSize)); // Get receiver.
@@ -1589,8 +1586,8 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
// EBX: points directly to the first ic data array element.
// Get the receiver's class ID (first read number of arguments from
- // argument descriptor array and then access the receiver from the stack).
- __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+ // arguments descriptor array and then access the receiver from the stack).
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ movl(EAX, Address(ESP, EAX, TIMES_2, 0)); // EAX (argument_count) is smi.
__ call(&get_class_id_as_smi);
// EAX: receiver's class ID (smi).
@@ -1601,7 +1598,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
for (int i = 0; i < num_args; i++) {
if (i > 0) {
// If not the first, load the next argument's class ID.
- __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ movl(EAX, Address(ESP, EAX, TIMES_2, - i * kWordSize));
__ call(&get_class_id_as_smi);
// EAX: next argument class ID (smi).
@@ -1619,7 +1616,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
__ Bind(&update);
// Reload receiver class ID. It has not been destroyed when num_args == 1.
if (num_args > 1) {
- __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
__ call(&get_class_id_as_smi);
}
@@ -1636,13 +1633,13 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
// Compute address of arguments (first read number of arguments from
- // argument descriptor array and then compute address on the stack).
- __ movl(EAX, FieldAddress(EDX, Array::data_offset()));
+ // arguments descriptor array and then compute address on the stack).
+ __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
__ leal(EAX, Address(ESP, EAX, TIMES_2, 0)); // EAX is Smi.
// Create a stub frame as we are pushing some objects on the stack before
// calling into the runtime.
AssemblerMacros::EnterStubFrame(assembler);
- __ pushl(EDX); // Preserve arguments array.
+ __ pushl(EDX); // Preserve arguments descriptor array.
__ pushl(ECX); // Preserve IC data array
__ pushl(raw_null); // Setup space on stack for result (target code object).
// Push call arguments.
@@ -1665,7 +1662,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
}
__ popl(EAX); // Pop returned code object into EAX (null if not found).
__ popl(ECX); // Restore IC data array.
- __ popl(EDX); // Restore arguments array.
+ __ popl(EDX); // Restore arguments descriptor array.
__ LeaveFrame();
Label call_target_function;
__ cmpl(EAX, raw_null);
@@ -1712,7 +1709,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(Assembler* assembler,
// Use inline cache data array to invoke the target or continue in inline
// cache miss handler. Stub for 1-argument check (receiver class).
// ECX: Inline cache data object.
-// EDX: Arguments array.
+// EDX: Arguments descriptor array.
// TOS(0): Return address.
// Inline cache data object structure:
// 0: function-name
@@ -1743,7 +1740,7 @@ void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
// cache miss handler. Stub for 1-argument check (receiver class).
// EDI: function which counter needs to be incremented.
// ECX: Inline cache data object.
-// EDX: Arguments array.
+// EDX: Arguments descriptor array.
// TOS(0): Return address.
// Inline cache data object structure:
// 0: function-name
@@ -1785,7 +1782,7 @@ void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
}
-// EDX: Arguments array.
+// EDX: Arguments descriptor array.
// TOS(0): return address (Dart code).
void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
// Create a stub frame as we are pushing some objects on the stack before
@@ -1828,7 +1825,7 @@ void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
// ECX: Inline cache data array.
-// EDX: Arguments array.
+// EDX: Arguments descriptor array.
// TOS(0): return address (Dart code).
void StubCode::GenerateBreakpointDynamicStub(Assembler* assembler) {
// Create a stub frame as we are pushing some objects on the stack before

Powered by Google App Engine
This is Rietveld 408576698