1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef LLIntSlowPaths_h 27#define LLIntSlowPaths_h 28 29#include <wtf/Platform.h> 30#include <wtf/StdLibExtras.h> 31 32#if ENABLE(LLINT) 33 34namespace JSC { 35 36class ExecState; 37struct Instruction; 38 39namespace LLInt { 40 41#if USE(JSVALUE64) 42// According to C++ rules, a type used for the return signature of function with C linkage (i.e. 43// 'extern "C"') needs to be POD; hence putting any constructors into it could cause either compiler 44// warnings, or worse, a change in the ABI used to return these types. 45struct SlowPathReturnType { 46 void* a; 47 ExecState* b; 48}; 49 50inline SlowPathReturnType encodeResult(void* a, ExecState* b) 51{ 52 SlowPathReturnType result; 53 result.a = a; 54 result.b = b; 55 return result; 56} 57 58inline void decodeResult(SlowPathReturnType result, void*& a, ExecState*& b) 59{ 60 a = result.a; 61 b = result.b; 62} 63 64#else // USE(JSVALUE32_64) 65typedef int64_t SlowPathReturnType; 66 67typedef union { 68 struct { 69 void* a; 70 ExecState* b; 71 } pair; 72 int64_t i; 73} SlowPathReturnTypeEncoding; 74 75inline SlowPathReturnType encodeResult(void* a, ExecState* b) 76{ 77 SlowPathReturnTypeEncoding u; 78 u.pair.a = a; 79 u.pair.b = b; 80 return u.i; 81} 82 83inline void decodeResult(SlowPathReturnType result, void*& a, ExecState*& b) 84{ 85 SlowPathReturnTypeEncoding u; 86 u.i = result; 87 a = u.pair.a; 88 b = u.pair.b; 89} 90#endif // USE(JSVALUE32_64) 91 92extern "C" SlowPathReturnType llint_trace_operand(ExecState*, Instruction*, int fromWhere, int operand); 93extern "C" SlowPathReturnType llint_trace_value(ExecState*, Instruction*, int fromWhere, int operand); 94 95#define LLINT_SLOW_PATH_DECL(name) \ 96 extern "C" SlowPathReturnType llint_##name(ExecState* exec, Instruction* pc) 97 98#define LLINT_SLOW_PATH_HIDDEN_DECL(name) \ 99 LLINT_SLOW_PATH_DECL(name) WTF_INTERNAL 100 101LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue); 102LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_call); 103LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_construct); 104LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_call); 105LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_construct); 106LLINT_SLOW_PATH_HIDDEN_DECL(trace); 107LLINT_SLOW_PATH_HIDDEN_DECL(special_trace); 108LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr); 109LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call); 110LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct); 111LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call_arityCheck); 112LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct_arityCheck); 113LLINT_SLOW_PATH_HIDDEN_DECL(loop_osr); 114LLINT_SLOW_PATH_HIDDEN_DECL(replace); 115LLINT_SLOW_PATH_HIDDEN_DECL(stack_check); 116LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_arityCheck); 117LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct_arityCheck); 118LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_activation); 119LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_arguments); 120LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_this); 121LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_convert_this); 122LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_object); 123LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array); 124LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_with_size); 125LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_buffer); 126LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_regexp); 127LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_not); 128LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_eq); 129LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_neq); 130LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_stricteq); 131LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_nstricteq); 132LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_less); 133LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lesseq); 134LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greater); 135LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greatereq); 136LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_inc); 137LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_dec); 138LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_number); 139LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_negate); 140LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_add); 141LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mul); 142LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_sub); 143LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_div); 144LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mod); 145LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lshift); 146LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_rshift); 147LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_urshift); 148LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitand); 149LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitor); 150LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitxor); 151LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_check_has_instance); 152LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_instanceof); 153LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_typeof); 154LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_object); 155LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_function); 156LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_in); 157LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve); 158LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_to_base); 159LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_base); 160LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_base); 161LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_this); 162LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_init_global_const_check); 163LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_id); 164LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_arguments_length); 165LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_id); 166LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_id); 167LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_val); 168LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_argument_by_val); 169LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_pname); 170LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_val); 171LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_val); 172LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_index); 173LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_getter_setter); 174LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jtrue); 175LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jfalse); 176LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jless); 177LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnless); 178LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreater); 179LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreater); 180LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jlesseq); 181LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnlesseq); 182LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreatereq); 183LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreatereq); 184LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_imm); 185LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_char); 186LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_string); 187LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func); 188LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func_exp); 189LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call); 190LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct); 191LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_varargs); 192LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_eval); 193LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_activation); 194LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_arguments); 195LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_strcat); 196LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive); 197LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_pnames); 198LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_next_pname); 199LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_with_scope); 200LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pop_scope); 201LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_name_scope); 202LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw); 203LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw_static_error); 204LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_handle_watchdog_timer); 205LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_debug); 206LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_will_call); 207LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_did_call); 208LLINT_SLOW_PATH_HIDDEN_DECL(throw_from_native_call); 209 210} } // namespace JSC::LLInt 211 212#endif // ENABLE(LLINT) 213 214#endif // LLIntSlowPaths_h 215 216