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