]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | /* |
2 | * Ecmascript execution, support primitives. | |
3 | */ | |
4 | ||
5 | #ifndef DUK_JS_H_INCLUDED | |
6 | #define DUK_JS_H_INCLUDED | |
7 | ||
8 | /* Flags for call handling. */ | |
9 | #define DUK_CALL_FLAG_IGNORE_RECLIMIT (1 << 0) /* duk_handle_call_xxx: call ignores C recursion limit (for errhandler calls) */ | |
10 | #define DUK_CALL_FLAG_CONSTRUCTOR_CALL (1 << 1) /* duk_handle_call_xxx: constructor call (i.e. called as 'new Foo()') */ | |
11 | #define DUK_CALL_FLAG_IS_RESUME (1 << 2) /* duk_handle_ecma_call_setup: setup for a resume() */ | |
12 | #define DUK_CALL_FLAG_IS_TAILCALL (1 << 3) /* duk_handle_ecma_call_setup: setup for a tail call */ | |
13 | #define DUK_CALL_FLAG_DIRECT_EVAL (1 << 4) /* call is a direct eval call */ | |
14 | ||
15 | /* Flags for duk_js_equals_helper(). */ | |
16 | #define DUK_EQUALS_FLAG_SAMEVALUE (1 << 0) /* use SameValue instead of non-strict equality */ | |
17 | #define DUK_EQUALS_FLAG_STRICT (1 << 1) /* use strict equality instead of non-strict equality */ | |
18 | ||
19 | /* Flags for duk_js_compare_helper(). */ | |
20 | #define DUK_COMPARE_FLAG_EVAL_LEFT_FIRST (1 << 0) /* eval left argument first */ | |
21 | #define DUK_COMPARE_FLAG_NEGATE (1 << 1) /* negate result */ | |
22 | ||
23 | /* conversions, coercions, comparison, etc */ | |
24 | DUK_INTERNAL_DECL duk_bool_t duk_js_toboolean(duk_tval *tv); | |
25 | DUK_INTERNAL_DECL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv); | |
26 | DUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x); | |
27 | DUK_INTERNAL_DECL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv); | |
28 | DUK_INTERNAL_DECL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv); | |
29 | DUK_INTERNAL_DECL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv); | |
30 | DUK_INTERNAL_DECL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv); | |
31 | DUK_INTERNAL_DECL duk_small_int_t duk_js_to_arrayindex_raw_string(const duk_uint8_t *str, duk_uint32_t blen, duk_uarridx_t *out_idx); | |
32 | DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_string_helper(duk_hstring *h); | |
33 | DUK_INTERNAL_DECL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_int_t flags); | |
34 | DUK_INTERNAL_DECL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2); | |
35 | DUK_INTERNAL_DECL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2); | |
36 | #if 0 /* unused */ | |
37 | DUK_INTERNAL_DECL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2); | |
38 | #endif | |
39 | DUK_INTERNAL_DECL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_int_t flags); | |
40 | DUK_INTERNAL_DECL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); | |
41 | DUK_INTERNAL_DECL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); | |
42 | DUK_INTERNAL_DECL duk_hstring *duk_js_typeof(duk_hthread *thr, duk_tval *tv_x); | |
43 | ||
44 | #define duk_js_equals(thr,tv_x,tv_y) \ | |
45 | duk_js_equals_helper((thr), (tv_x), (tv_y), 0) | |
46 | #define duk_js_strict_equals(tv_x,tv_y) \ | |
47 | duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_STRICT) | |
48 | #define duk_js_samevalue(tv_x,tv_y) \ | |
49 | duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_SAMEVALUE) | |
50 | ||
51 | /* E5 Sections 11.8.1, 11.8.5; x < y */ | |
52 | #define duk_js_lessthan(thr,tv_x,tv_y) \ | |
53 | duk_js_compare_helper((thr), (tv_x), (tv_Y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) | |
54 | ||
55 | /* E5 Sections 11.8.2, 11.8.5; x > y --> y < x */ | |
56 | #define duk_js_greaterthan(thr,tv_x,tv_y) \ | |
57 | duk_js_compare_helper((thr), (tv_y), (tv_x), 0) | |
58 | ||
59 | /* E5 Sections 11.8.3, 11.8.5; x <= y --> not (x > y) --> not (y < x) */ | |
60 | #define duk_js_lessthanorequal(thr,tv_x,tv_y) \ | |
61 | duk_js_compare_helper((thr), (tv_y), (tv_x), DUK_COMPARE_FLAG_NEGATE) | |
62 | ||
63 | /* E5 Sections 11.8.4, 11.8.5; x >= y --> not (x < y) */ | |
64 | #define duk_js_greaterthanorequal(thr,tv_x,tv_y) \ | |
65 | duk_js_compare_helper((thr), (tv_x), (tv_y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) | |
66 | ||
67 | /* identifiers and environment handling */ | |
68 | #if 0 /*unused*/ | |
69 | DUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); | |
70 | #endif | |
71 | DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag); | |
72 | DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag); | |
73 | DUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict); | |
74 | DUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict); | |
75 | #if 0 /*unused*/ | |
76 | DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); | |
77 | #endif | |
78 | DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name); | |
79 | DUK_INTERNAL_DECL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_int_t prop_flags, duk_bool_t is_func_decl); | |
80 | DUK_INTERNAL_DECL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act); | |
81 | DUK_INTERNAL_DECL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env, duk_hobject *func, duk_size_t regbase); | |
82 | DUK_INTERNAL_DECL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t idx_bottom); | |
83 | DUK_INTERNAL_DECL | |
84 | void duk_js_push_closure(duk_hthread *thr, | |
85 | duk_hcompiledfunction *fun_temp, | |
86 | duk_hobject *outer_var_env, | |
87 | duk_hobject *outer_lex_env, | |
88 | duk_bool_t add_auto_proto); | |
89 | ||
90 | /* call handling */ | |
91 | DUK_INTERNAL_DECL duk_int_t duk_handle_call_protected(duk_hthread *thr, duk_idx_t num_stack_args, duk_small_uint_t call_flags); | |
92 | DUK_INTERNAL_DECL void duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t num_stack_args, duk_small_uint_t call_flags); | |
93 | DUK_INTERNAL_DECL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, duk_idx_t num_stack_args, duk_idx_t num_stack_res); | |
94 | DUK_INTERNAL_DECL duk_bool_t duk_handle_ecma_call_setup(duk_hthread *thr, duk_idx_t num_stack_args, duk_small_uint_t call_flags); | |
95 | ||
96 | /* bytecode execution */ | |
97 | DUK_INTERNAL_DECL void duk_js_execute_bytecode(duk_hthread *exec_thr); | |
98 | ||
99 | #endif /* DUK_JS_H_INCLUDED */ |