OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 11 matching lines...) Expand all Loading... |
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 */ | 27 */ |
28 | 28 |
29 #ifndef JITStubs_h | 29 #ifndef JITStubs_h |
30 #define JITStubs_h | 30 #define JITStubs_h |
31 | 31 |
| 32 #include "Register.h" |
| 33 #include <wtf/Platform.h> |
| 34 |
| 35 #if ENABLE(JIT) |
| 36 |
32 namespace JSC { | 37 namespace JSC { |
33 | 38 |
| 39 class ExecutablePool; |
| 40 class JSGlobalData; |
| 41 class JSObject; |
| 42 class JSPropertyNameIterator; |
| 43 class JSValueEncodedAsPointer; |
| 44 class CodeBlock; |
| 45 class JSValuePtr; |
| 46 class Identifier; |
| 47 class PropertySlot; |
| 48 class PutPropertySlot; |
| 49 |
| 50 #if USE(JIT_STUB_ARGUMENT_VA_LIST) |
| 51 #define STUB_ARGS void* args, ... |
| 52 #define ARGS (reinterpret_cast<void**>(vl_args) - 1) |
| 53 #else // JIT_STUB_ARGUMENT_REGISTER or JIT_STUB_ARGUMENT_STACK |
| 54 #define STUB_ARGS void** args |
| 55 #define ARGS (args) |
| 56 #endif |
| 57 |
| 58 #if USE(JIT_STUB_ARGUMENT_REGISTER) |
| 59 #if PLATFORM(X86_64) |
| 60 #define JIT_STUB |
| 61 #elif COMPILER(MSVC) |
| 62 #define JIT_STUB __fastcall |
| 63 #elif COMPILER(GCC) |
| 64 #define JIT_STUB __attribute__ ((fastcall)) |
| 65 #else |
| 66 #error Need to support register calling convention in this compiler |
| 67 #endif |
| 68 #else // JIT_STUB_ARGUMENT_VA_LIST or JIT_STUB_ARGUMENT_STACK |
| 69 #if COMPILER(MSVC) |
| 70 #define JIT_STUB __cdecl |
| 71 #else |
| 72 #define JIT_STUB |
| 73 #endif |
| 74 #endif |
| 75 |
| 76 // The Mac compilers are fine with this, |
| 77 #if PLATFORM(MAC) |
| 78 struct VoidPtrPair { |
| 79 void* first; |
| 80 void* second; |
| 81 }; |
| 82 #define RETURN_PAIR(a,b) VoidPtrPair pair = { a, b }; return pair |
| 83 #else |
| 84 typedef uint64_t VoidPtrPair; |
| 85 union VoidPtrPairValue { |
| 86 struct { void* first; void* second; } s; |
| 87 VoidPtrPair i; |
| 88 }; |
| 89 #define RETURN_PAIR(a,b) VoidPtrPairValue pair = {{ a, b }}; return pair.i |
| 90 #endif |
| 91 |
| 92 class JITStubs { |
| 93 public: |
| 94 JITStubs(JSGlobalData*); |
| 95 |
| 96 static JSObject* JIT_STUB cti_op_construct_JSConstruct(STUB_ARGS); |
| 97 static JSObject* JIT_STUB cti_op_convert_this(STUB_ARGS); |
| 98 static JSObject* JIT_STUB cti_op_new_array(STUB_ARGS); |
| 99 static JSObject* JIT_STUB cti_op_new_error(STUB_ARGS); |
| 100 static JSObject* JIT_STUB cti_op_new_func(STUB_ARGS); |
| 101 static JSObject* JIT_STUB cti_op_new_func_exp(STUB_ARGS); |
| 102 static JSObject* JIT_STUB cti_op_new_object(STUB_ARGS); |
| 103 static JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS); |
| 104 static JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS); |
| 105 static JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS); |
| 106 static JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS); |
| 107 static JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS); |
| 108 static JSValueEncodedAsPointer* JIT_STUB cti_op_add(STUB_ARGS); |
| 109 static JSValueEncodedAsPointer* JIT_STUB cti_op_bitand(STUB_ARGS); |
| 110 static JSValueEncodedAsPointer* JIT_STUB cti_op_bitnot(STUB_ARGS); |
| 111 static JSValueEncodedAsPointer* JIT_STUB cti_op_bitor(STUB_ARGS); |
| 112 static JSValueEncodedAsPointer* JIT_STUB cti_op_bitxor(STUB_ARGS); |
| 113 static JSValueEncodedAsPointer* JIT_STUB cti_op_call_NotJSFunction(STUB_
ARGS); |
| 114 static JSValueEncodedAsPointer* JIT_STUB cti_op_call_eval(STUB_ARGS); |
| 115 static JSValueEncodedAsPointer* JIT_STUB cti_op_construct_NotJSConstruct
(STUB_ARGS); |
| 116 static JSValueEncodedAsPointer* JIT_STUB cti_op_del_by_id(STUB_ARGS); |
| 117 static JSValueEncodedAsPointer* JIT_STUB cti_op_del_by_val(STUB_ARGS); |
| 118 static JSValueEncodedAsPointer* JIT_STUB cti_op_div(STUB_ARGS); |
| 119 static JSValueEncodedAsPointer* JIT_STUB cti_op_eq(STUB_ARGS); |
| 120 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id(STUB_ARGS); |
| 121 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_array_fail(STU
B_ARGS); |
| 122 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_generic(STUB_A
RGS); |
| 123 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_proto_fail(STU
B_ARGS); |
| 124 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_proto_list(STU
B_ARGS); |
| 125 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_proto_list_ful
l(STUB_ARGS); |
| 126 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_second(STUB_AR
GS); |
| 127 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_self_fail(STUB
_ARGS); |
| 128 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_id_string_fail(ST
UB_ARGS); |
| 129 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_val(STUB_ARGS); |
| 130 static JSValueEncodedAsPointer* JIT_STUB cti_op_get_by_val_byte_array(ST
UB_ARGS); |
| 131 static JSValueEncodedAsPointer* JIT_STUB cti_op_in(STUB_ARGS); |
| 132 static JSValueEncodedAsPointer* JIT_STUB cti_op_instanceof(STUB_ARGS); |
| 133 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_boolean(STUB_ARGS); |
| 134 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_function(STUB_ARGS); |
| 135 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_number(STUB_ARGS); |
| 136 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_object(STUB_ARGS); |
| 137 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_string(STUB_ARGS); |
| 138 static JSValueEncodedAsPointer* JIT_STUB cti_op_is_undefined(STUB_ARGS); |
| 139 static JSValueEncodedAsPointer* JIT_STUB cti_op_less(STUB_ARGS); |
| 140 static JSValueEncodedAsPointer* JIT_STUB cti_op_lesseq(STUB_ARGS); |
| 141 static JSValueEncodedAsPointer* JIT_STUB cti_op_lshift(STUB_ARGS); |
| 142 static JSValueEncodedAsPointer* JIT_STUB cti_op_mod(STUB_ARGS); |
| 143 static JSValueEncodedAsPointer* JIT_STUB cti_op_mul(STUB_ARGS); |
| 144 static JSValueEncodedAsPointer* JIT_STUB cti_op_negate(STUB_ARGS); |
| 145 static JSValueEncodedAsPointer* JIT_STUB cti_op_neq(STUB_ARGS); |
| 146 static JSValueEncodedAsPointer* JIT_STUB cti_op_next_pname(STUB_ARGS); |
| 147 static JSValueEncodedAsPointer* JIT_STUB cti_op_not(STUB_ARGS); |
| 148 static JSValueEncodedAsPointer* JIT_STUB cti_op_nstricteq(STUB_ARGS); |
| 149 static JSValueEncodedAsPointer* JIT_STUB cti_op_pre_dec(STUB_ARGS); |
| 150 static JSValueEncodedAsPointer* JIT_STUB cti_op_pre_inc(STUB_ARGS); |
| 151 static JSValueEncodedAsPointer* JIT_STUB cti_op_resolve(STUB_ARGS); |
| 152 static JSValueEncodedAsPointer* JIT_STUB cti_op_resolve_base(STUB_ARGS); |
| 153 static JSValueEncodedAsPointer* JIT_STUB cti_op_resolve_global(STUB_ARGS
); |
| 154 static JSValueEncodedAsPointer* JIT_STUB cti_op_resolve_skip(STUB_ARGS); |
| 155 static JSValueEncodedAsPointer* JIT_STUB cti_op_rshift(STUB_ARGS); |
| 156 static JSValueEncodedAsPointer* JIT_STUB cti_op_stricteq(STUB_ARGS); |
| 157 static JSValueEncodedAsPointer* JIT_STUB cti_op_sub(STUB_ARGS); |
| 158 static JSValueEncodedAsPointer* JIT_STUB cti_op_throw(STUB_ARGS); |
| 159 static JSValueEncodedAsPointer* JIT_STUB cti_op_to_jsnumber(STUB_ARGS); |
| 160 static JSValueEncodedAsPointer* JIT_STUB cti_op_typeof(STUB_ARGS); |
| 161 static JSValueEncodedAsPointer* JIT_STUB cti_op_urshift(STUB_ARGS); |
| 162 static JSValueEncodedAsPointer* JIT_STUB cti_vm_throw(STUB_ARGS); |
| 163 static VoidPtrPair JIT_STUB cti_op_call_arityCheck(STUB_ARGS); |
| 164 static VoidPtrPair JIT_STUB cti_op_post_dec(STUB_ARGS); |
| 165 static VoidPtrPair JIT_STUB cti_op_post_inc(STUB_ARGS); |
| 166 static VoidPtrPair JIT_STUB cti_op_resolve_func(STUB_ARGS); |
| 167 static VoidPtrPair JIT_STUB cti_op_resolve_with_base(STUB_ARGS); |
| 168 static int JIT_STUB cti_op_jless(STUB_ARGS); |
| 169 static int JIT_STUB cti_op_jtrue(STUB_ARGS); |
| 170 static int JIT_STUB cti_op_loop_if_less(STUB_ARGS); |
| 171 static int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS); |
| 172 static int JIT_STUB cti_op_loop_if_true(STUB_ARGS); |
| 173 static int JIT_STUB cti_timeout_check(STUB_ARGS); |
| 174 static void JIT_STUB cti_op_create_arguments(STUB_ARGS); |
| 175 static void JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS); |
| 176 static void JIT_STUB cti_op_debug(STUB_ARGS); |
| 177 static void JIT_STUB cti_op_end(STUB_ARGS); |
| 178 static void JIT_STUB cti_op_jmp_scopes(STUB_ARGS); |
| 179 static void JIT_STUB cti_op_pop_scope(STUB_ARGS); |
| 180 static void JIT_STUB cti_op_profile_did_call(STUB_ARGS); |
| 181 static void JIT_STUB cti_op_profile_will_call(STUB_ARGS); |
| 182 static void JIT_STUB cti_op_put_by_id(STUB_ARGS); |
| 183 static void JIT_STUB cti_op_put_by_id_fail(STUB_ARGS); |
| 184 static void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS); |
| 185 static void JIT_STUB cti_op_put_by_id_second(STUB_ARGS); |
| 186 static void JIT_STUB cti_op_put_by_index(STUB_ARGS); |
| 187 static void JIT_STUB cti_op_put_by_val(STUB_ARGS); |
| 188 static void JIT_STUB cti_op_put_by_val_array(STUB_ARGS); |
| 189 static void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS); |
| 190 static void JIT_STUB cti_op_put_getter(STUB_ARGS); |
| 191 static void JIT_STUB cti_op_put_setter(STUB_ARGS); |
| 192 static void JIT_STUB cti_op_ret_scopeChain(STUB_ARGS); |
| 193 static void JIT_STUB cti_op_tear_off_activation(STUB_ARGS); |
| 194 static void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS); |
| 195 static void JIT_STUB cti_register_file_check(STUB_ARGS); |
| 196 static void* JIT_STUB cti_op_call_JSFunction(STUB_ARGS); |
| 197 static void* JIT_STUB cti_op_switch_char(STUB_ARGS); |
| 198 static void* JIT_STUB cti_op_switch_imm(STUB_ARGS); |
| 199 static void* JIT_STUB cti_op_switch_string(STUB_ARGS); |
| 200 static void* JIT_STUB cti_vm_dontLazyLinkCall(STUB_ARGS); |
| 201 static void* JIT_STUB cti_vm_lazyLinkCall(STUB_ARGS); |
| 202 |
| 203 static void tryCacheGetByID(CallFrame*, CodeBlock*, void* returnAddress,
JSValuePtr baseValue, const Identifier& propertyName, const PropertySlot&); |
| 204 static void tryCachePutByID(CallFrame*, CodeBlock*, void* returnAddress,
JSValuePtr baseValue, const PutPropertySlot&); |
| 205 |
| 206 void* ctiArrayLengthTrampoline() { return m_ctiArrayLengthTrampoline; } |
| 207 void* ctiStringLengthTrampoline() { return m_ctiStringLengthTrampoline;
} |
| 208 void* ctiVirtualCallPreLink() { return m_ctiVirtualCallPreLink; } |
| 209 void* ctiVirtualCallLink() { return m_ctiVirtualCallLink; } |
| 210 void* ctiVirtualCall() { return m_ctiVirtualCall; } |
| 211 |
| 212 private: |
| 213 RefPtr<ExecutablePool> m_executablePool; |
| 214 |
| 215 void* m_ctiArrayLengthTrampoline; |
| 216 void* m_ctiStringLengthTrampoline; |
| 217 void* m_ctiVirtualCallPreLink; |
| 218 void* m_ctiVirtualCallLink; |
| 219 void* m_ctiVirtualCall; |
| 220 }; |
| 221 |
34 } // namespace JSC | 222 } // namespace JSC |
35 | 223 |
| 224 #endif // ENABLE(JIT) |
| 225 |
36 #endif // JITStubs_h | 226 #endif // JITStubs_h |
OLD | NEW |