8#ifndef DUK_HTHREAD_H_INCLUDED
9#define DUK_HTHREAD_H_INCLUDED
15#define DUK_VALSTACK_GROW_STEP 128
16#define DUK_VALSTACK_SHRINK_THRESHOLD 256
17#define DUK_VALSTACK_SHRINK_SPARE 64
18#define DUK_VALSTACK_INITIAL_SIZE 128
19#define DUK_VALSTACK_INTERNAL_EXTRA 64
23#define DUK_VALSTACK_API_ENTRY_MINIMUM DUK_API_ENTRY_STACK
33#define DUK_VALSTACK_DEFAULT_MAX 1000000L
35#define DUK_CALLSTACK_GROW_STEP 8
36#define DUK_CALLSTACK_SHRINK_THRESHOLD 16
37#define DUK_CALLSTACK_SHRINK_SPARE 8
38#define DUK_CALLSTACK_INITIAL_SIZE 8
39#define DUK_CALLSTACK_DEFAULT_MAX 10000L
41#define DUK_CATCHSTACK_GROW_STEP 4
42#define DUK_CATCHSTACK_SHRINK_THRESHOLD 8
43#define DUK_CATCHSTACK_SHRINK_SPARE 4
44#define DUK_CATCHSTACK_INITIAL_SIZE 4
45#define DUK_CATCHSTACK_DEFAULT_MAX 10000L
51#define DUK_ACT_FLAG_STRICT (1 << 0)
52#define DUK_ACT_FLAG_TAILCALLED (1 << 1)
53#define DUK_ACT_FLAG_CONSTRUCT (1 << 2)
54#define DUK_ACT_FLAG_PREVENT_YIELD (1 << 3)
55#define DUK_ACT_FLAG_DIRECT_EVAL (1 << 4)
56#define DUK_ACT_FLAG_BREAKPOINT_ACTIVE (1 << 5)
58#define DUK_ACT_GET_FUNC(act) ((act)->func)
64#define DUK_TB_FLAG_NOBLAME_FILELINE (1 << 0)
71#define DUK_CAT_TYPE_MASK 0x0000000fUL
72#define DUK_CAT_TYPE_BITS 4
73#define DUK_CAT_LABEL_MASK 0xffffff00UL
74#define DUK_CAT_LABEL_BITS 24
75#define DUK_CAT_LABEL_SHIFT 8
77#define DUK_CAT_FLAG_CATCH_ENABLED (1 << 4)
78#define DUK_CAT_FLAG_FINALLY_ENABLED (1 << 5)
79#define DUK_CAT_FLAG_CATCH_BINDING_ENABLED (1 << 6)
80#define DUK_CAT_FLAG_LEXENV_ACTIVE (1 << 7)
82#define DUK_CAT_TYPE_UNKNOWN 0
83#define DUK_CAT_TYPE_TCF 1
84#define DUK_CAT_TYPE_LABEL 2
86#define DUK_CAT_GET_TYPE(c) ((c)->flags & DUK_CAT_TYPE_MASK)
87#define DUK_CAT_GET_LABEL(c) (((c)->flags & DUK_CAT_LABEL_MASK) >> DUK_CAT_LABEL_SHIFT)
89#define DUK_CAT_HAS_CATCH_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_ENABLED)
90#define DUK_CAT_HAS_FINALLY_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_FINALLY_ENABLED)
91#define DUK_CAT_HAS_CATCH_BINDING_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_BINDING_ENABLED)
92#define DUK_CAT_HAS_LEXENV_ACTIVE(c) ((c)->flags & DUK_CAT_FLAG_LEXENV_ACTIVE)
94#define DUK_CAT_SET_CATCH_ENABLED(c) do { \
95 (c)->flags |= DUK_CAT_FLAG_CATCH_ENABLED; \
97#define DUK_CAT_SET_FINALLY_ENABLED(c) do { \
98 (c)->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; \
100#define DUK_CAT_SET_CATCH_BINDING_ENABLED(c) do { \
101 (c)->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \
103#define DUK_CAT_SET_LEXENV_ACTIVE(c) do { \
104 (c)->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; \
107#define DUK_CAT_CLEAR_CATCH_ENABLED(c) do { \
108 (c)->flags &= ~DUK_CAT_FLAG_CATCH_ENABLED; \
110#define DUK_CAT_CLEAR_FINALLY_ENABLED(c) do { \
111 (c)->flags &= ~DUK_CAT_FLAG_FINALLY_ENABLED; \
113#define DUK_CAT_CLEAR_CATCH_BINDING_ENABLED(c) do { \
114 (c)->flags &= ~DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \
116#define DUK_CAT_CLEAR_LEXENV_ACTIVE(c) do { \
117 (c)->flags &= ~DUK_CAT_FLAG_LEXENV_ACTIVE; \
124#if defined(DUK_USE_ROM_STRINGS)
125#define DUK_HTHREAD_GET_STRING(thr,idx) \
126 ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))
128#if defined(DUK_USE_HEAPPTR16)
129#define DUK_HTHREAD_GET_STRING(thr,idx) \
130 ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((thr)->heap->heap_udata, (thr)->strs16[(idx)]))
132#define DUK_HTHREAD_GET_STRING(thr,idx) \
137#define DUK_HTHREAD_GET_CURRENT_ACTIVATION(thr) (&(thr)->callstack[(thr)->callstack_top - 1])
140#define DUK_HTHREAD_STATE_INACTIVE 1
141#define DUK_HTHREAD_STATE_RUNNING 2
142#define DUK_HTHREAD_STATE_RESUMED 3
143#define DUK_HTHREAD_STATE_YIELDED 4
144#define DUK_HTHREAD_STATE_TERMINATED 5
151#if defined(DUK_USE_INTERRUPT_COUNTER)
152#define DUK_HTHREAD_INTCTR_DEFAULT (256L * 1024L)
163#if defined(DUK_USE_PREFER_SIZE)
164#define DUK_ASSERT_CTX_VSSIZE(ctx)
166#define DUK_ASSERT_CTX_VSSIZE(ctx) \
167 DUK_ASSERT((duk_size_t) (((duk_hthread *) (ctx))->valstack_end - ((duk_hthread *) (ctx))->valstack) == \
168 ((duk_hthread *) (ctx))->valstack_size)
170#define DUK_ASSERT_CTX_VALID(ctx) do { \
171 DUK_ASSERT((ctx) != NULL); \
172 DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) (ctx)) == DUK_HTYPE_OBJECT); \
173 DUK_ASSERT(DUK_HOBJECT_IS_THREAD((duk_hobject *) (ctx))); \
174 DUK_ASSERT(((duk_hthread *) (ctx))->unused1 == 0); \
175 DUK_ASSERT(((duk_hthread *) (ctx))->unused2 == 0); \
176 DUK_ASSERT(((duk_hthread *) (ctx))->valstack != NULL); \
177 DUK_ASSERT(((duk_hthread *) (ctx))->valstack_end >= ((duk_hthread *) (ctx))->valstack); \
178 DUK_ASSERT(((duk_hthread *) (ctx))->valstack_top >= ((duk_hthread *) (ctx))->valstack); \
179 DUK_ASSERT(((duk_hthread *) (ctx))->valstack_top >= ((duk_hthread *) (ctx))->valstack_bottom); \
180 DUK_ASSERT(((duk_hthread *) (ctx))->valstack_end >= ((duk_hthread *) (ctx))->valstack_top); \
181 DUK_ASSERT_CTX_VSSIZE((ctx)); \
198#ifdef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY
206#if defined(DUK_USE_DEBUGGER_SUPPORT)
207 duk_uint32_t prev_line;
294#if !defined(DUK_USE_PREFER_SIZE)
315#if defined(DUK_USE_INTERRUPT_COUNTER)
341#if defined(DUK_USE_ROM_STRINGS)
344#if defined(DUK_USE_HEAPPTR16)
345 duk_uint16_t *strs16;
373#if defined(DUK_USE_DEBUGGER_SUPPORT)
unsigned int duk_small_uint_t
#define DUK_INTERNAL_DECL
duk_int_fast32_t duk_int_t
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
DUK_INTERNAL_DECL void duk_hthread_sync_and_null_currpc(duk_hthread *thr)
DUK_INTERNAL_DECL void * duk_hthread_get_catchstack_ptr(duk_heap *heap, void *ud)
DUK_INTERNAL_DECL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr)
DUK_INTERNAL_DECL void duk_hthread_catchstack_grow(duk_hthread *thr)
DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act)
DUK_INTERNAL_DECL void duk_hthread_catchstack_unwind(duk_hthread *thr, duk_size_t new_top)
DUK_INTERNAL_DECL void duk_hthread_callstack_grow(duk_hthread *thr)
DUK_INTERNAL_DECL void * duk_hthread_get_callstack_ptr(duk_heap *heap, void *ud)
DUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr)
DUK_INTERNAL_DECL void duk_hthread_callstack_shrink_check(duk_hthread *thr)
DUK_INTERNAL_DECL void * duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud)
DUK_INTERNAL_DECL void duk_hthread_callstack_unwind(duk_hthread *thr, duk_size_t new_top)
DUK_INTERNAL_DECL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to)
DUK_INTERNAL_DECL void duk_hthread_terminate(duk_hthread *thr)
DUK_INTERNAL_DECL void duk_hthread_catchstack_shrink_check(duk_hthread *thr)
DUK_INTERNAL_DECL void duk_hthread_create_builtin_objects(duk_hthread *thr)
DUK_INTERNAL_DECL duk_activation * duk_hthread_get_current_activation(duk_hthread *thr)
duk_size_t callstack_index
duk_size_t catchstack_size
duk_hobject * builtins[DUK_NUM_BUILTINS]
duk_size_t catchstack_top
duk_compiler_ctx * compile_ctx
duk_size_t callstack_preventcount
duk_instr_t ** ptr_curr_pc
duk_size_t catchstack_max
duk_size_t callstack_size
duk_activation * callstack
duk_tval * valstack_bottom