Revision: 3480
Author: [email protected]
Date: Wed Dec 16 23:35:12 2009
Log: Fix ARM and x64 tests in debug mode after r3477.

[email protected]
Review URL: http://codereview.chromium.org/500090
http://code.google.com/p/v8/source/detail?r=3480

Modified:
  /branches/bleeding_edge/src/arm/stub-cache-arm.cc
  /branches/bleeding_edge/src/ia32/codegen-ia32.cc
  /branches/bleeding_edge/src/objects.h
  /branches/bleeding_edge/src/x64/stub-cache-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc   Wed Dec  9 07:34:57  
2009
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc   Wed Dec 16 23:35:12  
2009
@@ -777,8 +777,26 @@
    __ ldr(r1, FieldMemOperand(r3, JSGlobalPropertyCell::kValueOffset));

    // Check that the cell contains the same function.
-  __ cmp(r1, Operand(Handle<JSFunction>(function)));
-  __ b(ne, &miss);
+  if (Heap::InNewSpace(function)) {
+    // We can't embed a pointer to a function in new space so we have
+    // to verify that the shared function info is unchanged. This has
+    // the nice side effect that multiple closures based on the same
+    // function can all use this call IC. Before we load through the
+    // function, we have to verify that it still is a function.
+    __ tst(r1, Operand(kSmiTagMask));
+    __ b(eq, &miss);
+    __ CompareObjectType(r1, r3, r3, JS_FUNCTION_TYPE);
+    __ b(ne, &miss);
+
+    // Check the shared function info. Make sure it hasn't changed.
+    __ mov(r3, Operand(Handle<SharedFunctionInfo>(function->shared())));
+    __ ldr(r2, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
+    __ cmp(r2, r3);
+    __ b(ne, &miss);
+  } else {
+    __ cmp(r1, Operand(Handle<JSFunction>(function)));
+    __ b(ne, &miss);
+  }

    // Patch the receiver on the stack with the global proxy if
    // necessary.
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Wed Dec 16 22:21:50  
2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Wed Dec 16 23:35:12  
2009
@@ -3595,7 +3595,7 @@
  void CodeGenerator::InstantiateBoilerplate(Handle<JSFunction> boilerplate)  
{
    ASSERT(boilerplate->IsBoilerplate());

-  // Use the fast case closure allocation code that allocated in new
+  // Use the fast case closure allocation code that allocates in new
    // space for nested functions that don't need literals cloning.
    if (scope()->is_function_scope() && boilerplate->NumberOfLiterals() ==  
0) {
      FastNewClosureStub stub;
=======================================
--- /branches/bleeding_edge/src/objects.h       Wed Dec 16 07:43:20 2009
+++ /branches/bleeding_edge/src/objects.h       Wed Dec 16 23:35:12 2009
@@ -1804,7 +1804,7 @@
    }

    static int ToDetailsIndex(int descriptor_number) {
-    return( descriptor_number << 1) + 1;
+    return (descriptor_number << 1) + 1;
    }

    static int ToValueIndex(int descriptor_number) {
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc   Wed Dec  9 07:34:57  
2009
+++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc   Wed Dec 16 23:35:12  
2009
@@ -956,8 +956,24 @@
    __ movq(rdi, FieldOperand(rdi, JSGlobalPropertyCell::kValueOffset));

    // Check that the cell contains the same function.
-  __ Cmp(rdi, Handle<JSFunction>(function));
-  __ j(not_equal, &miss);
+  if (Heap::InNewSpace(function)) {
+    // We can't embed a pointer to a function in new space so we have
+    // to verify that the shared function info is unchanged. This has
+    // the nice side effect that multiple closures based on the same
+    // function can all use this call IC. Before we load through the
+    // function, we have to verify that it still is a function.
+    __ JumpIfSmi(rdi, &miss);
+    __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
+    __ j(not_equal, &miss);
+
+    // Check the shared function info. Make sure it hasn't changed.
+    __ Move(rcx, Handle<SharedFunctionInfo>(function->shared()));
+    __ cmpq(FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset), rcx);
+    __ j(not_equal, &miss);
+  } else {
+    __ Cmp(rdi, Handle<JSFunction>(function));
+    __ j(not_equal, &miss);
+  }

    // Patch the receiver on the stack with the global proxy.
    if (object->IsGlobalObject()) {

-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to