Fix bug in top-level code generator with global receiver.
authorfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 13 Jan 2010 12:13:37 +0000 (12:13 +0000)
committerfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 13 Jan 2010 12:13:37 +0000 (12:13 +0000)
We did not correcty pass the global receiver object in some cases.
This change fixes this bug on all three platforms.

Review URL: http://codereview.chromium.org/542053

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3596 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/arm/fast-codegen-arm.cc
src/ia32/fast-codegen-ia32.cc
src/x64/fast-codegen-x64.cc

index 729af29..0d934b5 100644 (file)
@@ -1129,6 +1129,7 @@ void FastCodeGenerator::VisitCall(Call* expr) {
       // Load receiver object into r1.
       if (prop->is_synthetic()) {
         __ ldr(r1, CodeGenerator::GlobalObject());
+        __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset));
       } else {
         __ ldr(r1, MemOperand(sp, kPointerSize));
       }
index cb1a033..fdab585 100644 (file)
@@ -1111,7 +1111,8 @@ void FastCodeGenerator::VisitCall(Call* expr) {
       __ push(eax);
       // Push receiver object on stack.
       if (prop->is_synthetic()) {
-        __ push(CodeGenerator::GlobalObject());
+        __ mov(ecx, CodeGenerator::GlobalObject());
+        __ push(FieldOperand(ecx, GlobalObject::kGlobalReceiverOffset));
       } else {
         __ push(ebx);
       }
index a60c926..3ef8678 100644 (file)
@@ -1128,7 +1128,8 @@ void FastCodeGenerator::VisitCall(Call* expr) {
       __ push(rax);
       // Push receiver object on stack.
       if (prop->is_synthetic()) {
-        __ push(CodeGenerator::GlobalObject());
+        __ movq(rcx, CodeGenerator::GlobalObject());
+        __ push(FieldOperand(rcx, GlobalObject::kGlobalReceiverOffset));
       } else {
         __ push(rbx);
       }