6#ifndef DUK_HEAPHDR_H_INCLUDED
7#define DUK_HEAPHDR_H_INCLUDED
31#if defined(DUK_USE_REFERENCE_COUNTING)
32#if defined(DUK_USE_REFCOUNT16)
33 duk_uint16_t h_refcount16;
39#if defined(DUK_USE_HEAPPTR16)
40 duk_uint16_t h_next16;
45#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
47#if defined(DUK_USE_HEAPPTR16)
48 duk_uint16_t h_prev16;
62#if defined(DUK_USE_HEAPPTR16)
63 duk_uint16_t h_extra16;
76#if defined(DUK_USE_REFERENCE_COUNTING)
77#if defined(DUK_USE_REFCOUNT16)
78 duk_uint16_t h_refcount16;
86#define DUK_HEAPHDR_FLAGS_TYPE_MASK 0x00000003UL
87#define DUK_HEAPHDR_FLAGS_FLAG_MASK (~DUK_HEAPHDR_FLAGS_TYPE_MASK)
90#define DUK_HEAPHDR_FLAGS_HEAP_START 2
91#define DUK_HEAPHDR_FLAGS_USER_START 7
93#define DUK_HEAPHDR_HEAP_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_HEAP_START + (n))
94#define DUK_HEAPHDR_USER_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_USER_START + (n))
95#define DUK_HEAPHDR_HEAP_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_HEAP_START + (n)))
96#define DUK_HEAPHDR_USER_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_USER_START + (n)))
98#define DUK_HEAPHDR_FLAG_REACHABLE DUK_HEAPHDR_HEAP_FLAG(0)
99#define DUK_HEAPHDR_FLAG_TEMPROOT DUK_HEAPHDR_HEAP_FLAG(1)
100#define DUK_HEAPHDR_FLAG_FINALIZABLE DUK_HEAPHDR_HEAP_FLAG(2)
101#define DUK_HEAPHDR_FLAG_FINALIZED DUK_HEAPHDR_HEAP_FLAG(3)
102#define DUK_HEAPHDR_FLAG_READONLY DUK_HEAPHDR_HEAP_FLAG(4)
104#define DUK_HTYPE_MIN 1
105#define DUK_HTYPE_STRING 1
106#define DUK_HTYPE_OBJECT 2
107#define DUK_HTYPE_BUFFER 3
108#define DUK_HTYPE_MAX 3
110#if defined(DUK_USE_HEAPPTR16)
111#define DUK_HEAPHDR_GET_NEXT(heap,h) \
112 ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_next16))
113#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \
114 (h)->h_next16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) val); \
117#define DUK_HEAPHDR_GET_NEXT(heap,h) ((h)->h_next)
118#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \
119 (h)->h_next = (val); \
123#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
124#if defined(DUK_USE_HEAPPTR16)
125#define DUK_HEAPHDR_GET_PREV(heap,h) \
126 ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_prev16))
127#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \
128 (h)->h_prev16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (val)); \
131#define DUK_HEAPHDR_GET_PREV(heap,h) ((h)->h_prev)
132#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \
133 (h)->h_prev = (val); \
138#if defined(DUK_USE_REFERENCE_COUNTING)
139#if defined(DUK_USE_REFCOUNT16)
140#define DUK_HEAPHDR_GET_REFCOUNT(h) ((h)->h_refcount16)
141#define DUK_HEAPHDR_SET_REFCOUNT(h,val) do { \
142 (h)->h_refcount16 = (val); \
144#define DUK_HEAPHDR_PREINC_REFCOUNT(h) (++(h)->h_refcount16)
145#define DUK_HEAPHDR_PREDEC_REFCOUNT(h) (--(h)->h_refcount16)
147#define DUK_HEAPHDR_GET_REFCOUNT(h) ((h)->h_refcount)
148#define DUK_HEAPHDR_SET_REFCOUNT(h,val) do { \
149 (h)->h_refcount = (val); \
151#define DUK_HEAPHDR_PREINC_REFCOUNT(h) (++(h)->h_refcount)
152#define DUK_HEAPHDR_PREDEC_REFCOUNT(h) (--(h)->h_refcount)
163#define DUK_HEAPHDR_GET_FLAGS_RAW(h) ((h)->h_flags)
165#define DUK_HEAPHDR_GET_FLAGS(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK)
166#define DUK_HEAPHDR_SET_FLAGS(h,val) do { \
167 (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) | (val); \
170#define DUK_HEAPHDR_GET_TYPE(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_TYPE_MASK)
171#define DUK_HEAPHDR_SET_TYPE(h,val) do { \
172 (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_TYPE_MASK)) | (val); \
175#define DUK_HEAPHDR_HTYPE_VALID(h) ( \
176 DUK_HEAPHDR_GET_TYPE((h)) >= DUK_HTYPE_MIN && \
177 DUK_HEAPHDR_GET_TYPE((h)) <= DUK_HTYPE_MAX \
180#define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h,tval,fval) do { \
181 (h)->h_flags = ((tval) & DUK_HEAPHDR_FLAGS_TYPE_MASK) | \
182 ((fval) & DUK_HEAPHDR_FLAGS_FLAG_MASK); \
185#define DUK_HEAPHDR_SET_FLAG_BITS(h,bits) do { \
186 DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \
187 (h)->h_flags |= (bits); \
190#define DUK_HEAPHDR_CLEAR_FLAG_BITS(h,bits) do { \
191 DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \
192 (h)->h_flags &= ~((bits)); \
195#define DUK_HEAPHDR_CHECK_FLAG_BITS(h,bits) (((h)->h_flags & (bits)) != 0)
197#define DUK_HEAPHDR_SET_REACHABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
198#define DUK_HEAPHDR_CLEAR_REACHABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
199#define DUK_HEAPHDR_HAS_REACHABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)
201#define DUK_HEAPHDR_SET_TEMPROOT(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
202#define DUK_HEAPHDR_CLEAR_TEMPROOT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
203#define DUK_HEAPHDR_HAS_TEMPROOT(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)
205#define DUK_HEAPHDR_SET_FINALIZABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
206#define DUK_HEAPHDR_CLEAR_FINALIZABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
207#define DUK_HEAPHDR_HAS_FINALIZABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)
209#define DUK_HEAPHDR_SET_FINALIZED(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
210#define DUK_HEAPHDR_CLEAR_FINALIZED(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
211#define DUK_HEAPHDR_HAS_FINALIZED(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)
213#define DUK_HEAPHDR_SET_READONLY(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
214#define DUK_HEAPHDR_CLEAR_READONLY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
215#define DUK_HEAPHDR_HAS_READONLY(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)
218#define DUK_HEAPHDR_GET_FLAG_RANGE(h,m,n) (((h)->h_flags >> (m)) & ((1UL << (n)) - 1UL))
220#define DUK_HEAPHDR_SET_FLAG_RANGE(h,m,n,v) do { \
222 ((h)->h_flags & (~(((1 << (n)) - 1) << (m)))) \
227#if defined(DUK_USE_DOUBLE_LINKED_HEAP)
228#define DUK_HEAPHDR_INIT_NULLS(h) do { \
229 DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \
230 DUK_HEAPHDR_SET_PREV((h), (void *) NULL); \
233#define DUK_HEAPHDR_INIT_NULLS(h) do { \
234 DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \
238#define DUK_HEAPHDR_STRING_INIT_NULLS(h)
247#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_ASSERTIONS)
248#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do { \
250 duk_heaphdr *h__prev, *h__next; \
251 h__prev = DUK_HEAPHDR_GET_PREV((heap), (h)); \
252 h__next = DUK_HEAPHDR_GET_NEXT((heap), (h)); \
253 DUK_ASSERT(h__prev == NULL || (DUK_HEAPHDR_GET_NEXT((heap), h__prev) == (h))); \
254 DUK_ASSERT(h__next == NULL || (DUK_HEAPHDR_GET_PREV((heap), h__next) == (h))); \
258#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do {} while (0)
272#if defined(DUK_USE_REFERENCE_COUNTING)
274#if defined(DUK_USE_ROM_OBJECTS)
279#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) \
280 (DUK_TVAL_IS_HEAP_ALLOCATED((tv)) && !DUK_HEAPHDR_HAS_READONLY(DUK_TVAL_GET_HEAPHDR((tv))))
281#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) (!DUK_HEAPHDR_HAS_READONLY((h)))
284#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) DUK_TVAL_IS_HEAP_ALLOCATED((tv))
285#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 1
293#define DUK_TVAL_INCREF_FAST(thr,tv) do { \
294 duk_tval *duk__tv = (tv); \
295 DUK_ASSERT(duk__tv != NULL); \
296 if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \
297 duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \
298 DUK_ASSERT(duk__h != NULL); \
299 DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
300 DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \
303#define DUK_TVAL_DECREF_FAST(thr,tv) do { \
304 duk_tval *duk__tv = (tv); \
305 DUK_ASSERT(duk__tv != NULL); \
306 if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \
307 duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \
308 DUK_ASSERT(duk__h != NULL); \
309 DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
310 DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \
311 if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \
312 duk_heaphdr_refzero((thr), duk__h); \
316#define DUK_HEAPHDR_INCREF_FAST(thr,h) do { \
317 duk_heaphdr *duk__h = (duk_heaphdr *) (h); \
318 DUK_ASSERT(duk__h != NULL); \
319 DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
320 if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \
321 DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \
324#define DUK_HEAPHDR_DECREF_FAST(thr,h) do { \
325 duk_heaphdr *duk__h = (duk_heaphdr *) (h); \
326 DUK_ASSERT(duk__h != NULL); \
327 DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \
328 DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \
329 if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \
330 if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \
331 duk_heaphdr_refzero((thr), duk__h); \
339#define DUK_TVAL_INCREF_SLOW(thr,tv) do { \
340 duk_tval_incref((tv)); \
342#define DUK_TVAL_DECREF_SLOW(thr,tv) do { \
343 duk_tval_decref((thr), (tv)); \
345#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do { \
346 duk_heaphdr_incref((duk_heaphdr *) (h)); \
348#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do { \
349 duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); \
356#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
357#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_FAST((thr),(tv))
358#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_FAST((thr),(tv))
359#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_FAST((thr),(h))
360#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST((thr),(h))
362#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_SLOW((thr),(tv))
363#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_SLOW((thr),(tv))
364#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_SLOW((thr),(h))
365#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_SLOW((thr),(h))
369#define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
370#define DUK_HSTRING_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) (h))
371#define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
372#define DUK_HOBJECT_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) (h))
373#define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))
374#define DUK_HBUFFER_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) (h))
375#define DUK_HCOMPILEDFUNCTION_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
376#define DUK_HCOMPILEDFUNCTION_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) &(h)->obj)
377#define DUK_HNATIVEFUNCTION_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
378#define DUK_HNATIVEFUNCTION_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) &(h)->obj)
379#define DUK_HBUFFEROBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
380#define DUK_HBUFFEROBJECT_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) &(h)->obj)
381#define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)
382#define DUK_HTHREAD_DECREF(thr,h) DUK_HEAPHDR_DECREF((thr),(duk_heaphdr *) &(h)->obj)
387#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do { \
389 DUK_HEAPHDR_INCREF((thr), (duk_heaphdr *) (h)); \
392#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do { \
394 DUK_HEAPHDR_DECREF((thr), (duk_heaphdr *) (h)); \
404#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \
405 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
406 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
407 DUK_TVAL_SET_UNDEFINED(tv__dst); \
408 DUK_TVAL_DECREF((thr), &tv__tmp); \
411#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \
412 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
413 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
414 DUK_TVAL_SET_UNUSED(tv__dst); \
415 DUK_TVAL_DECREF((thr), &tv__tmp); \
418#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \
419 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
420 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
421 DUK_TVAL_SET_NULL(tv__dst); \
422 DUK_TVAL_DECREF((thr), &tv__tmp); \
425#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
426 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
427 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
428 DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \
429 DUK_TVAL_DECREF((thr), &tv__tmp); \
432#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
433 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
434 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
435 DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \
436 DUK_TVAL_DECREF((thr), &tv__tmp); \
438#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
439 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
440 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
441 DUK_TVAL_SET_NUMBER_CHKFAST(tv__dst, (newval)); \
442 DUK_TVAL_DECREF((thr), &tv__tmp); \
444#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
445 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
446 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
447 DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \
448 DUK_TVAL_DECREF((thr), &tv__tmp); \
450#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \
451 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
452 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
453 DUK_TVAL_SET_NAN(tv__dst); \
454 DUK_TVAL_DECREF((thr), &tv__tmp); \
456#if defined(DUK_USE_FASTINT)
457#define DUK_TVAL_SET_FASTINT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
458 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
459 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
460 DUK_TVAL_SET_FASTINT(tv__dst, (newval)); \
461 DUK_TVAL_DECREF((thr), &tv__tmp); \
463#define DUK_TVAL_SET_FASTINT_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
464 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
465 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
466 DUK_TVAL_SET_FASTINT_I32(tv__dst, (newval)); \
467 DUK_TVAL_DECREF((thr), &tv__tmp); \
469#define DUK_TVAL_SET_FASTINT_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
470 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
471 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
472 DUK_TVAL_SET_FASTINT_U32(tv__dst, (newval)); \
473 DUK_TVAL_DECREF((thr), &tv__tmp); \
476#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \
477 DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))
480#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \
481 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
482 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
483 DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \
484 DUK_TVAL_DECREF((thr), &tv__tmp); \
487#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
488 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
489 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
490 DUK_TVAL_SET_STRING(tv__dst, (newval)); \
491 DUK_HSTRING_INCREF((thr), (newval)); \
492 DUK_TVAL_DECREF((thr), &tv__tmp); \
495#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
496 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
497 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
498 DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \
499 DUK_HOBJECT_INCREF((thr), (newval)); \
500 DUK_TVAL_DECREF((thr), &tv__tmp); \
503#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
504 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
505 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
506 DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \
507 DUK_HBUFFER_INCREF((thr), (newval)); \
508 DUK_TVAL_DECREF((thr), &tv__tmp); \
511#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
512 duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \
513 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
514 DUK_TVAL_SET_POINTER(tv__dst, (newval)); \
515 DUK_TVAL_DECREF((thr), &tv__tmp); \
526#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \
527 duk_tval *tv__dst, *tv__src; duk_tval tv__tmp; \
528 tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
529 DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \
530 DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
531 DUK_TVAL_INCREF((thr), tv__src); \
532 DUK_TVAL_DECREF((thr), &tv__tmp); \
538#define DUK_TVAL_SET_TVAL_UPDREF_ALT1(thr,tvptr_dst,tvptr_src) do { \
539 duk_tval *tv__dst, *tv__src; duk_heaphdr *h__obj; \
540 tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
541 DUK_TVAL_INCREF_FAST((thr), tv__src); \
542 if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv__dst)) { \
543 h__obj = DUK_TVAL_GET_HEAPHDR(tv__dst); \
544 DUK_ASSERT(h__obj != NULL); \
545 DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
546 DUK_HEAPHDR_DECREF_FAST((thr), h__obj); \
548 DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
553#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0
554#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0
555#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0
556#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0
557#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0
558#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0
559#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0
560#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0
561#if defined(DUK_USE_FASTINT)
562#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_FASTINT_UPDREF_ALT0
563#define DUK_TVAL_SET_FASTINT_I32_UPDREF DUK_TVAL_SET_FASTINT_I32_UPDREF_ALT0
564#define DUK_TVAL_SET_FASTINT_U32_UPDREF DUK_TVAL_SET_FASTINT_U32_UPDREF_ALT0
566#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
567#define DUK_TVAL_SET_FASTINT_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
568#define DUK_TVAL_SET_FASTINT_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
570#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0
571#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0
572#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0
573#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0
574#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0
576#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)
578#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT1
579#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT1
580#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
583#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0
584#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0
585#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
590#define DUK_TVAL_INCREF_FAST(thr,v) do {} while (0)
591#define DUK_TVAL_DECREF_FAST(thr,v) do {} while (0)
592#define DUK_TVAL_INCREF_SLOW(thr,v) do {} while (0)
593#define DUK_TVAL_DECREF_SLOW(thr,v) do {} while (0)
594#define DUK_TVAL_INCREF(thr,v) do {} while (0)
595#define DUK_TVAL_DECREF(thr,v) do {} while (0)
596#define DUK_HEAPHDR_INCREF_FAST(thr,h) do {} while (0)
597#define DUK_HEAPHDR_DECREF_FAST(thr,h) do {} while (0)
598#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do {} while (0)
599#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do {} while (0)
600#define DUK_HEAPHDR_INCREF(thr,h) do {} while (0)
601#define DUK_HEAPHDR_DECREF(thr,h) do {} while (0)
602#define DUK_HSTRING_INCREF(thr,h) do {} while (0)
603#define DUK_HSTRING_DECREF(thr,h) do {} while (0)
604#define DUK_HOBJECT_INCREF(thr,h) do {} while (0)
605#define DUK_HOBJECT_DECREF(thr,h) do {} while (0)
606#define DUK_HBUFFER_INCREF(thr,h) do {} while (0)
607#define DUK_HBUFFER_DECREF(thr,h) do {} while (0)
608#define DUK_HCOMPILEDFUNCTION_INCREF(thr,h) do {} while (0)
609#define DUK_HCOMPILEDFUNCTION_DECREF(thr,h) do {} while (0)
610#define DUK_HNATIVEFUNCTION_INCREF(thr,h) do {} while (0)
611#define DUK_HNATIVEFUNCTION_DECREF(thr,h) do {} while (0)
612#define DUK_HBUFFEROBJECT_INCREF(thr,h) do {} while (0)
613#define DUK_HBUFFEROBJECT_DECREF(thr,h) do {} while (0)
614#define DUK_HTHREAD_INCREF(thr,h) do {} while (0)
615#define DUK_HTHREAD_DECREF(thr,h) do {} while (0)
616#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do {} while (0)
617#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do {} while (0)
619#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \
620 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
621 DUK_TVAL_SET_UNDEFINED(tv__dst); \
625#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \
626 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
627 DUK_TVAL_SET_UNUSED(tv__dst); \
631#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \
632 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
633 DUK_TVAL_SET_NULL(tv__dst); \
637#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
638 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
639 DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \
643#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
644 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
645 DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \
648#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
649 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
650 DUK_TVAL_SET_NUMBER_CHKFAST(tv__dst, (newval)); \
653#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
654 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
655 DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \
658#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \
659 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
660 DUK_TVAL_SET_NAN(tv__dst); \
663#if defined(DUK_USE_FASTINT)
664#define DUK_TVAL_SET_FASTINT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
665 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
666 DUK_TVAL_SET_FASTINT(tv__dst, (newval)); \
669#define DUK_TVAL_SET_FASTINT_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
670 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
671 DUK_TVAL_SET_FASTINT_I32(tv__dst, (newval)); \
674#define DUK_TVAL_SET_FASTINT_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
675 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
676 DUK_TVAL_SET_FASTINT_U32(tv__dst, (newval)); \
680#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \
681 DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))
684#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \
685 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
686 DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \
690#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
691 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
692 DUK_TVAL_SET_STRING(tv__dst, (newval)); \
696#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
697 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
698 DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \
702#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
703 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
704 DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \
708#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \
709 duk_tval *tv__dst; tv__dst = (tvptr_dst); \
710 DUK_TVAL_SET_POINTER(tv__dst, (newval)); \
714#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \
715 duk_tval *tv__dst, *tv__src; \
716 tv__dst = (tvptr_dst); tv__src = (tvptr_src); \
717 DUK_TVAL_SET_TVAL(tv__dst, tv__src); \
721#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0
722#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0
723#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0
724#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0
725#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0
726#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0
727#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0
728#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0
729#if defined(DUK_USE_FASTINT)
730#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_FASTINT_UPDREF_ALT0
731#define DUK_TVAL_SET_FASTINT_I32_UPDREF DUK_TVAL_SET_FASTINT_I32_UPDREF_ALT0
732#define DUK_TVAL_SET_FASTINT_U32_UPDREF DUK_TVAL_SET_FASTINT_U32_UPDREF_ALT0
734#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
735#define DUK_TVAL_SET_FASTINT_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
736#define DUK_TVAL_SET_FASTINT_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF
738#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0
739#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0
740#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0
741#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0
742#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0
744#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0
745#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0
746#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0
duk_uint16_t h_strextra16