Author: [EMAIL PROTECTED]
Date: Mon Dec 1 06:10:46 2008
New Revision: 876
Modified:
branches/experimental/toiger/src/codegen-ia32.cc
Log:
Fix eval, which was broken by merging from bleeding_edge.
Review URL: http://codereview.chromium.org/13001
Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc Mon Dec 1 06:10:46
2008
@@ -3107,6 +3107,7 @@
void CodeGenerator::VisitCallEval(CallEval* node) {
+ frame_->SpillAll();
Comment cmnt(masm_, "[ CallEval");
// In a call to eval, we first call %ResolvePossiblyDirectEval to resolve
@@ -3120,33 +3121,37 @@
// Prepare stack for call to resolved function.
Load(function);
- __ push(Immediate(Factory::undefined_value())); // Slot for receiver
- for (int i = 0; i < args->length(); i++) {
+ frame_->SpillAll();
+ // Allocate a frame slot for the receiver.
+ frame_->EmitPush(Immediate(Factory::undefined_value()));
+ int arg_count = args->length();
+ for (int i = 0; i < arg_count; i++) {
Load(args->at(i));
+ frame_->SpillAll();
}
// Prepare stack for call to ResolvePossiblyDirectEval.
- __ push(Operand(esp, args->length() * kPointerSize + kPointerSize));
- if (args->length() > 0) {
- __ push(Operand(esp, args->length() * kPointerSize));
+ frame_->EmitPush(frame_->ElementAt(arg_count + 1));
+ if (arg_count > 0) {
+ frame_->EmitPush(frame_->ElementAt(arg_count));
} else {
- __ push(Immediate(Factory::undefined_value()));
+ frame_->EmitPush(Immediate(Factory::undefined_value()));
}
// Resolve the call.
- __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 2);
+ frame_->CallRuntime(Runtime::kResolvePossiblyDirectEval, 2);
// Touch up stack with the right values for the function and the
receiver.
__ mov(edx, FieldOperand(eax, FixedArray::kHeaderSize));
- __ mov(Operand(esp, (args->length() + 1) * kPointerSize), edx);
+ __ mov(frame_->ElementAt(arg_count + 1), edx);
__ mov(edx, FieldOperand(eax, FixedArray::kHeaderSize + kPointerSize));
- __ mov(Operand(esp, args->length() * kPointerSize), edx);
+ __ mov(frame_->ElementAt(arg_count), edx);
// Call the function.
__ RecordPosition(node->position());
- CallFunctionStub call_function(args->length());
- __ CallStub(&call_function);
+ CallFunctionStub call_function(arg_count);
+ frame_->CallStub(&call_function, arg_count + 1);
// Restore context and pop function from the stack.
__ mov(esi, frame_->Context());
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---