| /* |
| * Copyright (C) 2012 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "config.h" |
| #include "HostCallReturnValue.h" |
| |
| #if !ENABLE(C_LOOP) |
| |
| #include "CallFrame.h" |
| #include "JSCJSValueInlines.h" |
| #include "JSObject.h" |
| #include "JSCInlines.h" |
| #include <wtf/InlineASM.h> |
| |
| |
| namespace JSC { |
| |
| // Note: getHostCallReturnValueWithExecState() needs to be placed before the |
| // definition of getHostCallReturnValue() below because the Windows build |
| // requires it. |
| extern "C" EncodedJSValue HOST_CALL_RETURN_VALUE_OPTION getHostCallReturnValueWithExecState(CallFrame* callFrame) |
| { |
| if (!callFrame) |
| return JSValue::encode(JSValue()); |
| return JSValue::encode(callFrame->deprecatedVM().hostCallReturnValue); |
| } |
| |
| #if COMPILER(GCC_COMPATIBLE) && CPU(X86_64) |
| asm ( |
| ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n" |
| HIDE_SYMBOL(getHostCallReturnValue) "\n" |
| SYMBOL_STRING(getHostCallReturnValue) ":" "\n" |
| "lea -8(%rsp), %rdi\n" |
| "jmp " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" |
| ); |
| |
| #elif COMPILER(GCC_COMPATIBLE) && CPU(X86) |
| asm ( |
| ".text" "\n" \ |
| ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n" |
| HIDE_SYMBOL(getHostCallReturnValue) "\n" |
| SYMBOL_STRING(getHostCallReturnValue) ":" "\n" |
| "push %ebp\n" |
| "mov %esp, %eax\n" |
| "leal -4(%esp), %esp\n" |
| "push %eax\n" |
| "call " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" |
| "leal 8(%esp), %esp\n" |
| "pop %ebp\n" |
| "ret\n" |
| ); |
| |
| #elif COMPILER(GCC_COMPATIBLE) && CPU(ARM_THUMB2) |
| asm ( |
| ".text" "\n" |
| ".align 2" "\n" |
| ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n" |
| HIDE_SYMBOL(getHostCallReturnValue) "\n" |
| ".thumb" "\n" |
| ".thumb_func " THUMB_FUNC_PARAM(getHostCallReturnValue) "\n" |
| SYMBOL_STRING(getHostCallReturnValue) ":" "\n" |
| "sub r0, sp, #8" "\n" |
| "b " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" |
| ); |
| |
| #elif CPU(ARM64) |
| asm ( |
| ".text" "\n" |
| ".align 2" "\n" |
| ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n" |
| HIDE_SYMBOL(getHostCallReturnValue) "\n" |
| SYMBOL_STRING(getHostCallReturnValue) ":" "\n" |
| "sub x0, sp, #16" "\n" |
| "b " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" |
| ); |
| |
| #elif COMPILER(GCC_COMPATIBLE) && CPU(MIPS) |
| |
| #if WTF_MIPS_PIC |
| #define LOAD_FUNCTION_TO_T9(function) \ |
| ".set noreorder" "\n" \ |
| ".cpload $25" "\n" \ |
| ".set reorder" "\n" \ |
| "la $t9, " LOCAL_REFERENCE(function) "\n" |
| #else |
| #define LOAD_FUNCTION_TO_T9(function) "" "\n" |
| #endif |
| |
| asm ( |
| ".text" "\n" |
| ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n" |
| HIDE_SYMBOL(getHostCallReturnValue) "\n" |
| SYMBOL_STRING(getHostCallReturnValue) ":" "\n" |
| LOAD_FUNCTION_TO_T9(getHostCallReturnValueWithExecState) |
| "addi $a0, $sp, -8" "\n" |
| "b " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" |
| ); |
| |
| #elif COMPILER(MSVC) && CPU(X86) |
| extern "C" { |
| __declspec(naked) EncodedJSValue HOST_CALL_RETURN_VALUE_OPTION getHostCallReturnValue() |
| { |
| __asm lea eax, [esp - 4] |
| __asm mov [esp + 4], eax; |
| __asm jmp getHostCallReturnValueWithExecState |
| } |
| } |
| #endif |
| |
| } // namespace JSC |
| |
| #endif // !ENABLE(C_LOOP) |