8#ifndef DUK_HEAP_H_INCLUDED
9#define DUK_HEAP_H_INCLUDED
17#define DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING (1 << 0)
18#define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED (1 << 1)
19#define DUK_HEAP_FLAG_REFZERO_FREE_RUNNING (1 << 2)
20#define DUK_HEAP_FLAG_ERRHANDLER_RUNNING (1 << 3)
21#define DUK_HEAP_FLAG_INTERRUPT_RUNNING (1 << 4)
22#define DUK_HEAP_FLAG_FINALIZER_NORESCUE (1 << 5)
24#define DUK__HEAP_HAS_FLAGS(heap,bits) ((heap)->flags & (bits))
25#define DUK__HEAP_SET_FLAGS(heap,bits) do { \
26 (heap)->flags |= (bits); \
28#define DUK__HEAP_CLEAR_FLAGS(heap,bits) do { \
29 (heap)->flags &= ~(bits); \
32#define DUK_HEAP_HAS_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING)
33#define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
34#define DUK_HEAP_HAS_REFZERO_FREE_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING)
35#define DUK_HEAP_HAS_ERRHANDLER_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING)
36#define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
37#define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
39#define DUK_HEAP_SET_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING)
40#define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
41#define DUK_HEAP_SET_REFZERO_FREE_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING)
42#define DUK_HEAP_SET_ERRHANDLER_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING)
43#define DUK_HEAP_SET_INTERRUPT_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
44#define DUK_HEAP_SET_FINALIZER_NORESCUE(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
46#define DUK_HEAP_CLEAR_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING)
47#define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)
48#define DUK_HEAP_CLEAR_REFZERO_FREE_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING)
49#define DUK_HEAP_CLEAR_ERRHANDLER_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING)
50#define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)
51#define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)
57#define DUK_LJ_TYPE_UNKNOWN 0
58#define DUK_LJ_TYPE_THROW 1
59#define DUK_LJ_TYPE_YIELD 2
60#define DUK_LJ_TYPE_RESUME 3
61#define DUK_LJ_TYPE_BREAK 4
62#define DUK_LJ_TYPE_CONTINUE 5
63#define DUK_LJ_TYPE_RETURN 6
64#define DUK_LJ_TYPE_NORMAL 7
74#define DUK_MS_FLAG_EMERGENCY (1 << 0)
75#define DUK_MS_FLAG_NO_STRINGTABLE_RESIZE (1 << 1)
76#define DUK_MS_FLAG_NO_OBJECT_COMPACTION (1 << 2)
77#define DUK_MS_FLAG_NO_FINALIZERS (1 << 3)
78#define DUK_MS_FLAG_SKIP_FINALIZERS (1 << 4)
88#if defined(DUK_USE_INTERRUPT_COUNTER)
89#define DUK_HEAP_SWITCH_THREAD(heap,newthr) duk_heap_switch_thread((heap), (newthr))
91#define DUK_HEAP_SWITCH_THREAD(heap,newthr) do { \
92 (heap)->curr_thread = (newthr); \
110#if defined(DUK_USE_MARK_AND_SWEEP)
111#if defined(DUK_USE_REFERENCE_COUNTING)
112#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 12800L
113#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L
114#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L
116#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 256L
117#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L
118#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L
125#define DUK_HEAP_STRCACHE_SIZE 4
126#define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT 16
129#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr) duk_heap_insert_into_heap_allocated((heap),(hdr))
136#define DUK_STRTAB_INITIAL_SIZE 17
139#define DUK_STRTAB_DELETED_MARKER(heap) ((duk_hstring *) heap)
142#define DUK_STRTAB_MIN_FREE_DIVISOR 4
143#define DUK_STRTAB_MIN_USED_DIVISOR 4
144#define DUK_STRTAB_GROW_ST_SIZE(n) ((n) + (n))
146#define DUK_STRTAB_U32_MAX_STRLEN 10
147#define DUK_STRTAB_HIGHEST_32BIT_PRIME 0xfffffffbUL
150#define DUK_STRTAB_HASH_INITIAL(hash,h_size) ((hash) % (h_size))
151#define DUK_STRTAB_HASH_PROBE_STEP(hash) DUK_UTIL_GET_HASH_PROBE_STEP((hash))
154#define DUK_STRTAB_CHAIN_SIZE DUK_USE_STRTAB_CHAIN_SIZE
161#if defined(DUK_USE_ROM_STRINGS)
162#define DUK_HEAP_GET_STRING(heap,idx) \
163 ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))
165#if defined(DUK_USE_HEAPPTR16)
166#define DUK_HEAP_GET_STRING(heap,idx) \
167 ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)]))
169#define DUK_HEAP_GET_STRING(heap,idx) \
170 ((heap)->strs[(idx)])
178#define DUK_ALLOC_RAW(heap,size) \
179 ((heap)->alloc_func((heap)->heap_udata, (size)))
181#define DUK_REALLOC_RAW(heap,ptr,newsize) \
182 ((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize)))
184#define DUK_FREE_RAW(heap,ptr) \
185 ((heap)->free_func((heap)->heap_udata, (void *) (ptr)))
216typedef void *(*duk_mem_getptr)(
duk_heap *heap,
void *ud);
218#define DUK_ALLOC(heap,size) duk_heap_mem_alloc((heap), (size))
219#define DUK_ALLOC_ZEROED(heap,size) duk_heap_mem_alloc_zeroed((heap), (size))
220#define DUK_REALLOC(heap,ptr,newsize) duk_heap_mem_realloc((heap), (ptr), (newsize))
221#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize))
222#define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr))
228#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT 5
235#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT 3
246#define DUK_HEAP_MAX_BREAKPOINTS 16
253#define DUK_HEAP_DBG_RATELIMIT_OPCODES 4000
256#define DUK_HEAP_DBG_RATELIMIT_MILLISECS 200
259#define DUK_STEP_TYPE_NONE 0
260#define DUK_STEP_TYPE_INTO 1
261#define DUK_STEP_TYPE_OVER 2
262#define DUK_STEP_TYPE_OUT 3
269#if defined(DUK_USE_DEBUGGER_SUPPORT)
270#define DUK_HEAP_IS_DEBUGGER_ATTACHED(heap) ((heap)->dbg_read_cb != NULL)
271#define DUK_HEAP_CLEAR_STEP_STATE(heap) do { \
272 (heap)->dbg_step_type = DUK_STEP_TYPE_NONE; \
273 (heap)->dbg_step_thread = NULL; \
274 (heap)->dbg_step_csindex = 0; \
275 (heap)->dbg_step_startline = 0; \
277#define DUK_HEAP_SET_PAUSED(heap) do { \
278 (heap)->dbg_paused = 1; \
279 (heap)->dbg_state_dirty = 1; \
280 DUK_HEAP_CLEAR_STEP_STATE((heap)); \
282#define DUK_HEAP_CLEAR_PAUSED(heap) do { \
283 (heap)->dbg_paused = 0; \
284 (heap)->dbg_state_dirty = 1; \
285 DUK_HEAP_CLEAR_STEP_STATE((heap)); \
287#define DUK_HEAP_IS_PAUSED(heap) ((heap)->dbg_paused)
323#if defined(DUK_USE_HEAPPTR16)
329 duk_uint16_t strlist16;
359#if defined(DUK_USE_HEAPPTR16)
360 duk_uint16_t heapptr_null16;
361 duk_uint16_t heapptr_deleted16;
378#if defined(DUK_USE_REFERENCE_COUNTING)
383#if defined(DUK_USE_MARK_AND_SWEEP)
385#if defined(DUK_USE_VOLUNTARY_GC)
426#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)
433#if defined(DUK_USE_DEBUGGER_SUPPORT)
453 duk_uint32_t dbg_step_startline;
460 duk_uint32_t dbg_exec_counter;
461 duk_uint32_t dbg_last_counter;
466 duk_uint8_t dbg_next_byte;
470#if defined(DUK_USE_STRTAB_PROBE)
471#if defined(DUK_USE_HEAPPTR16)
472 duk_uint16_t *strtable16;
483#if defined(DUK_USE_STRTAB_CHAIN)
493#if defined(DUK_USE_ROM_STRINGS)
496#if defined(DUK_USE_HEAPPTR16)
521#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_REFERENCE_COUNTING)
524#if defined(DUK_USE_INTERRUPT_COUNTER)
538#if defined(DUK_USE_REFERENCE_COUNTING)
541#if defined(DUK_USE_MARK_AND_SWEEP) && defined(DUK_USE_MS_STRINGTABLE_RESIZE)
545#if defined(DUK_USE_DEBUG)
553#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)
565#ifdef DUK_USE_REFERENCE_COUNTING
566#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
576#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
590#if defined(DUK_USE_MARK_AND_SWEEP)
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_default_free_function(void *udata, void *ptr)
DUK_INTERNAL_DECL void * duk_default_alloc_function(void *udata, duk_size_t size)
DUK_INTERNAL_DECL void duk_heap_remove_any_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr)
DUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h)
DUK_INTERNAL_DECL void duk_heaphdr_decref_allownull(duk_hthread *thr, duk_heaphdr *h)
DUK_INTERNAL_DECL duk_bool_t duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags)
DUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h)
DUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv)
DUK_INTERNAL_DECL void duk_heap_string_remove(duk_heap *heap, duk_hstring *h)
DUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize(duk_hthread *thr, duk_heaphdr *hdr)
DUK_INTERNAL_DECL void duk_heap_force_strtab_resize(duk_heap *heap)
DUK_INTERNAL_DECL void * duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize)
duk_size_t(* duk_debug_read_function)(void *udata, char *buffer, duk_size_t length)
void *(* duk_alloc_function)(void *udata, duk_size_t size)
void(* duk_debug_write_flush_function)(void *udata)
void(* duk_fatal_function)(duk_context *ctx, duk_errcode_t code, const char *msg)
void(* duk_debug_detached_function)(void *udata)
void(* duk_free_function)(void *udata, void *ptr)
void(* duk_debug_read_flush_function)(void *udata)
void *(* duk_realloc_function)(void *udata, void *ptr, duk_size_t size)
duk_idx_t(* duk_debug_request_function)(duk_context *ctx, void *udata, duk_idx_t nvalues)
duk_size_t(* duk_debug_peek_function)(void *udata)
duk_size_t(* duk_debug_write_function)(void *udata, const char *buffer, duk_size_t length)
DUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr)
DUK_INTERNAL_DECL void * duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize)
DUK_INTERNAL_DECL void duk_free_hstring_inner(duk_heap *heap, duk_hstring *h)
DUK_INTERNAL_DECL void * duk_heap_mem_alloc(duk_heap *heap, duk_size_t size)
DUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr)
DUK_INTERNAL_DECL duk_heap * duk_heap_alloc(duk_alloc_function alloc_func, duk_realloc_function realloc_func, duk_free_function free_func, void *heap_udata, duk_fatal_function fatal_func)
DUK_INTERNAL_DECL duk_hstring * duk_heap_string_intern_u32(duk_heap *heap, duk_uint32_t val)
DUK_INTERNAL_DECL void duk_free_hbuffer_inner(duk_heap *heap, duk_hbuffer *h)
DUK_INTERNAL_DECL duk_hstring * duk_heap_string_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen)
DUK_INTERNAL_DECL void duk_free_hobject_inner(duk_heap *heap, duk_hobject *h)
DUK_INTERNAL_DECL duk_hstring * duk_heap_string_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len)
DUK_INTERNAL_DECL void * duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize)
DUK_INTERNAL_DECL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h)
DUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset)
DUK_INTERNAL_DECL duk_hstring * duk_heap_string_intern_u32_checked(duk_hthread *thr, duk_uint32_t val)
DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len)
void *(* duk_mem_getptr)(duk_heap *heap, void *ud)
DUK_INTERNAL void duk_heap_free_strtab(duk_heap *heap)
DUK_INTERNAL_DECL void * duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size)
DUK_INTERNAL_DECL void duk_heap_free(duk_heap *heap)
DUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr)
#define DUK_HEAP_NUM_STRINGS
#define DUK_HEAP_MAX_BREAKPOINTS
#define DUK_STRTAB_CHAIN_SIZE
#define DUK_HEAP_STRCACHE_SIZE
duk_heaphdr * finalize_list
duk_heaphdr * refzero_list
duk_int_t call_recursion_limit
duk_int_t mark_and_sweep_trigger_counter
duk_hthread * curr_thread
duk_strcache strcache[DUK_HEAP_STRCACHE_SIZE]
duk_hthread * heap_thread
duk_fatal_function fatal_func
duk_int_t mark_and_sweep_recursion_depth
duk_realloc_function realloc_func
duk_bool_t handling_error
duk_small_uint_t mark_and_sweep_base_flags
duk_hobject * heap_object
duk_free_function free_func
duk_hstring * strs[DUK_HEAP_NUM_STRINGS]
duk_int_t call_recursion_depth
duk_heaphdr * refzero_list_tail
duk_alloc_function alloc_func
duk_heaphdr * heap_allocated
union duk_strtab_entry::@21 u