1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15 * its contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef JITStubs_h 31 #define JITStubs_h 32 33 #include "CallData.h" 34 #include "MacroAssemblerCodeRef.h" 35 #include "Register.h" 36 #include "ThunkGenerators.h" 37 #include <wtf/HashMap.h> 38 39 #if ENABLE(JIT) 40 41 namespace JSC { 42 43 struct StructureStubInfo; 44 45 class CodeBlock; 46 class ExecutablePool; 47 class FunctionExecutable; 48 class Identifier; 49 class JSGlobalData; 50 class JSGlobalObject; 51 class JSObject; 52 class JSPropertyNameIterator; 53 class JSValue; 54 class JSValueEncodedAsPointer; 55 class NativeExecutable; 56 class Profiler; 57 class PropertySlot; 58 class PutPropertySlot; 59 class RegisterFile; 60 class RegExp; 61 62 union JITStubArg { 63 void* asPointer; 64 EncodedJSValue asEncodedJSValue; 65 int32_t asInt32; 66 67 JSValue jsValue() { return JSValue::decode(asEncodedJSValue); } 68 JSObject* jsObject() { return static_cast<JSObject*>(asPointer); } 69 Identifier& identifier() { return *static_cast<Identifier*>(asPointer); } 70 int32_t int32() { return asInt32; } 71 CodeBlock* codeBlock() { return static_cast<CodeBlock*>(asPointer); } 72 FunctionExecutable* function() { return static_cast<FunctionExecutable*>(asPointer); } 73 RegExp* regExp() { return static_cast<RegExp*>(asPointer); } 74 JSPropertyNameIterator* propertyNameIterator() { return static_cast<JSPropertyNameIterator*>(asPointer); } 75 JSGlobalObject* globalObject() { return static_cast<JSGlobalObject*>(asPointer); } 76 JSString* jsString() { return static_cast<JSString*>(asPointer); } 77 ReturnAddressPtr returnAddress() { return ReturnAddressPtr(asPointer); } 78 }; 79 80 struct TrampolineStructure { 81 MacroAssemblerCodePtr ctiStringLengthTrampoline; 82 MacroAssemblerCodePtr ctiVirtualCallLink; 83 MacroAssemblerCodePtr ctiVirtualConstructLink; 84 MacroAssemblerCodePtr ctiVirtualCall; 85 MacroAssemblerCodePtr ctiVirtualConstruct; 86 MacroAssemblerCodePtr ctiNativeCall; 87 MacroAssemblerCodePtr ctiNativeConstruct; 88 MacroAssemblerCodePtr ctiSoftModulo; 89 }; 90 91 #if CPU(X86_64) 92 struct JITStackFrame { 93 void* reserved; // Unused 94 JITStubArg args[6]; 95 void* padding[2]; // Maintain 32-byte stack alignment (possibly overkill). 96 97 void* code; 98 RegisterFile* registerFile; 99 CallFrame* callFrame; 100 void* unused1; 101 Profiler** enabledProfilerReference; 102 JSGlobalData* globalData; 103 104 void* savedRBX; 105 void* savedR15; 106 void* savedR14; 107 void* savedR13; 108 void* savedR12; 109 void* savedRBP; 110 void* savedRIP; 111 112 // When JIT code makes a call, it pushes its return address just below the rest of the stack. 113 ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } 114 }; 115 #elif CPU(X86) 116 #if COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC)) 117 #pragma pack(push) 118 #pragma pack(4) 119 #endif // COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC)) 120 struct JITStackFrame { 121 void* reserved; // Unused 122 JITStubArg args[6]; 123 #if USE(JSVALUE32_64) 124 void* padding[2]; // Maintain 16-byte stack alignment. 125 #endif 126 127 void* savedEBX; 128 void* savedEDI; 129 void* savedESI; 130 void* savedEBP; 131 void* savedEIP; 132 133 void* code; 134 RegisterFile* registerFile; 135 CallFrame* callFrame; 136 void* unused1; 137 Profiler** enabledProfilerReference; 138 JSGlobalData* globalData; 139 140 // When JIT code makes a call, it pushes its return address just below the rest of the stack. 141 ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } 142 }; 143 #if COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC)) 144 #pragma pack(pop) 145 #endif // COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC)) 146 #elif CPU(ARM_THUMB2) 147 struct JITStackFrame { 148 JITStubArg reserved; // Unused 149 JITStubArg args[6]; 150 #if USE(JSVALUE64) 151 void* padding; // Maintain 16-byte stack alignment. 152 #endif 153 154 ReturnAddressPtr thunkReturnAddress; 155 156 void* preservedReturnAddress; 157 void* preservedR4; 158 void* preservedR5; 159 void* preservedR6; 160 161 // These arguments passed in r1..r3 (r0 contained the entry code pointed, which is not preserved) 162 RegisterFile* registerFile; 163 CallFrame* callFrame; 164 void* unused1; 165 166 // These arguments passed on the stack. 167 Profiler** enabledProfilerReference; 168 JSGlobalData* globalData; 169 170 ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; } 171 }; 172 #elif CPU(ARM_TRADITIONAL) 173 #if COMPILER(MSVC) 174 #pragma pack(push) 175 #pragma pack(4) 176 #endif // COMPILER(MSVC) 177 struct JITStackFrame { 178 JITStubArg padding; // Unused 179 JITStubArg args[7]; 180 181 ReturnAddressPtr thunkReturnAddress; 182 183 void* preservedR4; 184 void* preservedR5; 185 void* preservedR6; 186 void* preservedR7; 187 void* preservedR8; 188 void* preservedLink; 189 190 RegisterFile* registerFile; 191 CallFrame* callFrame; 192 void* unused1; 193 194 // These arguments passed on the stack. 195 Profiler** enabledProfilerReference; 196 JSGlobalData* globalData; 197 198 // When JIT code makes a call, it pushes its return address just below the rest of the stack. 199 ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; } 200 }; 201 #if COMPILER(MSVC) 202 #pragma pack(pop) 203 #endif // COMPILER(MSVC) 204 #elif CPU(MIPS) 205 struct JITStackFrame { 206 JITStubArg reserved; // Unused 207 JITStubArg args[6]; 208 209 #if USE(JSVALUE32_64) 210 void* padding; // Make the overall stack length 8-byte aligned. 211 #endif 212 213 void* preservedGP; // store GP when using PIC code 214 void* preservedS0; 215 void* preservedS1; 216 void* preservedS2; 217 void* preservedReturnAddress; 218 219 ReturnAddressPtr thunkReturnAddress; 220 221 // These arguments passed in a1..a3 (a0 contained the entry code pointed, which is not preserved) 222 RegisterFile* registerFile; 223 CallFrame* callFrame; 224 void* unused1; 225 226 // These arguments passed on the stack. 227 Profiler** enabledProfilerReference; 228 JSGlobalData* globalData; 229 230 ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; } 231 }; 232 #elif CPU(SH4) 233 struct JITStackFrame { 234 JITStubArg padding; // Unused 235 JITStubArg args[6]; 236 237 ReturnAddressPtr thunkReturnAddress; 238 void* savedR10; 239 void* savedR11; 240 void* savedR13; 241 void* savedRPR; 242 void* savedR14; 243 void* savedTimeoutReg; 244 245 RegisterFile* registerFile; 246 CallFrame* callFrame; 247 JSValue* exception; 248 Profiler** enabledProfilerReference; 249 JSGlobalData* globalData; 250 251 ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; } 252 }; 253 #else 254 #error "JITStackFrame not defined for this platform." 255 #endif 256 257 #define JITSTACKFRAME_ARGS_INDEX (OBJECT_OFFSETOF(JITStackFrame, args) / sizeof(void*)) 258 259 #define STUB_ARGS_DECLARATION void** args 260 #define STUB_ARGS (args) 261 262 #if CPU(X86) 263 #if COMPILER(MSVC) 264 #define JIT_STUB __fastcall 265 #elif COMPILER(GCC) 266 #define JIT_STUB __attribute__ ((fastcall)) 267 #else 268 #error "JIT_STUB function calls require fastcall conventions on x86, add appropriate directive/attribute here for your compiler!" 269 #endif 270 #else 271 #define JIT_STUB 272 #endif 273 274 extern "C" void ctiVMThrowTrampoline(); 275 extern "C" void ctiOpThrowNotCaught(); 276 extern "C" EncodedJSValue ctiTrampoline(void* code, RegisterFile*, CallFrame*, void* /*unused1*/, Profiler**, JSGlobalData*); 277 278 template <typename T> class Strong; 279 280 class JITThunks { 281 public: 282 JITThunks(JSGlobalData*); 283 ~JITThunks(); 284 285 static void tryCacheGetByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot&, StructureStubInfo* stubInfo); 286 static void tryCachePutByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const PutPropertySlot&, StructureStubInfo* stubInfo, bool direct); 287 288 MacroAssemblerCodePtr ctiStringLengthTrampoline() { return m_trampolineStructure.ctiStringLengthTrampoline; } 289 MacroAssemblerCodePtr ctiVirtualCallLink() { return m_trampolineStructure.ctiVirtualCallLink; } 290 MacroAssemblerCodePtr ctiVirtualConstructLink() { return m_trampolineStructure.ctiVirtualConstructLink; } 291 MacroAssemblerCodePtr ctiVirtualCall() { return m_trampolineStructure.ctiVirtualCall; } 292 MacroAssemblerCodePtr ctiVirtualConstruct() { return m_trampolineStructure.ctiVirtualConstruct; } 293 MacroAssemblerCodePtr ctiNativeCall() { return m_trampolineStructure.ctiNativeCall; } 294 MacroAssemblerCodePtr ctiNativeConstruct() { return m_trampolineStructure.ctiNativeConstruct; } 295 MacroAssemblerCodePtr ctiSoftModulo() { return m_trampolineStructure.ctiSoftModulo; } 296 297 MacroAssemblerCodePtr ctiStub(JSGlobalData* globalData, ThunkGenerator generator); 298 299 NativeExecutable* hostFunctionStub(JSGlobalData*, NativeFunction); 300 NativeExecutable* hostFunctionStub(JSGlobalData*, NativeFunction, ThunkGenerator); 301 302 void clearHostFunctionStubs(); 303 304 private: 305 typedef HashMap<ThunkGenerator, MacroAssemblerCodePtr> CTIStubMap; 306 CTIStubMap m_ctiStubMap; 307 typedef HashMap<NativeFunction, Strong<NativeExecutable> > HostFunctionStubMap; 308 OwnPtr<HostFunctionStubMap> m_hostFunctionStubMap; 309 RefPtr<ExecutablePool> m_executablePool; 310 311 TrampolineStructure m_trampolineStructure; 312 }; 313 314 extern "C" { 315 EncodedJSValue JIT_STUB cti_op_add(STUB_ARGS_DECLARATION); 316 EncodedJSValue JIT_STUB cti_op_bitand(STUB_ARGS_DECLARATION); 317 EncodedJSValue JIT_STUB cti_op_bitnot(STUB_ARGS_DECLARATION); 318 EncodedJSValue JIT_STUB cti_op_bitor(STUB_ARGS_DECLARATION); 319 EncodedJSValue JIT_STUB cti_op_bitxor(STUB_ARGS_DECLARATION); 320 EncodedJSValue JIT_STUB cti_op_call_NotJSFunction(STUB_ARGS_DECLARATION); 321 EncodedJSValue JIT_STUB cti_op_call_eval(STUB_ARGS_DECLARATION); 322 EncodedJSValue JIT_STUB cti_op_construct_NotJSConstruct(STUB_ARGS_DECLARATION); 323 EncodedJSValue JIT_STUB cti_op_create_this(STUB_ARGS_DECLARATION); 324 EncodedJSValue JIT_STUB cti_op_convert_this(STUB_ARGS_DECLARATION); 325 EncodedJSValue JIT_STUB cti_op_convert_this_strict(STUB_ARGS_DECLARATION); 326 EncodedJSValue JIT_STUB cti_op_create_arguments(STUB_ARGS_DECLARATION); 327 EncodedJSValue JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS_DECLARATION); 328 EncodedJSValue JIT_STUB cti_op_del_by_id(STUB_ARGS_DECLARATION); 329 EncodedJSValue JIT_STUB cti_op_del_by_val(STUB_ARGS_DECLARATION); 330 EncodedJSValue JIT_STUB cti_op_div(STUB_ARGS_DECLARATION); 331 EncodedJSValue JIT_STUB cti_op_get_by_id(STUB_ARGS_DECLARATION); 332 EncodedJSValue JIT_STUB cti_op_get_by_id_array_fail(STUB_ARGS_DECLARATION); 333 EncodedJSValue JIT_STUB cti_op_get_by_id_custom_stub(STUB_ARGS_DECLARATION); 334 EncodedJSValue JIT_STUB cti_op_get_by_id_generic(STUB_ARGS_DECLARATION); 335 EncodedJSValue JIT_STUB cti_op_get_by_id_getter_stub(STUB_ARGS_DECLARATION); 336 EncodedJSValue JIT_STUB cti_op_get_by_id_method_check(STUB_ARGS_DECLARATION); 337 EncodedJSValue JIT_STUB cti_op_get_by_id_proto_fail(STUB_ARGS_DECLARATION); 338 EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list(STUB_ARGS_DECLARATION); 339 EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list_full(STUB_ARGS_DECLARATION); 340 EncodedJSValue JIT_STUB cti_op_get_by_id_self_fail(STUB_ARGS_DECLARATION); 341 EncodedJSValue JIT_STUB cti_op_get_by_id_string_fail(STUB_ARGS_DECLARATION); 342 EncodedJSValue JIT_STUB cti_op_get_by_val(STUB_ARGS_DECLARATION); 343 EncodedJSValue JIT_STUB cti_op_get_by_val_byte_array(STUB_ARGS_DECLARATION); 344 EncodedJSValue JIT_STUB cti_op_get_by_val_string(STUB_ARGS_DECLARATION); 345 EncodedJSValue JIT_STUB cti_op_in(STUB_ARGS_DECLARATION); 346 EncodedJSValue JIT_STUB cti_op_instanceof(STUB_ARGS_DECLARATION); 347 EncodedJSValue JIT_STUB cti_op_is_boolean(STUB_ARGS_DECLARATION); 348 EncodedJSValue JIT_STUB cti_op_is_function(STUB_ARGS_DECLARATION); 349 EncodedJSValue JIT_STUB cti_op_is_number(STUB_ARGS_DECLARATION); 350 EncodedJSValue JIT_STUB cti_op_is_object(STUB_ARGS_DECLARATION); 351 EncodedJSValue JIT_STUB cti_op_is_string(STUB_ARGS_DECLARATION); 352 EncodedJSValue JIT_STUB cti_op_is_undefined(STUB_ARGS_DECLARATION); 353 EncodedJSValue JIT_STUB cti_op_less(STUB_ARGS_DECLARATION); 354 EncodedJSValue JIT_STUB cti_op_lesseq(STUB_ARGS_DECLARATION); 355 EncodedJSValue JIT_STUB cti_op_lshift(STUB_ARGS_DECLARATION); 356 EncodedJSValue JIT_STUB cti_op_mod(STUB_ARGS_DECLARATION); 357 EncodedJSValue JIT_STUB cti_op_mul(STUB_ARGS_DECLARATION); 358 EncodedJSValue JIT_STUB cti_op_negate(STUB_ARGS_DECLARATION); 359 EncodedJSValue JIT_STUB cti_op_not(STUB_ARGS_DECLARATION); 360 EncodedJSValue JIT_STUB cti_op_nstricteq(STUB_ARGS_DECLARATION); 361 EncodedJSValue JIT_STUB cti_op_post_dec(STUB_ARGS_DECLARATION); 362 EncodedJSValue JIT_STUB cti_op_post_inc(STUB_ARGS_DECLARATION); 363 EncodedJSValue JIT_STUB cti_op_pre_dec(STUB_ARGS_DECLARATION); 364 EncodedJSValue JIT_STUB cti_op_pre_inc(STUB_ARGS_DECLARATION); 365 EncodedJSValue JIT_STUB cti_op_resolve(STUB_ARGS_DECLARATION); 366 EncodedJSValue JIT_STUB cti_op_resolve_base(STUB_ARGS_DECLARATION); 367 EncodedJSValue JIT_STUB cti_op_resolve_base_strict_put(STUB_ARGS_DECLARATION); 368 EncodedJSValue JIT_STUB cti_op_ensure_property_exists(STUB_ARGS_DECLARATION); 369 EncodedJSValue JIT_STUB cti_op_resolve_global(STUB_ARGS_DECLARATION); 370 EncodedJSValue JIT_STUB cti_op_resolve_global_dynamic(STUB_ARGS_DECLARATION); 371 EncodedJSValue JIT_STUB cti_op_resolve_skip(STUB_ARGS_DECLARATION); 372 EncodedJSValue JIT_STUB cti_op_resolve_with_base(STUB_ARGS_DECLARATION); 373 EncodedJSValue JIT_STUB cti_op_rshift(STUB_ARGS_DECLARATION); 374 EncodedJSValue JIT_STUB cti_op_strcat(STUB_ARGS_DECLARATION); 375 EncodedJSValue JIT_STUB cti_op_stricteq(STUB_ARGS_DECLARATION); 376 EncodedJSValue JIT_STUB cti_op_sub(STUB_ARGS_DECLARATION); 377 EncodedJSValue JIT_STUB cti_op_to_jsnumber(STUB_ARGS_DECLARATION); 378 EncodedJSValue JIT_STUB cti_op_to_primitive(STUB_ARGS_DECLARATION); 379 EncodedJSValue JIT_STUB cti_op_typeof(STUB_ARGS_DECLARATION); 380 EncodedJSValue JIT_STUB cti_op_urshift(STUB_ARGS_DECLARATION); 381 EncodedJSValue JIT_STUB cti_to_object(STUB_ARGS_DECLARATION); 382 JSObject* JIT_STUB cti_op_new_array(STUB_ARGS_DECLARATION); 383 JSObject* JIT_STUB cti_op_new_func(STUB_ARGS_DECLARATION); 384 JSObject* JIT_STUB cti_op_new_func_exp(STUB_ARGS_DECLARATION); 385 JSObject* JIT_STUB cti_op_new_object(STUB_ARGS_DECLARATION); 386 JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS_DECLARATION); 387 JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS_DECLARATION); 388 JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS_DECLARATION); 389 JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS_DECLARATION); 390 JSObject* JIT_STUB cti_op_put_by_id_transition_realloc(STUB_ARGS_DECLARATION); 391 JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS_DECLARATION); 392 int JIT_STUB cti_op_eq(STUB_ARGS_DECLARATION); 393 int JIT_STUB cti_op_eq_strings(STUB_ARGS_DECLARATION); 394 int JIT_STUB cti_op_jless(STUB_ARGS_DECLARATION); 395 int JIT_STUB cti_op_jlesseq(STUB_ARGS_DECLARATION); 396 int JIT_STUB cti_op_jtrue(STUB_ARGS_DECLARATION); 397 int JIT_STUB cti_op_load_varargs(STUB_ARGS_DECLARATION); 398 int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS_DECLARATION); 399 int JIT_STUB cti_timeout_check(STUB_ARGS_DECLARATION); 400 int JIT_STUB cti_has_property(STUB_ARGS_DECLARATION); 401 void JIT_STUB cti_op_check_has_instance(STUB_ARGS_DECLARATION); 402 void JIT_STUB cti_op_debug(STUB_ARGS_DECLARATION); 403 void JIT_STUB cti_op_end(STUB_ARGS_DECLARATION); 404 void JIT_STUB cti_op_jmp_scopes(STUB_ARGS_DECLARATION); 405 void JIT_STUB cti_op_pop_scope(STUB_ARGS_DECLARATION); 406 void JIT_STUB cti_op_profile_did_call(STUB_ARGS_DECLARATION); 407 void JIT_STUB cti_op_profile_will_call(STUB_ARGS_DECLARATION); 408 void JIT_STUB cti_op_put_by_id(STUB_ARGS_DECLARATION); 409 void JIT_STUB cti_op_put_by_id_fail(STUB_ARGS_DECLARATION); 410 void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS_DECLARATION); 411 void JIT_STUB cti_op_put_by_id_direct(STUB_ARGS_DECLARATION); 412 void JIT_STUB cti_op_put_by_id_direct_fail(STUB_ARGS_DECLARATION); 413 void JIT_STUB cti_op_put_by_id_direct_generic(STUB_ARGS_DECLARATION); 414 void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION); 415 void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION); 416 void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS_DECLARATION); 417 void JIT_STUB cti_op_put_getter(STUB_ARGS_DECLARATION); 418 void JIT_STUB cti_op_put_setter(STUB_ARGS_DECLARATION); 419 void JIT_STUB cti_op_tear_off_activation(STUB_ARGS_DECLARATION); 420 void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION); 421 void JIT_STUB cti_op_throw_reference_error(STUB_ARGS_DECLARATION); 422 void* JIT_STUB cti_op_call_arityCheck(STUB_ARGS_DECLARATION); 423 void* JIT_STUB cti_op_construct_arityCheck(STUB_ARGS_DECLARATION); 424 void* JIT_STUB cti_op_call_jitCompile(STUB_ARGS_DECLARATION); 425 void* JIT_STUB cti_op_construct_jitCompile(STUB_ARGS_DECLARATION); 426 void* JIT_STUB cti_op_switch_char(STUB_ARGS_DECLARATION); 427 void* JIT_STUB cti_op_switch_imm(STUB_ARGS_DECLARATION); 428 void* JIT_STUB cti_op_switch_string(STUB_ARGS_DECLARATION); 429 void* JIT_STUB cti_op_throw(STUB_ARGS_DECLARATION); 430 void* JIT_STUB cti_register_file_check(STUB_ARGS_DECLARATION); 431 void* JIT_STUB cti_vm_lazyLinkCall(STUB_ARGS_DECLARATION); 432 void* JIT_STUB cti_vm_lazyLinkConstruct(STUB_ARGS_DECLARATION); 433 void* JIT_STUB cti_vm_throw(STUB_ARGS_DECLARATION); 434 } // extern "C" 435 436 } // namespace JSC 437 438 #endif // ENABLE(JIT) 439 440 #endif // JITStubs_h 441