Reviewers: William Hesse, olehougaard,

Description:
Fix eval, which was broken by merging from bleeding_edge.

Please review this at http://codereview.chromium.org/13001

SVN Base: http://v8.googlecode.com/svn/branches/experimental/toiger/

Affected files:
   M     src/codegen-ia32.cc


Index: src/codegen-ia32.cc
===================================================================
--- src/codegen-ia32.cc (revision 869)
+++ src/codegen-ia32.cc (working copy)
@@ -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
-~----------~----~----~----~------~----~------~--~---

Reply via email to