OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 // NOTE: Invocations of builtins may return failure objects | 1641 // NOTE: Invocations of builtins may return failure objects |
1642 // instead of a proper result. The builtin entry handles | 1642 // instead of a proper result. The builtin entry handles |
1643 // this by performing a garbage collection and retrying the | 1643 // this by performing a garbage collection and retrying the |
1644 // builtin once. | 1644 // builtin once. |
1645 | 1645 |
1646 // Compute the argv pointer in a callee-saved register. | 1646 // Compute the argv pointer in a callee-saved register. |
1647 __ add(r6, sp, Operand(r0, LSL, kPointerSizeLog2)); | 1647 __ add(r6, sp, Operand(r0, LSL, kPointerSizeLog2)); |
1648 __ sub(r6, r6, Operand(kPointerSize)); | 1648 __ sub(r6, r6, Operand(kPointerSize)); |
1649 | 1649 |
1650 // Enter the exit frame that transitions from JavaScript to C++. | 1650 // Enter the exit frame that transitions from JavaScript to C++. |
1651 FrameAndConstantPoolScope scope(masm, StackFrame::MANUAL); | 1651 FrameScope scope(masm, StackFrame::MANUAL); |
1652 __ EnterExitFrame(save_doubles_); | 1652 __ EnterExitFrame(save_doubles_); |
1653 | 1653 |
1654 // Set up argc and the builtin function in callee-saved registers. | 1654 // Set up argc and the builtin function in callee-saved registers. |
1655 __ mov(r4, Operand(r0)); | 1655 __ mov(r4, Operand(r0)); |
1656 __ mov(r5, Operand(r1)); | 1656 __ mov(r5, Operand(r1)); |
1657 | 1657 |
1658 // r4: number of arguments (C callee-saved) | 1658 // r4: number of arguments (C callee-saved) |
1659 // r5: pointer to builtin function (C callee-saved) | 1659 // r5: pointer to builtin function (C callee-saved) |
1660 // r6: pointer to first argument (C callee-saved) | 1660 // r6: pointer to first argument (C callee-saved) |
1661 | 1661 |
(...skipping 3702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5364 // holder | 5364 // holder |
5365 __ push(holder); | 5365 __ push(holder); |
5366 | 5366 |
5367 // Prepare arguments. | 5367 // Prepare arguments. |
5368 __ mov(scratch, sp); | 5368 __ mov(scratch, sp); |
5369 | 5369 |
5370 // Allocate the v8::Arguments structure in the arguments' space since | 5370 // Allocate the v8::Arguments structure in the arguments' space since |
5371 // it's not controlled by GC. | 5371 // it's not controlled by GC. |
5372 const int kApiStackSpace = 4; | 5372 const int kApiStackSpace = 4; |
5373 | 5373 |
5374 FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); | 5374 FrameScope frame_scope(masm, StackFrame::MANUAL); |
5375 __ EnterExitFrame(false, kApiStackSpace); | 5375 __ EnterExitFrame(false, kApiStackSpace); |
5376 | 5376 |
5377 ASSERT(!api_function_address.is(r0) && !scratch.is(r0)); | 5377 ASSERT(!api_function_address.is(r0) && !scratch.is(r0)); |
5378 // r0 = FunctionCallbackInfo& | 5378 // r0 = FunctionCallbackInfo& |
5379 // Arguments is after the return address. | 5379 // Arguments is after the return address. |
5380 __ add(r0, sp, Operand(1 * kPointerSize)); | 5380 __ add(r0, sp, Operand(1 * kPointerSize)); |
5381 // FunctionCallbackInfo::implicit_args_ | 5381 // FunctionCallbackInfo::implicit_args_ |
5382 __ str(scratch, MemOperand(r0, 0 * kPointerSize)); | 5382 __ str(scratch, MemOperand(r0, 0 * kPointerSize)); |
5383 // FunctionCallbackInfo::values_ | 5383 // FunctionCallbackInfo::values_ |
5384 __ add(ip, scratch, Operand((FCA::kArgsLength - 1 + argc) * kPointerSize)); | 5384 __ add(ip, scratch, Operand((FCA::kArgsLength - 1 + argc) * kPointerSize)); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5424 // -- ... | 5424 // -- ... |
5425 // -- r2 : api_function_address | 5425 // -- r2 : api_function_address |
5426 // ----------------------------------- | 5426 // ----------------------------------- |
5427 | 5427 |
5428 Register api_function_address = r2; | 5428 Register api_function_address = r2; |
5429 | 5429 |
5430 __ mov(r0, sp); // r0 = Handle<Name> | 5430 __ mov(r0, sp); // r0 = Handle<Name> |
5431 __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA | 5431 __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA |
5432 | 5432 |
5433 const int kApiStackSpace = 1; | 5433 const int kApiStackSpace = 1; |
5434 FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); | 5434 FrameScope frame_scope(masm, StackFrame::MANUAL); |
5435 __ EnterExitFrame(false, kApiStackSpace); | 5435 __ EnterExitFrame(false, kApiStackSpace); |
5436 | 5436 |
5437 // Create PropertyAccessorInfo instance on the stack above the exit frame with | 5437 // Create PropertyAccessorInfo instance on the stack above the exit frame with |
5438 // r1 (internal::Object** args_) as the data. | 5438 // r1 (internal::Object** args_) as the data. |
5439 __ str(r1, MemOperand(sp, 1 * kPointerSize)); | 5439 __ str(r1, MemOperand(sp, 1 * kPointerSize)); |
5440 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& | 5440 __ add(r1, sp, Operand(1 * kPointerSize)); // r1 = AccessorInfo& |
5441 | 5441 |
5442 const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1; | 5442 const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1; |
5443 | 5443 |
5444 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); | 5444 Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
5445 ExternalReference::Type thunk_type = | 5445 ExternalReference::Type thunk_type = |
5446 ExternalReference::PROFILING_GETTER_CALL; | 5446 ExternalReference::PROFILING_GETTER_CALL; |
5447 ApiFunction thunk_fun(thunk_address); | 5447 ApiFunction thunk_fun(thunk_address); |
5448 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, | 5448 ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, |
5449 masm->isolate()); | 5449 masm->isolate()); |
5450 __ CallApiFunctionAndReturn(api_function_address, | 5450 __ CallApiFunctionAndReturn(api_function_address, |
5451 thunk_ref, | 5451 thunk_ref, |
5452 kStackUnwindSpace, | 5452 kStackUnwindSpace, |
5453 MemOperand(fp, 6 * kPointerSize), | 5453 MemOperand(fp, 6 * kPointerSize), |
5454 NULL); | 5454 NULL); |
5455 } | 5455 } |
5456 | 5456 |
5457 | 5457 |
5458 #undef __ | 5458 #undef __ |
5459 | 5459 |
5460 } } // namespace v8::internal | 5460 } } // namespace v8::internal |
5461 | 5461 |
5462 #endif // V8_TARGET_ARCH_ARM | 5462 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |