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
