43 |
#ifdef JS_TRACER |
#ifdef JS_TRACER |
44 |
|
|
45 |
#include "nanojit/nanojit.h" |
#include "nanojit/nanojit.h" |
46 |
#include "jstracer.h" |
|
47 |
|
#ifdef THIS |
48 |
|
#undef THIS |
49 |
|
#endif |
50 |
|
|
51 |
enum JSTNErrType { INFALLIBLE, FAIL_STATUS, FAIL_NULL, FAIL_NEG, FAIL_VOID, FAIL_COOKIE }; |
enum JSTNErrType { INFALLIBLE, FAIL_STATUS, FAIL_NULL, FAIL_NEG, FAIL_VOID, FAIL_COOKIE }; |
52 |
enum { JSTN_ERRTYPE_MASK = 0x07, JSTN_UNBOX_AFTER = 0x08, JSTN_MORE = 0x10, |
enum { JSTN_ERRTYPE_MASK = 0x07, JSTN_UNBOX_AFTER = 0x08, JSTN_MORE = 0x10, |
55 |
#define JSTN_ERRTYPE(jstn) ((jstn)->flags & JSTN_ERRTYPE_MASK) |
#define JSTN_ERRTYPE(jstn) ((jstn)->flags & JSTN_ERRTYPE_MASK) |
56 |
|
|
57 |
/* |
/* |
58 |
|
* Type describing a type specialization of a JSFastNative. |
59 |
|
* |
60 |
* |prefix| and |argtypes| declare what arguments should be passed to the |
* |prefix| and |argtypes| declare what arguments should be passed to the |
61 |
* native function. |prefix| can contain the following characters: |
* native function. |prefix| can contain the following characters: |
62 |
* |
* |
82 |
* 'f': a JSObject* argument that is of class js_FunctionClass |
* 'f': a JSObject* argument that is of class js_FunctionClass |
83 |
* 'v': a jsval argument (boxing whatever value is actually being passed in) |
* 'v': a jsval argument (boxing whatever value is actually being passed in) |
84 |
*/ |
*/ |
85 |
struct JSTraceableNative { |
struct JSSpecializedNative { |
|
JSFastNative native; |
|
86 |
const nanojit::CallInfo *builtin; |
const nanojit::CallInfo *builtin; |
87 |
const char *prefix; |
const char *prefix; |
88 |
const char *argtypes; |
const char *argtypes; |
89 |
uintN flags; /* JSTNErrType | JSTN_UNBOX_AFTER | JSTN_MORE | |
uintN flags; /* JSTNErrType | JSTN_UNBOX_AFTER | JSTN_MORE | |
90 |
JSTN_CONSTRUCTOR */ |
JSTN_CONSTRUCTOR */ |
91 |
}; |
}; |
92 |
|
|
93 |
/* |
/* |
94 |
|
* Type holding extra trace-specific information about a fast native. |
95 |
|
* |
96 |
|
* 'specializations' points to a static array of available specializations |
97 |
|
* terminated by the lack of having the JSTN_MORE flag set. |
98 |
|
*/ |
99 |
|
struct JSNativeTraceInfo { |
100 |
|
JSFastNative native; |
101 |
|
JSSpecializedNative *specializations; |
102 |
|
}; |
103 |
|
|
104 |
|
/* |
105 |
* We use a magic boxed pointer value to represent error conditions that |
* We use a magic boxed pointer value to represent error conditions that |
106 |
* trigger a side exit. The address is so low that it should never be actually |
* trigger a side exit. The address is so low that it should never be actually |
107 |
* in use. If it is, a performance regression occurs, not an actual runtime |
* in use. If it is, a performance regression occurs, not an actual runtime |
116 |
#define _JS_CI_NAME(op) |
#define _JS_CI_NAME(op) |
117 |
#endif |
#endif |
118 |
|
|
119 |
#define _JS_I32_ARGSIZE nanojit::ARGSIZE_LO |
#define _JS_I32_ARGSIZE nanojit::ARGSIZE_I |
120 |
#define _JS_I32_RETSIZE nanojit::ARGSIZE_LO |
#define _JS_I32_RETSIZE nanojit::ARGSIZE_I |
121 |
#define _JS_F64_ARGSIZE nanojit::ARGSIZE_F |
#define _JS_F64_ARGSIZE nanojit::ARGSIZE_F |
122 |
#define _JS_F64_RETSIZE nanojit::ARGSIZE_F |
#define _JS_F64_RETSIZE nanojit::ARGSIZE_F |
123 |
#define _JS_PTR_ARGSIZE nanojit::ARGSIZE_LO |
#define _JS_PTR_ARGSIZE nanojit::ARGSIZE_P |
124 |
#if defined AVMPLUS_64BIT |
#define _JS_PTR_RETSIZE nanojit::ARGSIZE_P |
125 |
# define _JS_PTR_RETSIZE nanojit::ARGSIZE_Q |
|
126 |
#else |
class ClosureVarInfo; |
|
# define _JS_PTR_RETSIZE nanojit::ARGSIZE_LO |
|
|
#endif |
|
127 |
|
|
128 |
/* |
/* |
129 |
* Supported types for builtin functions. |
* Supported types for builtin functions. |
130 |
* |
* |
131 |
* Types with -- for the two string fields are not permitted as argument types |
* Types with -- for the two string fields are not permitted as argument types |
132 |
* in JS_DEFINE_TRCINFO. |
* in JS_DEFINE_TRCINFO. |
174 |
* trace. If an exception is pending, it is thrown; otherwise, we assume the |
* trace. If an exception is pending, it is thrown; otherwise, we assume the |
175 |
* builtin had no side effects and retry the current bytecode in the |
* builtin had no side effects and retry the current bytecode in the |
176 |
* interpreter. |
* interpreter. |
177 |
* |
* |
178 |
* So a builtin must not return a value indicating failure after causing side |
* So a builtin must not return a value indicating failure after causing side |
179 |
* effects (such as reporting an error), without setting an exception pending. |
* effects (such as reporting an error), without setting an exception pending. |
180 |
* The operation would be retried, despite the first attempt's observable |
* The operation would be retried, despite the first attempt's observable |
190 |
#define _JS_CTYPE_THIS_STRING _JS_CTYPE(JSString *, _JS_PTR,"S", "", INFALLIBLE) |
#define _JS_CTYPE_THIS_STRING _JS_CTYPE(JSString *, _JS_PTR,"S", "", INFALLIBLE) |
191 |
#define _JS_CTYPE_CALLEE _JS_CTYPE(JSObject *, _JS_PTR,"f","", INFALLIBLE) |
#define _JS_CTYPE_CALLEE _JS_CTYPE(JSObject *, _JS_PTR,"f","", INFALLIBLE) |
192 |
#define _JS_CTYPE_CALLEE_PROTOTYPE _JS_CTYPE(JSObject *, _JS_PTR,"p","", INFALLIBLE) |
#define _JS_CTYPE_CALLEE_PROTOTYPE _JS_CTYPE(JSObject *, _JS_PTR,"p","", INFALLIBLE) |
193 |
|
#define _JS_CTYPE_FUNCTION _JS_CTYPE(JSFunction *, _JS_PTR, --, --, INFALLIBLE) |
194 |
#define _JS_CTYPE_PC _JS_CTYPE(jsbytecode *, _JS_PTR,"P", "", INFALLIBLE) |
#define _JS_CTYPE_PC _JS_CTYPE(jsbytecode *, _JS_PTR,"P", "", INFALLIBLE) |
195 |
#define _JS_CTYPE_JSVALPTR _JS_CTYPE(jsval *, _JS_PTR,"P", "", INFALLIBLE) |
#define _JS_CTYPE_JSVALPTR _JS_CTYPE(jsval *, _JS_PTR,"P", "", INFALLIBLE) |
196 |
#define _JS_CTYPE_JSVAL _JS_JSVAL_CTYPE( _JS_PTR, "","v", INFALLIBLE) |
#define _JS_CTYPE_JSVAL _JS_JSVAL_CTYPE( _JS_PTR, "","v", INFALLIBLE) |
197 |
#define _JS_CTYPE_JSVAL_RETRY _JS_JSVAL_CTYPE( _JS_PTR, --, --, FAIL_COOKIE) |
#define _JS_CTYPE_JSVAL_RETRY _JS_JSVAL_CTYPE( _JS_PTR, --, --, FAIL_COOKIE) |
198 |
#define _JS_CTYPE_JSVAL_FAIL _JS_JSVAL_CTYPE( _JS_PTR, --, --, FAIL_STATUS) |
#define _JS_CTYPE_JSVAL_FAIL _JS_JSVAL_CTYPE( _JS_PTR, --, --, FAIL_STATUS) |
199 |
|
#define _JS_CTYPE_JSID _JS_CTYPE(jsid, _JS_PTR, --, --, INFALLIBLE) |
200 |
#define _JS_CTYPE_BOOL _JS_CTYPE(JSBool, _JS_I32, "","i", INFALLIBLE) |
#define _JS_CTYPE_BOOL _JS_CTYPE(JSBool, _JS_I32, "","i", INFALLIBLE) |
201 |
#define _JS_CTYPE_BOOL_RETRY _JS_CTYPE(JSBool, _JS_I32, --, --, FAIL_VOID) |
#define _JS_CTYPE_BOOL_RETRY _JS_CTYPE(JSBool, _JS_I32, --, --, FAIL_VOID) |
202 |
#define _JS_CTYPE_BOOL_FAIL _JS_CTYPE(JSBool, _JS_I32, --, --, FAIL_STATUS) |
#define _JS_CTYPE_BOOL_FAIL _JS_CTYPE(JSBool, _JS_I32, --, --, FAIL_STATUS) |
211 |
#define _JS_CTYPE_STRING _JS_CTYPE(JSString *, _JS_PTR, "","s", INFALLIBLE) |
#define _JS_CTYPE_STRING _JS_CTYPE(JSString *, _JS_PTR, "","s", INFALLIBLE) |
212 |
#define _JS_CTYPE_STRING_RETRY _JS_CTYPE(JSString *, _JS_PTR, --, --, FAIL_NULL) |
#define _JS_CTYPE_STRING_RETRY _JS_CTYPE(JSString *, _JS_PTR, --, --, FAIL_NULL) |
213 |
#define _JS_CTYPE_STRING_FAIL _JS_CTYPE(JSString *, _JS_PTR, --, --, FAIL_STATUS) |
#define _JS_CTYPE_STRING_FAIL _JS_CTYPE(JSString *, _JS_PTR, --, --, FAIL_STATUS) |
214 |
|
#define _JS_CTYPE_STRINGPTR _JS_CTYPE(JSString **, _JS_PTR, --, --, INFALLIBLE) |
215 |
#define _JS_CTYPE_OBJECT _JS_CTYPE(JSObject *, _JS_PTR, "","o", INFALLIBLE) |
#define _JS_CTYPE_OBJECT _JS_CTYPE(JSObject *, _JS_PTR, "","o", INFALLIBLE) |
216 |
#define _JS_CTYPE_OBJECT_RETRY _JS_CTYPE(JSObject *, _JS_PTR, --, --, FAIL_NULL) |
#define _JS_CTYPE_OBJECT_RETRY _JS_CTYPE(JSObject *, _JS_PTR, --, --, FAIL_NULL) |
217 |
#define _JS_CTYPE_OBJECT_FAIL _JS_CTYPE(JSObject *, _JS_PTR, --, --, FAIL_STATUS) |
#define _JS_CTYPE_OBJECT_FAIL _JS_CTYPE(JSObject *, _JS_PTR, --, --, FAIL_STATUS) |
224 |
#define _JS_CTYPE_FRAGMENT _JS_CTYPE(nanojit::Fragment *, _JS_PTR, --, --, INFALLIBLE) |
#define _JS_CTYPE_FRAGMENT _JS_CTYPE(nanojit::Fragment *, _JS_PTR, --, --, INFALLIBLE) |
225 |
#define _JS_CTYPE_CLASS _JS_CTYPE(JSClass *, _JS_PTR, --, --, INFALLIBLE) |
#define _JS_CTYPE_CLASS _JS_CTYPE(JSClass *, _JS_PTR, --, --, INFALLIBLE) |
226 |
#define _JS_CTYPE_DOUBLEPTR _JS_CTYPE(double *, _JS_PTR, --, --, INFALLIBLE) |
#define _JS_CTYPE_DOUBLEPTR _JS_CTYPE(double *, _JS_PTR, --, --, INFALLIBLE) |
227 |
|
#define _JS_CTYPE_CHARPTR _JS_CTYPE(char *, _JS_PTR, --, --, INFALLIBLE) |
228 |
|
#define _JS_CTYPE_APNPTR _JS_CTYPE(js_ArgsPrivateNative *, _JS_PTR, --, --, INFALLIBLE) |
229 |
|
#define _JS_CTYPE_CVIPTR _JS_CTYPE(const ClosureVarInfo *, _JS_PTR, --, --, INFALLIBLE) |
230 |
|
|
231 |
#define _JS_EXPAND(tokens) tokens |
#define _JS_EXPAND(tokens) tokens |
232 |
|
|
267 |
#endif |
#endif |
268 |
|
|
269 |
/* |
/* |
270 |
* Declare a C function named <op> and a CallInfo struct named <op>_callinfo so the |
* This macro is used for builtin functions that can be called from JITted |
271 |
* tracer can call it. |linkage| controls the visibility of both the function |
* code. It declares a C function named <op> and a CallInfo struct named |
272 |
* and the CallInfo global. It can be extern, static, or FRIEND, which |
* <op>_ci so the tracer can call it. The <N> in JS_DEFINE_CALLINFO_<N> is |
273 |
* specifies JS_FRIEND_API linkage for the function. |
* the number of arguments the builtin takes. Builtins with no arguments |
274 |
|
* are not supported. Using a macro is clunky but ensures that the types |
275 |
|
* for each C function matches those for the corresponding CallInfo struct; |
276 |
|
* mismatched types can cause subtle problems. |
277 |
|
* |
278 |
|
* The macro arguments are: |
279 |
|
* |
280 |
|
* - The linkage for the function and the associated CallInfo global. It |
281 |
|
* can be extern, static, or FRIEND, which specifies JS_FRIEND_API linkage |
282 |
|
* for the function. |
283 |
|
* |
284 |
|
* - The return type. This identifier must name one of the _JS_TYPEINFO_* |
285 |
|
* macros defined in jsbuiltins.h. |
286 |
|
* |
287 |
|
* - The builtin name. |
288 |
|
* |
289 |
|
* - The parameter types. |
290 |
|
* |
291 |
|
* - The cse flag. 1 if the builtin call can be optimized away by common |
292 |
|
* subexpression elimination; otherwise 0. This should be 1 only if the |
293 |
|
* function is idempotent and the return value is determined solely by the |
294 |
|
* arguments. |
295 |
|
* |
296 |
|
* - The fold flag. Reserved. The same as cse for now. |
297 |
*/ |
*/ |
298 |
#define JS_DEFINE_CALLINFO_1(linkage, rt, op, at0, cse, fold) \ |
#define JS_DEFINE_CALLINFO_1(linkage, rt, op, at0, cse, fold) \ |
299 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), (_JS_CTYPE_TYPE(at0)), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), (_JS_CTYPE_TYPE(at0)), \ |
300 |
(_JS_CTYPE_ARGSIZE(at0) << 2) | _JS_CTYPE_RETSIZE(rt), cse, fold) |
(_JS_CTYPE_ARGSIZE(at0) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
301 |
|
_JS_CTYPE_RETSIZE(rt), cse, fold) |
302 |
#define JS_DEFINE_CALLINFO_2(linkage, rt, op, at0, at1, cse, fold) \ |
#define JS_DEFINE_CALLINFO_2(linkage, rt, op, at0, at1, cse, fold) \ |
303 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
304 |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1)), \ |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1)), \ |
305 |
(_JS_CTYPE_ARGSIZE(at0) << 4) | (_JS_CTYPE_ARGSIZE(at1) << 2) | \ |
(_JS_CTYPE_ARGSIZE(at0) << (2*nanojit::ARGSIZE_SHIFT)) | \ |
306 |
|
(_JS_CTYPE_ARGSIZE(at1) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
307 |
_JS_CTYPE_RETSIZE(rt), \ |
_JS_CTYPE_RETSIZE(rt), \ |
308 |
cse, fold) |
cse, fold) |
309 |
#define JS_DEFINE_CALLINFO_3(linkage, rt, op, at0, at1, at2, cse, fold) \ |
#define JS_DEFINE_CALLINFO_3(linkage, rt, op, at0, at1, at2, cse, fold) \ |
310 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
311 |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2)), \ |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2)), \ |
312 |
(_JS_CTYPE_ARGSIZE(at0) << 6) | (_JS_CTYPE_ARGSIZE(at1) << 4) | \ |
(_JS_CTYPE_ARGSIZE(at0) << (3*nanojit::ARGSIZE_SHIFT)) | \ |
313 |
(_JS_CTYPE_ARGSIZE(at2) << 2) | _JS_CTYPE_RETSIZE(rt), \ |
(_JS_CTYPE_ARGSIZE(at1) << (2*nanojit::ARGSIZE_SHIFT)) | \ |
314 |
|
(_JS_CTYPE_ARGSIZE(at2) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
315 |
|
_JS_CTYPE_RETSIZE(rt), \ |
316 |
cse, fold) |
cse, fold) |
317 |
#define JS_DEFINE_CALLINFO_4(linkage, rt, op, at0, at1, at2, at3, cse, fold) \ |
#define JS_DEFINE_CALLINFO_4(linkage, rt, op, at0, at1, at2, at3, cse, fold) \ |
318 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
319 |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
320 |
_JS_CTYPE_TYPE(at3)), \ |
_JS_CTYPE_TYPE(at3)), \ |
321 |
(_JS_CTYPE_ARGSIZE(at0) << 8) | (_JS_CTYPE_ARGSIZE(at1) << 6) | \ |
(_JS_CTYPE_ARGSIZE(at0) << (4*nanojit::ARGSIZE_SHIFT)) | \ |
322 |
(_JS_CTYPE_ARGSIZE(at2) << 4) | (_JS_CTYPE_ARGSIZE(at3) << 2) | \ |
(_JS_CTYPE_ARGSIZE(at1) << (3*nanojit::ARGSIZE_SHIFT)) | \ |
323 |
|
(_JS_CTYPE_ARGSIZE(at2) << (2*nanojit::ARGSIZE_SHIFT)) | \ |
324 |
|
(_JS_CTYPE_ARGSIZE(at3) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
325 |
_JS_CTYPE_RETSIZE(rt), \ |
_JS_CTYPE_RETSIZE(rt), \ |
326 |
cse, fold) |
cse, fold) |
327 |
#define JS_DEFINE_CALLINFO_5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) \ |
#define JS_DEFINE_CALLINFO_5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) \ |
328 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
329 |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
330 |
_JS_CTYPE_TYPE(at3), _JS_CTYPE_TYPE(at4)), \ |
_JS_CTYPE_TYPE(at3), _JS_CTYPE_TYPE(at4)), \ |
331 |
(_JS_CTYPE_ARGSIZE(at0) << 10) | (_JS_CTYPE_ARGSIZE(at1) << 8) | \ |
(_JS_CTYPE_ARGSIZE(at0) << (5*nanojit::ARGSIZE_SHIFT)) | \ |
332 |
(_JS_CTYPE_ARGSIZE(at2) << 6) | (_JS_CTYPE_ARGSIZE(at3) << 4) | \ |
(_JS_CTYPE_ARGSIZE(at1) << (4*nanojit::ARGSIZE_SHIFT)) | \ |
333 |
(_JS_CTYPE_ARGSIZE(at4) << 2) | _JS_CTYPE_RETSIZE(rt), \ |
(_JS_CTYPE_ARGSIZE(at2) << (3*nanojit::ARGSIZE_SHIFT)) | \ |
334 |
|
(_JS_CTYPE_ARGSIZE(at3) << (2*nanojit::ARGSIZE_SHIFT)) | \ |
335 |
|
(_JS_CTYPE_ARGSIZE(at4) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
336 |
|
_JS_CTYPE_RETSIZE(rt), \ |
337 |
cse, fold) |
cse, fold) |
338 |
|
|
339 |
#define JS_DEFINE_CALLINFO_6(linkage, rt, op, at0, at1, at2, at3, at4, at5, cse, fold) \ |
#define JS_DEFINE_CALLINFO_6(linkage, rt, op, at0, at1, at2, at3, at4, at5, cse, fold) \ |
340 |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
_JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), \ |
341 |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
(_JS_CTYPE_TYPE(at0), _JS_CTYPE_TYPE(at1), _JS_CTYPE_TYPE(at2), \ |
342 |
_JS_CTYPE_TYPE(at3), _JS_CTYPE_TYPE(at4), _JS_CTYPE_TYPE(at5)), \ |
_JS_CTYPE_TYPE(at3), _JS_CTYPE_TYPE(at4), _JS_CTYPE_TYPE(at5)), \ |
343 |
(_JS_CTYPE_ARGSIZE(at0) << 12) | (_JS_CTYPE_ARGSIZE(at1) << 10) | \ |
(_JS_CTYPE_ARGSIZE(at0) << (6*nanojit::ARGSIZE_SHIFT)) | \ |
344 |
(_JS_CTYPE_ARGSIZE(at2) << 8) | (_JS_CTYPE_ARGSIZE(at3) << 6) | \ |
(_JS_CTYPE_ARGSIZE(at1) << (5*nanojit::ARGSIZE_SHIFT)) | \ |
345 |
(_JS_CTYPE_ARGSIZE(at4) << 4) | (_JS_CTYPE_ARGSIZE(at5) << 2) | \ |
(_JS_CTYPE_ARGSIZE(at2) << (4*nanojit::ARGSIZE_SHIFT)) | \ |
346 |
|
(_JS_CTYPE_ARGSIZE(at3) << (3*nanojit::ARGSIZE_SHIFT)) | \ |
347 |
|
(_JS_CTYPE_ARGSIZE(at4) << (2*nanojit::ARGSIZE_SHIFT)) | \ |
348 |
|
(_JS_CTYPE_ARGSIZE(at5) << (1*nanojit::ARGSIZE_SHIFT)) | \ |
349 |
_JS_CTYPE_RETSIZE(rt), cse, fold) |
_JS_CTYPE_RETSIZE(rt), cse, fold) |
350 |
|
|
351 |
#define JS_DECLARE_CALLINFO(name) extern const nanojit::CallInfo _JS_CALLINFO(name); |
#define JS_DECLARE_CALLINFO(name) extern const nanojit::CallInfo _JS_CALLINFO(name); |
394 |
|
|
395 |
#define JS_DEFINE_TRCINFO_1(name, tn0) \ |
#define JS_DEFINE_TRCINFO_1(name, tn0) \ |
396 |
_JS_DEFINE_CALLINFO_n tn0 \ |
_JS_DEFINE_CALLINFO_n tn0 \ |
397 |
JSTraceableNative name##_trcinfo[] = { \ |
JSSpecializedNative name##_sns[] = { \ |
398 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn0 } \ |
{ _JS_TN_INIT_HELPER_n tn0 } \ |
399 |
}; |
}; \ |
400 |
|
JSNativeTraceInfo name##_trcinfo = { (JSFastNative)name, name##_sns }; |
401 |
|
|
402 |
#define JS_DEFINE_TRCINFO_2(name, tn0, tn1) \ |
#define JS_DEFINE_TRCINFO_2(name, tn0, tn1) \ |
403 |
_JS_DEFINE_CALLINFO_n tn0 \ |
_JS_DEFINE_CALLINFO_n tn0 \ |
404 |
_JS_DEFINE_CALLINFO_n tn1 \ |
_JS_DEFINE_CALLINFO_n tn1 \ |
405 |
JSTraceableNative name##_trcinfo[] = { \ |
JSSpecializedNative name##_sns[] = { \ |
406 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
407 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn1 } \ |
{ _JS_TN_INIT_HELPER_n tn1 } \ |
408 |
}; |
}; \ |
409 |
|
JSNativeTraceInfo name##_trcinfo = { (JSFastNative)name, name##_sns }; |
410 |
|
|
411 |
#define JS_DEFINE_TRCINFO_3(name, tn0, tn1, tn2) \ |
#define JS_DEFINE_TRCINFO_3(name, tn0, tn1, tn2) \ |
412 |
_JS_DEFINE_CALLINFO_n tn0 \ |
_JS_DEFINE_CALLINFO_n tn0 \ |
413 |
_JS_DEFINE_CALLINFO_n tn1 \ |
_JS_DEFINE_CALLINFO_n tn1 \ |
414 |
_JS_DEFINE_CALLINFO_n tn2 \ |
_JS_DEFINE_CALLINFO_n tn2 \ |
415 |
JSTraceableNative name##_trcinfo[] = { \ |
JSSpecializedNative name##_sns[] = { \ |
416 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
417 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn1 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn1 | JSTN_MORE }, \ |
418 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn2 } \ |
{ _JS_TN_INIT_HELPER_n tn2 } \ |
419 |
}; |
}; \ |
420 |
|
JSNativeTraceInfo name##_trcinfo = { (JSFastNative)name, name##_sns }; |
421 |
|
|
422 |
#define JS_DEFINE_TRCINFO_4(name, tn0, tn1, tn2, tn3) \ |
#define JS_DEFINE_TRCINFO_4(name, tn0, tn1, tn2, tn3) \ |
423 |
_JS_DEFINE_CALLINFO_n tn0 \ |
_JS_DEFINE_CALLINFO_n tn0 \ |
424 |
_JS_DEFINE_CALLINFO_n tn1 \ |
_JS_DEFINE_CALLINFO_n tn1 \ |
425 |
_JS_DEFINE_CALLINFO_n tn2 \ |
_JS_DEFINE_CALLINFO_n tn2 \ |
426 |
_JS_DEFINE_CALLINFO_n tn3 \ |
_JS_DEFINE_CALLINFO_n tn3 \ |
427 |
JSTraceableNative name##_trcinfo[] = { \ |
JSSpecializedNative name##_sns[] = { \ |
428 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn0 | JSTN_MORE }, \ |
429 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn1 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn1 | JSTN_MORE }, \ |
430 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn2 | JSTN_MORE }, \ |
{ _JS_TN_INIT_HELPER_n tn2 | JSTN_MORE }, \ |
431 |
{ (JSFastNative)name, _JS_TN_INIT_HELPER_n tn3 } \ |
{ _JS_TN_INIT_HELPER_n tn3 } \ |
432 |
}; |
}; \ |
433 |
|
JSNativeTraceInfo name##_trcinfo = { (JSFastNative)name, name##_sns }; |
434 |
|
|
435 |
#define _JS_DEFINE_CALLINFO_n(n, args) JS_DEFINE_CALLINFO_##n args |
#define _JS_DEFINE_CALLINFO_n(n, args) JS_DEFINE_CALLINFO_##n args |
436 |
|
|
440 |
jsdouble FASTCALL |
jsdouble FASTCALL |
441 |
js_BooleanOrUndefinedToNumber(JSContext* cx, int32 unboxed); |
js_BooleanOrUndefinedToNumber(JSContext* cx, int32 unboxed); |
442 |
|
|
|
static JS_INLINE JSBool |
|
|
js_Int32ToId(JSContext* cx, int32 index, jsid* id) |
|
|
{ |
|
|
if (index <= JSVAL_INT_MAX) { |
|
|
*id = INT_TO_JSID(index); |
|
|
return JS_TRUE; |
|
|
} |
|
|
JSString* str = js_NumberToString(cx, index); |
|
|
if (!str) |
|
|
return JS_FALSE; |
|
|
return js_ValueToStringId(cx, STRING_TO_JSVAL(str), id); |
|
|
} |
|
|
|
|
443 |
/* Extern version of js_SetBuiltinError. */ |
/* Extern version of js_SetBuiltinError. */ |
444 |
extern JS_FRIEND_API(void) |
extern JS_FRIEND_API(void) |
445 |
js_SetTraceableNativeFailed(JSContext *cx); |
js_SetTraceableNativeFailed(JSContext *cx); |
446 |
|
|
447 |
|
extern jsdouble FASTCALL |
448 |
|
js_dmod(jsdouble a, jsdouble b); |
449 |
|
|
450 |
#else |
#else |
451 |
|
|
452 |
#define JS_DEFINE_CALLINFO_1(linkage, rt, op, at0, cse, fold) |
#define JS_DEFINE_CALLINFO_1(linkage, rt, op, at0, cse, fold) |
454 |
#define JS_DEFINE_CALLINFO_3(linkage, rt, op, at0, at1, at2, cse, fold) |
#define JS_DEFINE_CALLINFO_3(linkage, rt, op, at0, at1, at2, cse, fold) |
455 |
#define JS_DEFINE_CALLINFO_4(linkage, rt, op, at0, at1, at2, at3, cse, fold) |
#define JS_DEFINE_CALLINFO_4(linkage, rt, op, at0, at1, at2, at3, cse, fold) |
456 |
#define JS_DEFINE_CALLINFO_5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) |
#define JS_DEFINE_CALLINFO_5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) |
457 |
|
#define JS_DEFINE_CALLINFO_6(linkage, rt, op, at0, at1, at2, at3, at4, at5, cse, fold) |
458 |
#define JS_DECLARE_CALLINFO(name) |
#define JS_DECLARE_CALLINFO(name) |
459 |
#define JS_DEFINE_TRCINFO_1(name, tn0) |
#define JS_DEFINE_TRCINFO_1(name, tn0) |
460 |
#define JS_DEFINE_TRCINFO_2(name, tn0, tn1) |
#define JS_DEFINE_TRCINFO_2(name, tn0, tn1) |
469 |
|
|
470 |
/* Defined in jsarray.cpp. */ |
/* Defined in jsarray.cpp. */ |
471 |
JS_DECLARE_CALLINFO(js_Array_dense_setelem) |
JS_DECLARE_CALLINFO(js_Array_dense_setelem) |
472 |
|
JS_DECLARE_CALLINFO(js_Array_dense_setelem_int) |
473 |
|
JS_DECLARE_CALLINFO(js_Array_dense_setelem_double) |
474 |
JS_DECLARE_CALLINFO(js_NewEmptyArray) |
JS_DECLARE_CALLINFO(js_NewEmptyArray) |
475 |
|
JS_DECLARE_CALLINFO(js_NewEmptyArrayWithLength) |
476 |
JS_DECLARE_CALLINFO(js_NewUninitializedArray) |
JS_DECLARE_CALLINFO(js_NewUninitializedArray) |
477 |
JS_DECLARE_CALLINFO(js_ArrayCompPush) |
JS_DECLARE_CALLINFO(js_ArrayCompPush) |
478 |
|
|
479 |
|
/* Defined in jsfun.cpp. */ |
480 |
|
JS_DECLARE_CALLINFO(js_AllocFlatClosure) |
481 |
|
JS_DECLARE_CALLINFO(js_PutArguments) |
482 |
|
|
483 |
|
/* Defined in jsfun.cpp. */ |
484 |
|
JS_DECLARE_CALLINFO(js_SetCallVar) |
485 |
|
JS_DECLARE_CALLINFO(js_SetCallArg) |
486 |
|
|
487 |
/* Defined in jsnum.cpp. */ |
/* Defined in jsnum.cpp. */ |
488 |
JS_DECLARE_CALLINFO(js_NumberToString) |
JS_DECLARE_CALLINFO(js_NumberToString) |
489 |
|
|
499 |
JS_DECLARE_CALLINFO(js_String_p_charCodeAt_int) |
JS_DECLARE_CALLINFO(js_String_p_charCodeAt_int) |
500 |
|
|
501 |
/* Defined in jsbuiltins.cpp. */ |
/* Defined in jsbuiltins.cpp. */ |
502 |
#define BUILTIN1(linkage, rt, op, at0, cse, fold) JS_DECLARE_CALLINFO(op) |
JS_DECLARE_CALLINFO(js_BoxDouble) |
503 |
#define BUILTIN2(linkage, rt, op, at0, at1, cse, fold) JS_DECLARE_CALLINFO(op) |
JS_DECLARE_CALLINFO(js_BoxInt32) |
504 |
#define BUILTIN3(linkage, rt, op, at0, at1, at2, cse, fold) JS_DECLARE_CALLINFO(op) |
JS_DECLARE_CALLINFO(js_UnboxDouble) |
505 |
#define BUILTIN4(linkage, rt, op, at0, at1, at2, at3, cse, fold) JS_DECLARE_CALLINFO(op) |
JS_DECLARE_CALLINFO(js_UnboxInt32) |
506 |
#define BUILTIN5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) JS_DECLARE_CALLINFO(op) |
JS_DECLARE_CALLINFO(js_dmod) |
507 |
#include "builtins.tbl" |
JS_DECLARE_CALLINFO(js_imod) |
508 |
#undef BUILTIN |
JS_DECLARE_CALLINFO(js_DoubleToInt32) |
509 |
#undef BUILTIN1 |
JS_DECLARE_CALLINFO(js_DoubleToUint32) |
510 |
#undef BUILTIN2 |
|
511 |
#undef BUILTIN3 |
JS_DECLARE_CALLINFO(js_StringToNumber) |
512 |
#undef BUILTIN4 |
JS_DECLARE_CALLINFO(js_StringToInt32) |
513 |
#undef BUILTIN5 |
JS_DECLARE_CALLINFO(js_CloseIterator) |
514 |
|
JS_DECLARE_CALLINFO(js_CallTree) |
515 |
|
JS_DECLARE_CALLINFO(js_AddProperty) |
516 |
|
JS_DECLARE_CALLINFO(js_HasNamedProperty) |
517 |
|
JS_DECLARE_CALLINFO(js_HasNamedPropertyInt32) |
518 |
|
JS_DECLARE_CALLINFO(js_TypeOfObject) |
519 |
|
JS_DECLARE_CALLINFO(js_TypeOfBoolean) |
520 |
|
JS_DECLARE_CALLINFO(js_BooleanOrUndefinedToNumber) |
521 |
|
JS_DECLARE_CALLINFO(js_BooleanOrUndefinedToString) |
522 |
|
JS_DECLARE_CALLINFO(js_Arguments) |
523 |
|
JS_DECLARE_CALLINFO(js_NewNullClosure) |
524 |
|
JS_DECLARE_CALLINFO(js_ConcatN) |
525 |
|
|
526 |
#endif /* jsbuiltins_h___ */ |
#endif /* jsbuiltins_h___ */ |