http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_alloc.c ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_alloc.c b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_alloc.c deleted file mode 100644 index 425ad33..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_alloc.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * duk_hbuffer allocation and freeing. - */ - -#include "duk_internal.h" - -/* Allocate a new duk_hbuffer of a certain type and return a pointer to it - * (NULL on error). Write buffer data pointer to 'out_bufdata' (only if - * allocation successful). - */ -DUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata) { - duk_hbuffer *res = NULL; - duk_size_t header_size; - duk_size_t alloc_size; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(out_bufdata != NULL); - - DUK_DDD(DUK_DDDPRINT("allocate hbuffer")); - - /* Size sanity check. Should not be necessary because caller is - * required to check this, but we don't want to cause a segfault - * if the size wraps either in duk_size_t computation or when - * storing the size in a 16-bit field. - */ - if (size > DUK_HBUFFER_MAX_BYTELEN) { - DUK_D(DUK_DPRINT("hbuffer alloc failed: size too large: %ld", (long) size)); - return NULL; /* no need to write 'out_bufdata' */ - } - - if (flags & DUK_BUF_FLAG_EXTERNAL) { - header_size = sizeof(duk_hbuffer_external); - alloc_size = sizeof(duk_hbuffer_external); - } else if (flags & DUK_BUF_FLAG_DYNAMIC) { - header_size = sizeof(duk_hbuffer_dynamic); - alloc_size = sizeof(duk_hbuffer_dynamic); - } else { - header_size = sizeof(duk_hbuffer_fixed); - alloc_size = sizeof(duk_hbuffer_fixed) + size; - DUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed)); /* no wrapping */ - } - - res = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size); - if (!res) { - goto error; - } - - /* zero everything unless requested not to do so */ -#if defined(DUK_USE_ZERO_BUFFER_DATA) - DUK_MEMZERO((void *) res, - (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size); -#else - DUK_MEMZERO((void *) res, header_size); -#endif - - if (flags & DUK_BUF_FLAG_EXTERNAL) { - duk_hbuffer_external *h; - h = (duk_hbuffer_external *) res; - DUK_UNREF(h); - *out_bufdata = NULL; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_HEAPPTR16) -/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ -#else - DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, h, NULL); -#endif -#endif - DUK_ASSERT(DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, h) == NULL); - } else if (flags & DUK_BUF_FLAG_DYNAMIC) { - duk_hbuffer_dynamic *h = (duk_hbuffer_dynamic *) res; - void *ptr; - - if (size > 0) { - DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); /* alloc external with size zero */ - DUK_DDD(DUK_DDDPRINT("dynamic buffer with nonzero size, alloc actual buffer")); -#ifdef DUK_USE_ZERO_BUFFER_DATA - ptr = DUK_ALLOC_ZEROED(heap, size); -#else - ptr = DUK_ALLOC(heap, size); -#endif - if (!ptr) { - /* Because size > 0, NULL check is correct */ - goto error; - } - *out_bufdata = ptr; - - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, ptr); - } else { - *out_bufdata = NULL; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_HEAPPTR16) -/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ -#else - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, NULL); -#endif -#endif - DUK_ASSERT(DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, h) == NULL); - } - } else { - *out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1); - } - - DUK_HBUFFER_SET_SIZE(res, size); - - DUK_HEAPHDR_SET_TYPE(&res->hdr, DUK_HTYPE_BUFFER); - if (flags & DUK_BUF_FLAG_DYNAMIC) { - DUK_HBUFFER_SET_DYNAMIC(res); - if (flags & DUK_BUF_FLAG_EXTERNAL) { - DUK_HBUFFER_SET_EXTERNAL(res); - } - } else { - DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); - } - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &res->hdr); - - DUK_DDD(DUK_DDDPRINT("allocated hbuffer: %p", (void *) res)); - return res; - - error: - DUK_DD(DUK_DDPRINT("hbuffer allocation failed")); - - DUK_FREE(heap, res); - return NULL; /* no need to write 'out_bufdata' */ -} - -/* For indirect allocs. */ - -DUK_INTERNAL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud) { - duk_hbuffer_dynamic *buf = (duk_hbuffer_dynamic *) ud; - DUK_UNREF(heap); - return (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf); -}
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_ops.c ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_ops.c b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_ops.c deleted file mode 100644 index 4cdf598..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbuffer_ops.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * duk_hbuffer operations such as resizing and inserting/appending data to - * a dynamic buffer. - * - * Append operations append to the end of the buffer and they are relatively - * efficient: the buffer is grown with a "spare" part relative to the buffer - * size to minimize reallocations. Insert operations need to move existing - * data forward in the buffer with memmove() and are not very efficient. - * They are used e.g. by the regexp compiler to "backpatch" regexp bytecode. - */ - -#include "duk_internal.h" - -/* - * Resizing - */ - -DUK_INTERNAL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size) { - void *res; - duk_size_t prev_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(buf != NULL); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); - DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); - - /* - * Maximum size check - */ - - if (new_size > DUK_HBUFFER_MAX_BYTELEN) { - DUK_ERROR_RANGE(thr, "buffer too long"); - } - - /* - * Note: use indirect realloc variant just in case mark-and-sweep - * (finalizers) might resize this same buffer during garbage - * collection. - */ - - res = DUK_REALLOC_INDIRECT(thr->heap, duk_hbuffer_get_dynalloc_ptr, (void *) buf, new_size); - if (res != NULL || new_size == 0) { - /* 'res' may be NULL if new allocation size is 0. */ - - DUK_DDD(DUK_DDDPRINT("resized dynamic buffer %p:%ld -> %p:%ld", - (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, buf), - (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(buf), - (void *) res, - (long) new_size)); - - /* - * The entire allocated buffer area, regardless of actual used - * size, is kept zeroed in resizes for simplicity. If the buffer - * is grown, zero the new part. - */ - - prev_size = DUK_HBUFFER_DYNAMIC_GET_SIZE(buf); - if (new_size > prev_size) { - DUK_ASSERT(new_size - prev_size > 0); -#ifdef DUK_USE_ZERO_BUFFER_DATA - DUK_MEMZERO((void *) ((char *) res + prev_size), - (duk_size_t) (new_size - prev_size)); -#endif - } - - DUK_HBUFFER_DYNAMIC_SET_SIZE(buf, new_size); - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(thr->heap, buf, res); - } else { - DUK_ERROR_ALLOC_DEFMSG(thr); - } - - DUK_ASSERT(res != NULL || new_size == 0); -} - -DUK_INTERNAL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(buf != NULL); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); - DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); - - duk_hbuffer_resize(thr, buf, 0); -} http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject.h ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject.h b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject.h deleted file mode 100644 index dd93902..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Heap Buffer object representation. Used for all Buffer variants. - */ - -#ifndef DUK_HBUFFEROBJECT_H_INCLUDED -#define DUK_HBUFFEROBJECT_H_INCLUDED - -/* All element accessors are host endian now (driven by TypedArray spec). */ -#define DUK_HBUFFEROBJECT_ELEM_UINT8 0 -#define DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED 1 -#define DUK_HBUFFEROBJECT_ELEM_INT8 2 -#define DUK_HBUFFEROBJECT_ELEM_UINT16 3 -#define DUK_HBUFFEROBJECT_ELEM_INT16 4 -#define DUK_HBUFFEROBJECT_ELEM_UINT32 5 -#define DUK_HBUFFEROBJECT_ELEM_INT32 6 -#define DUK_HBUFFEROBJECT_ELEM_FLOAT32 7 -#define DUK_HBUFFEROBJECT_ELEM_FLOAT64 8 -#define DUK_HBUFFEROBJECT_ELEM_MAX 8 - -#define DUK_ASSERT_HBUFFEROBJECT_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT((h)->shift <= 3); \ - DUK_ASSERT((h)->elem_type <= DUK_HBUFFEROBJECT_ELEM_MAX); \ - DUK_ASSERT(((h)->shift == 0 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8) || \ - ((h)->shift == 0 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED) || \ - ((h)->shift == 0 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_INT8) || \ - ((h)->shift == 1 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT16) || \ - ((h)->shift == 1 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_INT16) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT32) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_INT32) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_FLOAT32) || \ - ((h)->shift == 3 && (h)->elem_type == DUK_HBUFFEROBJECT_ELEM_FLOAT64)); \ - DUK_ASSERT((h)->is_view == 0 || (h)->is_view == 1); \ - DUK_ASSERT(DUK_HOBJECT_IS_BUFFEROBJECT((duk_hobject *) (h))); \ - if ((h)->buf == NULL) { \ - DUK_ASSERT((h)->offset == 0); \ - DUK_ASSERT((h)->length == 0); \ - } else { \ - /* No assertions for offset or length; in particular, \ - * it's OK for length to be longer than underlying \ - * buffer. Just ensure they don't wrap when added. \ - */ \ - DUK_ASSERT((h)->offset + (h)->length >= (h)->offset); \ - } \ - } while (0) - -/* Get the current data pointer (caller must ensure buf != NULL) as a - * duk_uint8_t ptr. - */ -#define DUK_HBUFFEROBJECT_GET_SLICE_BASE(heap,h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - (((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR((heap), (h)->buf)) + (h)->offset)) - -/* True if slice is full, i.e. offset is zero and length covers the entire - * buffer. This status may change independently of the duk_hbufferobject if - * the underlying buffer is dynamic and changes without the hbufferobject - * being changed. - */ -#define DUK_HBUFFEROBJECT_FULL_SLICE(h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset == 0 && (h)->length == DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Validate that the whole slice [0,length[ is contained in the underlying - * buffer. Caller must ensure 'buf' != NULL. - */ -#define DUK_HBUFFEROBJECT_VALID_SLICE(h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (h)->length <= DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Validate byte read/write for virtual 'offset', i.e. check that the - * offset, taking into account h->offset, is within the underlying - * buffer size. This is a safety check which is needed to ensure - * that even a misconfigured duk_hbufferobject never causes memory - * unsafe behavior (e.g. if an underlying dynamic buffer changes - * after being setup). Caller must ensure 'buf' != NULL. - */ -#define DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_INCL(h,off) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (off) < DUK_HBUFFER_GET_SIZE((h)->buf))) - -#define DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h,off) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (off) <= DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Clamp an input byte length (already assumed to be within the nominal - * duk_hbufferobject 'length') to the current dynamic buffer limits to - * yield a byte length limit that's safe for memory accesses. This value - * can be invalidated by any side effect because it may trigger a user - * callback that resizes the underlying buffer. - */ -#define DUK_HBUFFEROBJECT_CLAMP_BYTELENGTH(h,len) \ - (DUK_ASSERT_EXPR((h) != NULL), \ - duk_hbufferobject_clamp_bytelength((h), (len))) - -struct duk_hbufferobject { - /* Shared object part. */ - duk_hobject obj; - - /* Underlying buffer (refcounted), may be NULL. */ - duk_hbuffer *buf; - - /* Slice and accessor information. - * - * Because the underlying buffer may be dynamic, these may be - * invalidated by the buffer being modified so that both offset - * and length should be validated before every access. Behavior - * when the underlying buffer has changed doesn't need to be clean: - * virtual 'length' doesn't need to be affected, reads can return - * zero/NaN, and writes can be ignored. - * - * Note that a data pointer cannot be precomputed because 'buf' may - * be dynamic and its pointer unstable. - */ - - duk_uint_t offset; /* byte offset to buf */ - duk_uint_t length; /* byte index limit for element access, exclusive */ - duk_uint8_t shift; /* element size shift: - * 0 = u8/i8 - * 1 = u16/i16 - * 2 = u32/i32/float - * 3 = double - */ - duk_uint8_t elem_type; /* element type */ - duk_uint8_t is_view; -}; - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL_DECL duk_uint_t duk_hbufferobject_clamp_bytelength(duk_hbufferobject *h_bufobj, duk_uint_t len); -#endif -DUK_INTERNAL_DECL void duk_hbufferobject_push_validated_read(duk_context *ctx, duk_hbufferobject *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); -DUK_INTERNAL_DECL void duk_hbufferobject_validated_write(duk_context *ctx, duk_hbufferobject *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); - -#endif /* DUK_HBUFFEROBJECT_H_INCLUDED */ http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject_misc.c ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject_misc.c b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject_misc.c deleted file mode 100644 index f692918..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hbufferobject_misc.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "duk_internal.h" - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_uint_t duk_hbufferobject_clamp_bytelength(duk_hbufferobject *h_bufobj, duk_uint_t len) { - duk_uint_t buf_size; - duk_uint_t buf_avail; - - DUK_ASSERT(h_bufobj != NULL); - DUK_ASSERT(h_bufobj->buf != NULL); - - buf_size = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_bufobj->buf); - if (h_bufobj->offset > buf_size) { - /* Slice starting point is beyond current length. */ - return 0; - } - buf_avail = buf_size - h_bufobj->offset; - - return buf_avail >= len ? len : buf_avail; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hcompiledfunction.h ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hcompiledfunction.h b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hcompiledfunction.h deleted file mode 100644 index 04b9ea1..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_hcompiledfunction.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Heap compiled function (Ecmascript function) representation. - * - * There is a single data buffer containing the Ecmascript function's - * bytecode, constants, and inner functions. - */ - -#ifndef DUK_HCOMPILEDFUNCTION_H_INCLUDED -#define DUK_HCOMPILEDFUNCTION_H_INCLUDED - -/* - * Field accessor macros - */ - -/* XXX: casts could be improved, especially for GET/SET DATA */ - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HCOMPILEDFUNCTION_GET_DATA(heap,h) \ - ((duk_hbuffer_fixed *) (void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->data16)) -#define DUK_HCOMPILEDFUNCTION_SET_DATA(heap,h,v) do { \ - (h)->data16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS(heap,h) \ - ((duk_hobject **) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->funcs16))) -#define DUK_HCOMPILEDFUNCTION_SET_FUNCS(heap,h,v) do { \ - (h)->funcs16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPILEDFUNCTION_GET_BYTECODE(heap,h) \ - ((duk_instr_t *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->bytecode16))) -#define DUK_HCOMPILEDFUNCTION_SET_BYTECODE(heap,h,v) do { \ - (h)->bytecode16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#else -#define DUK_HCOMPILEDFUNCTION_GET_DATA(heap,h) \ - ((duk_hbuffer_fixed *) (void *) (h)->data) -#define DUK_HCOMPILEDFUNCTION_SET_DATA(heap,h,v) do { \ - (h)->data = (duk_hbuffer *) (v); \ - } while (0) -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS(heap,h) \ - ((h)->funcs) -#define DUK_HCOMPILEDFUNCTION_SET_FUNCS(heap,h,v) do { \ - (h)->funcs = (v); \ - } while (0) -#define DUK_HCOMPILEDFUNCTION_GET_BYTECODE(heap,h) \ - ((h)->bytecode) -#define DUK_HCOMPILEDFUNCTION_SET_BYTECODE(heap,h,v) do { \ - (h)->bytecode = (v); \ - } while (0) -#endif - -/* - * Accessor macros for function specific data areas - */ - -/* Note: assumes 'data' is always a fixed buffer */ -#define DUK_HCOMPILEDFUNCTION_GET_BUFFER_BASE(heap,h) \ - DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPILEDFUNCTION_GET_DATA((heap), (h))) - -#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE(heap,h) \ - ((duk_tval *) (void *) DUK_HCOMPILEDFUNCTION_GET_BUFFER_BASE((heap), (h))) - -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(heap,h) \ - DUK_HCOMPILEDFUNCTION_GET_FUNCS((heap), (h)) - -#define DUK_HCOMPILEDFUNCTION_GET_CODE_BASE(heap,h) \ - DUK_HCOMPILEDFUNCTION_GET_BYTECODE((heap), (h)) - -#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_END(heap,h) \ - ((duk_tval *) (void *) DUK_HCOMPILEDFUNCTION_GET_FUNCS((heap), (h))) - -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_END(heap,h) \ - ((duk_hobject **) (void *) DUK_HCOMPILEDFUNCTION_GET_BYTECODE((heap), (h))) - -/* XXX: double evaluation of DUK_HCOMPILEDFUNCTION_GET_DATA() */ -#define DUK_HCOMPILEDFUNCTION_GET_CODE_END(heap,h) \ - ((duk_instr_t *) (void *) (DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPILEDFUNCTION_GET_DATA((heap), (h))) + \ - DUK_HBUFFER_GET_SIZE((duk_hbuffer *) DUK_HCOMPILEDFUNCTION_GET_DATA((heap), h)))) - -#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_CONSTS_END((heap), (h))) - \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE((heap), (h))) \ - ) \ - ) - -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_FUNCS_END((heap), (h))) - \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE((heap), (h))) \ - ) \ - ) - -#define DUK_HCOMPILEDFUNCTION_GET_CODE_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_CODE_END((heap),(h))) - \ - ((const duk_uint8_t *) DUK_HCOMPILEDFUNCTION_GET_CODE_BASE((heap),(h))) \ - ) \ - ) - -#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPILEDFUNCTION_GET_CONSTS_SIZE((heap), (h)) / sizeof(duk_tval))) - -#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPILEDFUNCTION_GET_FUNCS_SIZE((heap), (h)) / sizeof(duk_hobject *))) - -#define DUK_HCOMPILEDFUNCTION_GET_CODE_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPILEDFUNCTION_GET_CODE_SIZE((heap), (h)) / sizeof(duk_instr_t))) - - -/* - * Main struct - */ - -struct duk_hcompiledfunction { - /* shared object part */ - duk_hobject obj; - - /* - * Pointers to function data area for faster access. Function - * data is a buffer shared between all closures of the same - * "template" function. The data buffer is always fixed (non- - * dynamic, hence stable), with a layout as follows: - * - * constants (duk_tval) - * inner functions (duk_hobject *) - * bytecode (duk_instr_t) - * - * Note: bytecode end address can be computed from 'data' buffer - * size. It is not strictly necessary functionally, assuming - * bytecode never jumps outside its allocated area. However, - * it's a safety/robustness feature for avoiding the chance of - * executing random data as bytecode due to a compiler error. - * - * Note: values in the data buffer must be incref'd (they will - * be decref'd on release) for every compiledfunction referring - * to the 'data' element. - */ - - /* Data area, fixed allocation, stable data ptrs. */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t data16; -#else - duk_hbuffer *data; -#endif - - /* No need for constants pointer (= same as data). - * - * When using 16-bit packing alignment to 4 is nice. 'funcs' will be - * 4-byte aligned because 'constants' are duk_tvals. For now the - * inner function pointers are not compressed, so that 'bytecode' will - * also be 4-byte aligned. - */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t funcs16; - duk_uint16_t bytecode16; -#else - duk_hobject **funcs; - duk_instr_t *bytecode; -#endif - - /* - * 'nregs' registers are allocated on function entry, at most 'nargs' - * are initialized to arguments, and the rest to undefined. Arguments - * above 'nregs' are not mapped to registers. All registers in the - * active stack range must be initialized because they are GC reachable. - * 'nargs' is needed so that if the function is given more than 'nargs' - * arguments, the additional arguments do not 'clobber' registers - * beyond 'nregs' which must be consistently initialized to undefined. - * - * Usually there is no need to know which registers are mapped to - * local variables. Registers may be allocated to variable in any - * way (even including gaps). However, a register-variable mapping - * must be the same for the duration of the function execution and - * the register cannot be used for anything else. - * - * When looking up variables by name, the '_Varmap' map is used. - * When an activation closes, registers mapped to arguments are - * copied into the environment record based on the same map. The - * reverse map (from register to variable) is not currently needed - * at run time, except for debugging, so it is not maintained. - */ - - duk_uint16_t nregs; /* regs to allocate */ - duk_uint16_t nargs; /* number of arguments allocated to regs */ - - /* - * Additional control information is placed into the object itself - * as internal properties to avoid unnecessary fields for the - * majority of functions. The compiler tries to omit internal - * control fields when possible. - * - * Function templates: - * - * { - * name: "func", // declaration, named function expressions - * fileName: <debug info for creating nice errors> - * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, - * _Formals: [ "arg1", "arg2" ], - * _Source: "function func(arg1, arg2) { ... }", - * _Pc2line: <debug info for pc-to-line mapping>, - * } - * - * Function instances: - * - * { - * length: 2, - * prototype: { constructor: <func> }, - * caller: <thrower>, - * arguments: <thrower>, - * name: "func", // declaration, named function expressions - * fileName: <debug info for creating nice errors> - * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, - * _Formals: [ "arg1", "arg2" ], - * _Source: "function func(arg1, arg2) { ... }", - * _Pc2line: <debug info for pc-to-line mapping>, - * _Varenv: <variable environment of closure>, - * _Lexenv: <lexical environment of closure (if differs from _Varenv)> - * } - * - * More detailed description of these properties can be found - * in the documentation. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* Line number range for function. Needed during debugging to - * determine active breakpoints. - */ - duk_uint32_t start_line; - duk_uint32_t end_line; -#endif -}; - -#endif /* DUK_HCOMPILEDFUNCTION_H_INCLUDED */ http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap.h ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap.h b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap.h deleted file mode 100644 index 5f96b1a..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap.h +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Heap structure. - * - * Heap contains allocated heap objects, interned strings, and built-in - * strings for one or more threads. - */ - -#ifndef DUK_HEAP_H_INCLUDED -#define DUK_HEAP_H_INCLUDED - -/* alloc function typedefs in duktape.h */ - -/* - * Heap flags - */ - -#define DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING (1 << 0) /* mark-and-sweep is currently running */ -#define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED (1 << 1) /* mark-and-sweep marking reached a recursion limit and must use multi-pass marking */ -#define DUK_HEAP_FLAG_REFZERO_FREE_RUNNING (1 << 2) /* refcount code is processing refzero list */ -#define DUK_HEAP_FLAG_ERRHANDLER_RUNNING (1 << 3) /* an error handler (user callback to augment/replace error) is running */ -#define DUK_HEAP_FLAG_INTERRUPT_RUNNING (1 << 4) /* executor interrupt running (used to avoid nested interrupts) */ -#define DUK_HEAP_FLAG_FINALIZER_NORESCUE (1 << 5) /* heap destruction ongoing, finalizer rescue no longer possible */ - -#define DUK__HEAP_HAS_FLAGS(heap,bits) ((heap)->flags & (bits)) -#define DUK__HEAP_SET_FLAGS(heap,bits) do { \ - (heap)->flags |= (bits); \ - } while (0) -#define DUK__HEAP_CLEAR_FLAGS(heap,bits) do { \ - (heap)->flags &= ~(bits); \ - } while (0) - -#define DUK_HEAP_HAS_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING) -#define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_HAS_REFZERO_FREE_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING) -#define DUK_HEAP_HAS_ERRHANDLER_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING) -#define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) - -#define DUK_HEAP_SET_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING) -#define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_SET_REFZERO_FREE_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING) -#define DUK_HEAP_SET_ERRHANDLER_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING) -#define DUK_HEAP_SET_INTERRUPT_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_SET_FINALIZER_NORESCUE(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) - -#define DUK_HEAP_CLEAR_MARKANDSWEEP_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RUNNING) -#define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_CLEAR_REFZERO_FREE_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_REFZERO_FREE_RUNNING) -#define DUK_HEAP_CLEAR_ERRHANDLER_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_ERRHANDLER_RUNNING) -#define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) - -/* - * Longjmp types, also double as identifying continuation type for a rethrow (in 'finally') - */ - -#define DUK_LJ_TYPE_UNKNOWN 0 /* unused */ -#define DUK_LJ_TYPE_THROW 1 /* value1 -> error object */ -#define DUK_LJ_TYPE_YIELD 2 /* value1 -> yield value, iserror -> error / normal */ -#define DUK_LJ_TYPE_RESUME 3 /* value1 -> resume value, value2 -> resumee thread, iserror -> error/normal */ -#define DUK_LJ_TYPE_BREAK 4 /* value1 -> label number, pseudo-type to indicate a break continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_CONTINUE 5 /* value1 -> label number, pseudo-type to indicate a continue continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_RETURN 6 /* value1 -> return value, pseudo-type to indicate a return continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_NORMAL 7 /* no value, pseudo-type to indicate a normal continuation (for ENDFIN) */ - -/* - * Mark-and-sweep flags - * - * These are separate from heap level flags now but could be merged. - * The heap structure only contains a 'base mark-and-sweep flags' - * field and the GC caller can impose further flags. - */ - -#define DUK_MS_FLAG_EMERGENCY (1 << 0) /* emergency mode: try extra hard */ -#define DUK_MS_FLAG_NO_STRINGTABLE_RESIZE (1 << 1) /* don't resize stringtable (but may sweep it); needed during stringtable resize */ -#define DUK_MS_FLAG_NO_OBJECT_COMPACTION (1 << 2) /* don't compact objects; needed during object property allocation resize */ -#define DUK_MS_FLAG_NO_FINALIZERS (1 << 3) /* don't run finalizers; leave finalizable objects in finalize_list for next round */ -#define DUK_MS_FLAG_SKIP_FINALIZERS (1 << 4) /* don't run finalizers; queue finalizable objects back to heap_allocated */ - -/* - * Thread switching - * - * To switch heap->curr_thread, use the macro below so that interrupt counters - * get updated correctly. The macro allows a NULL target thread because that - * happens e.g. in call handling. - */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) -#define DUK_HEAP_SWITCH_THREAD(heap,newthr) duk_heap_switch_thread((heap), (newthr)) -#else -#define DUK_HEAP_SWITCH_THREAD(heap,newthr) do { \ - (heap)->curr_thread = (newthr); \ - } while (0) -#endif - -/* - * Other heap related defines - */ - -/* Mark-and-sweep interval is relative to combined count of objects and - * strings kept in the heap during the latest mark-and-sweep pass. - * Fixed point .8 multiplier and .0 adder. Trigger count (interval) is - * decreased by each (re)allocation attempt (regardless of size), and each - * refzero processed object. - * - * 'SKIP' indicates how many (re)allocations to wait until a retry if - * GC is skipped because there is no thread do it with yet (happens - * only during init phases). - */ -#if defined(DUK_USE_MARK_AND_SWEEP) -#if defined(DUK_USE_REFERENCE_COUNTING) -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 12800L /* 50x heap size */ -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L -#else -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 256L /* 1x heap size */ -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L -#endif -#endif - -/* Stringcache is used for speeding up char-offset-to-byte-offset - * translations for non-ASCII strings. - */ -#define DUK_HEAP_STRCACHE_SIZE 4 -#define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT 16 /* strings up to the this length are not cached */ - -/* helper to insert a (non-string) heap object into heap allocated list */ -#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr) duk_heap_insert_into_heap_allocated((heap),(hdr)) - -/* - * Stringtable - */ - -/* initial stringtable size, must be prime and higher than DUK_UTIL_MIN_HASH_PRIME */ -#define DUK_STRTAB_INITIAL_SIZE 17 - -/* indicates a deleted string; any fixed non-NULL, non-hstring pointer works */ -#define DUK_STRTAB_DELETED_MARKER(heap) ((duk_hstring *) heap) - -/* resizing parameters */ -#define DUK_STRTAB_MIN_FREE_DIVISOR 4 /* load factor max 75% */ -#define DUK_STRTAB_MIN_USED_DIVISOR 4 /* load factor min 25% */ -#define DUK_STRTAB_GROW_ST_SIZE(n) ((n) + (n)) /* used entries + approx 100% -> reset load to 50% */ - -#define DUK_STRTAB_U32_MAX_STRLEN 10 /* 4'294'967'295 */ -#define DUK_STRTAB_HIGHEST_32BIT_PRIME 0xfffffffbUL - -/* probe sequence (open addressing) */ -#define DUK_STRTAB_HASH_INITIAL(hash,h_size) ((hash) % (h_size)) -#define DUK_STRTAB_HASH_PROBE_STEP(hash) DUK_UTIL_GET_HASH_PROBE_STEP((hash)) - -/* fixed top level hashtable size (separate chaining) */ -#define DUK_STRTAB_CHAIN_SIZE DUK_USE_STRTAB_CHAIN_SIZE - -/* - * Built-in strings - */ - -/* heap string indices are autogenerated in duk_strings.h */ -#if defined(DUK_USE_ROM_STRINGS) -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)])) -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)])) -#else -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((heap)->strs[(idx)]) -#endif -#endif /* DUK_USE_ROM_STRINGS */ - -/* - * Raw memory calls: relative to heap, but no GC interaction - */ - -#define DUK_ALLOC_RAW(heap,size) \ - ((heap)->alloc_func((heap)->heap_udata, (size))) - -#define DUK_REALLOC_RAW(heap,ptr,newsize) \ - ((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize))) - -#define DUK_FREE_RAW(heap,ptr) \ - ((heap)->free_func((heap)->heap_udata, (void *) (ptr))) - -/* - * Memory calls: relative to heap, GC interaction, but no error throwing. - * - * XXX: Currently a mark-and-sweep triggered by memory allocation will run - * using the heap->heap_thread. This thread is also used for running - * mark-and-sweep finalization; this is not ideal because it breaks the - * isolation between multiple global environments. - * - * Notes: - * - * - DUK_FREE() is required to ignore NULL and any other possible return - * value of a zero-sized alloc/realloc (same as ANSI C free()). - * - * - There is no DUK_REALLOC_ZEROED because we don't assume to know the - * old size. Caller must zero the reallocated memory. - * - * - DUK_REALLOC_INDIRECT() must be used when a mark-and-sweep triggered - * by an allocation failure might invalidate the original 'ptr', thus - * causing a realloc retry to use an invalid pointer. Example: we're - * reallocating the value stack and a finalizer resizes the same value - * stack during mark-and-sweep. The indirect variant requests for the - * current location of the pointer being reallocated using a callback - * right before every realloc attempt; this circuitous approach is used - * to avoid strict aliasing issues in a more straightforward indirect - * pointer (void **) approach. Note: the pointer in the storage - * location is read but is NOT updated; the caller must do that. - */ - -/* callback for indirect reallocs, request for current pointer */ -typedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud); - -#define DUK_ALLOC(heap,size) duk_heap_mem_alloc((heap), (size)) -#define DUK_ALLOC_ZEROED(heap,size) duk_heap_mem_alloc_zeroed((heap), (size)) -#define DUK_REALLOC(heap,ptr,newsize) duk_heap_mem_realloc((heap), (ptr), (newsize)) -#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize)) -#define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr)) - -/* - * Memory constants - */ - -#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT 5 /* Retry allocation after mark-and-sweep for this - * many times. A single mark-and-sweep round is - * not guaranteed to free all unreferenced memory - * because of finalization (in fact, ANY number of - * rounds is strictly not enough). - */ - -#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT 3 /* Starting from this round, use emergency mode - * for mark-and-sweep. - */ - -/* - * Debugger support - */ - -/* Maximum number of breakpoints. Only breakpoints that are set are - * consulted so increasing this has no performance impact. - */ -#define DUK_HEAP_MAX_BREAKPOINTS 16 - -/* Opcode interval for a Date-based status/peek rate limit check. Only - * relevant when debugger is attached. Requesting a timestamp may be a - * slow operation on some platforms so this shouldn't be too low. On the - * other hand a high value makes Duktape react to a pause request slowly. - */ -#define DUK_HEAP_DBG_RATELIMIT_OPCODES 4000 - -/* Milliseconds between status notify and transport peeks. */ -#define DUK_HEAP_DBG_RATELIMIT_MILLISECS 200 - -/* Step types */ -#define DUK_STEP_TYPE_NONE 0 -#define DUK_STEP_TYPE_INTO 1 -#define DUK_STEP_TYPE_OVER 2 -#define DUK_STEP_TYPE_OUT 3 - -struct duk_breakpoint { - duk_hstring *filename; - duk_uint32_t line; -}; - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -#define DUK_HEAP_IS_DEBUGGER_ATTACHED(heap) ((heap)->dbg_read_cb != NULL) -#define DUK_HEAP_CLEAR_STEP_STATE(heap) do { \ - (heap)->dbg_step_type = DUK_STEP_TYPE_NONE; \ - (heap)->dbg_step_thread = NULL; \ - (heap)->dbg_step_csindex = 0; \ - (heap)->dbg_step_startline = 0; \ - } while (0) -#define DUK_HEAP_SET_PAUSED(heap) do { \ - (heap)->dbg_paused = 1; \ - (heap)->dbg_state_dirty = 1; \ - DUK_HEAP_CLEAR_STEP_STATE((heap)); \ - } while (0) -#define DUK_HEAP_CLEAR_PAUSED(heap) do { \ - (heap)->dbg_paused = 0; \ - (heap)->dbg_state_dirty = 1; \ - DUK_HEAP_CLEAR_STEP_STATE((heap)); \ - } while (0) -#define DUK_HEAP_IS_PAUSED(heap) ((heap)->dbg_paused) -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -/* - * String cache should ideally be at duk_hthread level, but that would - * cause string finalization to slow down relative to the number of - * threads; string finalization must check the string cache for "weak" - * references to the string being finalized to avoid dead pointers. - * - * Thus, string caches are now at the heap level now. - */ - -struct duk_strcache { - duk_hstring *h; - duk_uint32_t bidx; - duk_uint32_t cidx; -}; - -/* - * Longjmp state, contains the information needed to perform a longjmp. - * Longjmp related values are written to value1, value2, and iserror. - */ - -struct duk_ljstate { - duk_jmpbuf *jmpbuf_ptr; /* current setjmp() catchpoint */ - duk_small_uint_t type; /* longjmp type */ - duk_bool_t iserror; /* isError flag for yield */ - duk_tval value1; /* 1st related value (type specific) */ - duk_tval value2; /* 2nd related value (type specific) */ -}; - -/* - * Stringtable entry for fixed size stringtable - */ - -struct duk_strtab_entry { -#if defined(DUK_USE_HEAPPTR16) - /* A 16-bit listlen makes sense with 16-bit heap pointers: there - * won't be space for 64k strings anyway. - */ - duk_uint16_t listlen; /* if 0, 'str16' used, if > 0, 'strlist16' used */ - union { - duk_uint16_t strlist16; - duk_uint16_t str16; - } u; -#else - duk_size_t listlen; /* if 0, 'str' used, if > 0, 'strlist' used */ - union { - duk_hstring **strlist; - duk_hstring *str; - } u; -#endif -}; - -/* - * Main heap structure - */ - -struct duk_heap { - duk_small_uint_t flags; - - /* Allocator functions. */ - duk_alloc_function alloc_func; - duk_realloc_function realloc_func; - duk_free_function free_func; - - /* Heap udata, used for allocator functions but also for other heap - * level callbacks like pointer compression, etc. - */ - void *heap_udata; - - /* Precomputed pointers when using 16-bit heap pointer packing. */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t heapptr_null16; - duk_uint16_t heapptr_deleted16; -#endif - - /* Fatal error handling, called e.g. when a longjmp() is needed but - * lj.jmpbuf_ptr is NULL. fatal_func must never return; it's not - * declared as "noreturn" because doing that for typedefs is a bit - * challenging portability-wise. - */ - duk_fatal_function fatal_func; - - /* allocated heap objects */ - duk_heaphdr *heap_allocated; - - /* work list for objects whose refcounts are zero but which have not been - * "finalized"; avoids recursive C calls when refcounts go to zero in a - * chain of objects. - */ -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_heaphdr *refzero_list; - duk_heaphdr *refzero_list_tail; -#endif - -#if defined(DUK_USE_MARK_AND_SWEEP) - /* mark-and-sweep control */ -#if defined(DUK_USE_VOLUNTARY_GC) - duk_int_t mark_and_sweep_trigger_counter; -#endif - duk_int_t mark_and_sweep_recursion_depth; - - /* mark-and-sweep flags automatically active (used for critical sections) */ - duk_small_uint_t mark_and_sweep_base_flags; - - /* work list for objects to be finalized (by mark-and-sweep) */ - duk_heaphdr *finalize_list; -#endif - - /* longjmp state */ - duk_ljstate lj; - - /* marker for detecting internal "double faults", see duk_error_throw.c */ - duk_bool_t handling_error; - - /* heap thread, used internally and for finalization */ - duk_hthread *heap_thread; - - /* current thread */ - duk_hthread *curr_thread; /* currently running thread */ - - /* heap level "stash" object (e.g., various reachability roots) */ - duk_hobject *heap_object; - - /* duk_handle_call / duk_handle_safe_call recursion depth limiting */ - duk_int_t call_recursion_depth; - duk_int_t call_recursion_limit; - - /* mix-in value for computing string hashes; should be reasonably unpredictable */ - duk_uint32_t hash_seed; - - /* rnd_state for duk_util_tinyrandom.c */ - duk_uint32_t rnd_state; - - /* For manual debugging: instruction count based on executor and - * interrupt counter book-keeping. Inspect debug logs to see how - * they match up. - */ -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) - duk_int_t inst_count_exec; - duk_int_t inst_count_interrupt; -#endif - - /* debugger */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* callbacks and udata; dbg_read_cb != NULL is used to indicate attached state */ - duk_debug_read_function dbg_read_cb; /* required, NULL implies detached */ - duk_debug_write_function dbg_write_cb; /* required */ - duk_debug_peek_function dbg_peek_cb; - duk_debug_read_flush_function dbg_read_flush_cb; - duk_debug_write_flush_function dbg_write_flush_cb; - duk_debug_request_function dbg_request_cb; - duk_debug_detached_function dbg_detached_cb; - void *dbg_udata; - - /* debugger state, only relevant when attached */ - duk_bool_t dbg_processing; /* currently processing messages or breakpoints: don't enter message processing recursively (e.g. no breakpoints when processing debugger eval) */ - duk_bool_t dbg_paused; /* currently paused: talk with debug client until step/resume */ - duk_bool_t dbg_state_dirty; /* resend state next time executor is about to run */ - duk_bool_t dbg_force_restart; /* force executor restart to recheck breakpoints; used to handle function returns (see GH-303) */ - duk_bool_t dbg_detaching; /* debugger detaching; used to avoid calling detach handler recursively */ - duk_small_uint_t dbg_step_type; /* step type: none, step into, step over, step out */ - duk_hthread *dbg_step_thread; /* borrowed; NULL if no step state (NULLed in unwind) */ - duk_size_t dbg_step_csindex; /* callstack index */ - duk_uint32_t dbg_step_startline; /* starting line number */ - duk_breakpoint dbg_breakpoints[DUK_HEAP_MAX_BREAKPOINTS]; /* breakpoints: [0,breakpoint_count[ gc reachable */ - duk_small_uint_t dbg_breakpoint_count; - duk_breakpoint *dbg_breakpoints_active[DUK_HEAP_MAX_BREAKPOINTS + 1]; /* currently active breakpoints: NULL term, borrowed pointers */ - /* XXX: make active breakpoints actual copies instead of pointers? */ - - /* These are for rate limiting Status notifications and transport peeking. */ - duk_uint32_t dbg_exec_counter; /* cumulative opcode execution count (overflows are OK) */ - duk_uint32_t dbg_last_counter; /* value of dbg_exec_counter when we last did a Date-based check */ - duk_double_t dbg_last_time; /* time when status/peek was last done (Date-based rate limit) */ - - /* Used to support single-byte stream lookahead. */ - duk_bool_t dbg_have_next_byte; - duk_uint8_t dbg_next_byte; -#endif - - /* string intern table (weak refs) */ -#if defined(DUK_USE_STRTAB_PROBE) -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t *strtable16; -#else - duk_hstring **strtable; -#endif - duk_uint32_t st_size; /* alloc size in elements */ - duk_uint32_t st_used; /* used elements (includes DELETED) */ -#endif - - /* XXX: static alloc is OK until separate chaining stringtable - * resizing is implemented. - */ -#if defined(DUK_USE_STRTAB_CHAIN) - duk_strtab_entry strtable[DUK_STRTAB_CHAIN_SIZE]; -#endif - - /* string access cache (codepoint offset -> byte offset) for fast string - * character looping; 'weak' reference which needs special handling in GC. - */ - duk_strcache strcache[DUK_HEAP_STRCACHE_SIZE]; - - /* built-in strings */ -#if defined(DUK_USE_ROM_STRINGS) - /* No field needed when strings are in ROM. */ -#else -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t strs16[DUK_HEAP_NUM_STRINGS]; -#else - duk_hstring *strs[DUK_HEAP_NUM_STRINGS]; -#endif -#endif -}; - -/* - * Prototypes - */ - -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 void duk_heap_free(duk_heap *heap); -DUK_INTERNAL_DECL void duk_free_hobject_inner(duk_heap *heap, duk_hobject *h); -DUK_INTERNAL_DECL void duk_free_hbuffer_inner(duk_heap *heap, duk_hbuffer *h); -DUK_INTERNAL_DECL void duk_free_hstring_inner(duk_heap *heap, duk_hstring *h); -DUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr); - -DUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL_DECL void duk_heap_remove_any_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); -#endif -#if defined(DUK_USE_INTERRUPT_COUNTER) -DUK_INTERNAL_DECL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr); -#endif - -#if 0 /*unused*/ -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_lookup(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen); -#endif -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen); -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len); -#if 0 /*unused*/ -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_lookup_u32(duk_heap *heap, duk_uint32_t val); -#endif -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_intern_u32(duk_heap *heap, duk_uint32_t val); -DUK_INTERNAL_DECL duk_hstring *duk_heap_string_intern_u32_checked(duk_hthread *thr, duk_uint32_t val); -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL_DECL void duk_heap_string_remove(duk_heap *heap, duk_hstring *h); -#endif -#if defined(DUK_USE_MARK_AND_SWEEP) && defined(DUK_USE_MS_STRINGTABLE_RESIZE) -DUK_INTERNAL_DECL void duk_heap_force_strtab_resize(duk_heap *heap); -#endif -DUK_INTERNAL void duk_heap_free_strtab(duk_heap *heap); -#if defined(DUK_USE_DEBUG) -DUK_INTERNAL void duk_heap_dump_strtab(duk_heap *heap); -#endif - - -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); - -#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) -DUK_INTERNAL_DECL void *duk_default_alloc_function(void *udata, duk_size_t size); -DUK_INTERNAL_DECL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize); -DUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr); -#endif - -DUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize); -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_mem_free(duk_heap *heap, void *ptr); - -#ifdef DUK_USE_REFERENCE_COUNTING -#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -DUK_INTERNAL_DECL void duk_tval_incref(duk_tval *tv); -#endif -#if 0 /* unused */ -DUK_INTERNAL_DECL void duk_tval_incref_allownull(duk_tval *tv); -#endif -DUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv); -#if 0 /* unused */ -DUK_INTERNAL_DECL void duk_tval_decref_allownull(duk_hthread *thr, duk_tval *tv); -#endif -#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -DUK_INTERNAL_DECL void duk_heaphdr_incref(duk_heaphdr *h); -#endif -#if 0 /* unused */ -DUK_INTERNAL_DECL void duk_heaphdr_incref_allownull(duk_heaphdr *h); -#endif -DUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_decref_allownull(duk_hthread *thr, duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize(duk_hthread *thr, duk_heaphdr *hdr); -#else -/* no refcounting */ -#endif - -#if defined(DUK_USE_MARK_AND_SWEEP) -DUK_INTERNAL_DECL duk_bool_t duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags); -#endif - -DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len); - -#endif /* DUK_HEAP_H_INCLUDED */ http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/ede68a10/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap_alloc.c ---------------------------------------------------------------------- diff --git a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap_alloc.c b/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap_alloc.c deleted file mode 100644 index b89fe48..0000000 --- a/thirdparty/civetweb-1.10/src/third_party/duktape-1.5.2/src-separate/duk_heap_alloc.c +++ /dev/null @@ -1,1042 +0,0 @@ -/* - * duk_heap allocation and freeing. - */ - -#include "duk_internal.h" - -/* Constants for built-in string data depacking. */ -#define DUK__BITPACK_LETTER_LIMIT 26 -#define DUK__BITPACK_UNDERSCORE 26 -#define DUK__BITPACK_FF 27 -#define DUK__BITPACK_SWITCH1 29 -#define DUK__BITPACK_SWITCH 30 -#define DUK__BITPACK_SEVENBIT 31 - -#if defined(DUK_USE_ROM_STRINGS) -/* Fixed seed value used with ROM strings. */ -#define DUK__FIXED_HASH_SEED 0xabcd1234 -#endif - -/* - * Free a heap object. - * - * Free heap object and its internal (non-heap) pointers. Assumes that - * caller has removed the object from heap allocated list or the string - * intern table, and any weak references (which strings may have) have - * been already dealt with. - */ - -DUK_INTERNAL void duk_free_hobject_inner(duk_heap *heap, duk_hobject *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - DUK_FREE(heap, DUK_HOBJECT_GET_PROPS(heap, h)); - - if (DUK_HOBJECT_IS_COMPILEDFUNCTION(h)) { - duk_hcompiledfunction *f = (duk_hcompiledfunction *) h; - DUK_UNREF(f); - /* Currently nothing to free; 'data' is a heap object */ - } else if (DUK_HOBJECT_IS_NATIVEFUNCTION(h)) { - duk_hnativefunction *f = (duk_hnativefunction *) h; - DUK_UNREF(f); - /* Currently nothing to free */ - } else if (DUK_HOBJECT_IS_THREAD(h)) { - duk_hthread *t = (duk_hthread *) h; - DUK_FREE(heap, t->valstack); - DUK_FREE(heap, t->callstack); - DUK_FREE(heap, t->catchstack); - /* Don't free h->resumer because it exists in the heap. - * Callstack entries also contain function pointers which - * are not freed for the same reason. - */ - - /* XXX: with 'caller' property the callstack would need - * to be unwound to update the 'caller' properties of - * functions in the callstack. - */ - } -} - -DUK_INTERNAL void duk_free_hbuffer_inner(duk_heap *heap, duk_hbuffer *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - if (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h)) { - duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h; - DUK_DDD(DUK_DDDPRINT("free dynamic buffer %p", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g))); - DUK_FREE(heap, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g)); - } -} - -DUK_INTERNAL void duk_free_hstring_inner(duk_heap *heap, duk_hstring *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - DUK_UNREF(heap); - DUK_UNREF(h); - -#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_FREE) - if (DUK_HSTRING_HAS_EXTDATA(h)) { - DUK_DDD(DUK_DDDPRINT("free extstr: hstring %!O, extdata: %p", - h, DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h))); - DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h)); - } -#endif -} - -DUK_INTERNAL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr) { - DUK_ASSERT(heap); - DUK_ASSERT(hdr); - - DUK_DDD(DUK_DDDPRINT("free heaphdr %p, htype %ld", (void *) hdr, (long) DUK_HEAPHDR_GET_TYPE(hdr))); - - switch ((int) DUK_HEAPHDR_GET_TYPE(hdr)) { - case DUK_HTYPE_STRING: - duk_free_hstring_inner(heap, (duk_hstring *) hdr); - break; - case DUK_HTYPE_OBJECT: - duk_free_hobject_inner(heap, (duk_hobject *) hdr); - break; - case DUK_HTYPE_BUFFER: - duk_free_hbuffer_inner(heap, (duk_hbuffer *) hdr); - break; - default: - DUK_UNREACHABLE(); - } - - DUK_FREE(heap, hdr); -} - -/* - * Free the heap. - * - * Frees heap-related non-heap-tracked allocations such as the - * string intern table; then frees the heap allocated objects; - * and finally frees the heap structure itself. Reference counts - * and GC markers are ignored (and not updated) in this process, - * and finalizers won't be called. - * - * The heap pointer and heap object pointers must not be used - * after this call. - */ - -DUK_LOCAL void duk__free_allocated(duk_heap *heap) { - duk_heaphdr *curr; - duk_heaphdr *next; - - curr = heap->heap_allocated; - while (curr) { - /* We don't log or warn about freeing zero refcount objects - * because they may happen with finalizer processing. - */ - - DUK_DDD(DUK_DDDPRINT("FINALFREE (allocated): %!iO", - (duk_heaphdr *) curr)); - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - duk_heap_free_heaphdr_raw(heap, curr); - curr = next; - } -} - -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_LOCAL void duk__free_refzero_list(duk_heap *heap) { - duk_heaphdr *curr; - duk_heaphdr *next; - - curr = heap->refzero_list; - while (curr) { - DUK_DDD(DUK_DDDPRINT("FINALFREE (refzero_list): %!iO", - (duk_heaphdr *) curr)); - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - duk_heap_free_heaphdr_raw(heap, curr); - curr = next; - } -} -#endif - -#if defined(DUK_USE_MARK_AND_SWEEP) -DUK_LOCAL void duk__free_markandsweep_finalize_list(duk_heap *heap) { - duk_heaphdr *curr; - duk_heaphdr *next; - - curr = heap->finalize_list; - while (curr) { - DUK_DDD(DUK_DDDPRINT("FINALFREE (finalize_list): %!iO", - (duk_heaphdr *) curr)); - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - duk_heap_free_heaphdr_raw(heap, curr); - curr = next; - } -} -#endif - -DUK_LOCAL void duk__free_stringtable(duk_heap *heap) { - /* strings are only tracked by stringtable */ - duk_heap_free_strtab(heap); -} - -DUK_LOCAL void duk__free_run_finalizers(duk_heap *heap) { - duk_hthread *thr; - duk_heaphdr *curr; - duk_uint_t round_no; - duk_size_t count_all; - duk_size_t count_finalized; - duk_size_t curr_limit; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* refzero not running -> must be empty */ -#endif -#if defined(DUK_USE_MARK_AND_SWEEP) - DUK_ASSERT(heap->finalize_list == NULL); /* mark-and-sweep not running -> must be empty */ -#endif - - /* XXX: here again finalizer thread is the heap_thread which needs - * to be coordinated with finalizer thread fixes. - */ - thr = heap->heap_thread; - DUK_ASSERT(thr != NULL); - - /* Prevent mark-and-sweep for the pending finalizers, also prevents - * refzero handling from moving objects away from the heap_allocated - * list. (The flag meaning is slightly abused here.) - */ - DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RUNNING(heap)); - DUK_HEAP_SET_MARKANDSWEEP_RUNNING(heap); - - curr_limit = 0; /* suppress warning, not used */ - for (round_no = 0; ; round_no++) { - curr = heap->heap_allocated; - count_all = 0; - count_finalized = 0; - while (curr) { - count_all++; - if (DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT) { - /* Only objects in heap_allocated may have finalizers. Check that - * the object itself has a _Finalizer property (own or inherited) - * so that we don't execute finalizers for e.g. Proxy objects. - */ - DUK_ASSERT(thr != NULL); - DUK_ASSERT(curr != NULL); - - if (duk_hobject_hasprop_raw(thr, (duk_hobject *) curr, DUK_HTHREAD_STRING_INT_FINALIZER(thr))) { - if (!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) curr)) { - DUK_ASSERT(DUK_HEAP_HAS_FINALIZER_NORESCUE(heap)); /* maps to finalizer 2nd argument */ - duk_hobject_run_finalizer(thr, (duk_hobject *) curr); - count_finalized++; - } - } - } - curr = DUK_HEAPHDR_GET_NEXT(heap, curr); - } - - /* Each round of finalizer execution may spawn new finalizable objects - * which is normal behavior for some applications. Allow multiple - * rounds of finalization, but use a shrinking limit based on the - * first round to detect the case where a runaway finalizer creates - * an unbounded amount of new finalizable objects. Finalizer rescue - * is not supported: the semantics are unclear because most of the - * objects being finalized here are already reachable. The finalizer - * is given a boolean to indicate that rescue is not possible. - * - * See discussion in: https://github.com/svaarala/duktape/pull/473 - */ - - if (round_no == 0) { - /* Cannot wrap: each object is at least 8 bytes so count is - * at most 1/8 of that. - */ - curr_limit = count_all * 2; - } else { - curr_limit = (curr_limit * 3) / 4; /* Decrease by 25% every round */ - } - DUK_D(DUK_DPRINT("finalizer round %ld complete, %ld objects, tried to execute %ld finalizers, current limit is %ld", - (long) round_no, (long) count_all, (long) count_finalized, (long) curr_limit)); - - if (count_finalized == 0) { - DUK_D(DUK_DPRINT("no more finalizable objects, forced finalization finished")); - break; - } - if (count_finalized >= curr_limit) { - DUK_D(DUK_DPRINT("finalizer count above limit, potentially runaway finalizer; skip remaining finalizers")); - break; - } - } - - DUK_ASSERT(DUK_HEAP_HAS_MARKANDSWEEP_RUNNING(heap)); - DUK_HEAP_CLEAR_MARKANDSWEEP_RUNNING(heap); -} - -DUK_INTERNAL void duk_heap_free(duk_heap *heap) { - DUK_D(DUK_DPRINT("free heap: %p", (void *) heap)); - -#if defined(DUK_USE_DEBUG) - duk_heap_dump_strtab(heap); -#endif - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* Detach a debugger if attached (can be called multiple times) - * safely. - */ - /* XXX: Add a flag to reject an attempt to re-attach? Otherwise - * the detached callback may immediately reattach. - */ - duk_debug_do_detach(heap); -#endif - - /* Execute finalizers before freeing the heap, even for reachable - * objects, and regardless of whether or not mark-and-sweep is - * enabled. This gives finalizers the chance to free any native - * resources like file handles, allocations made outside Duktape, - * etc. This is quite tricky to get right, so that all finalizer - * guarantees are honored. - * - * XXX: this perhaps requires an execution time limit. - */ - DUK_D(DUK_DPRINT("execute finalizers before freeing heap")); -#if defined(DUK_USE_MARK_AND_SWEEP) - /* Run mark-and-sweep a few times just in case (unreachable object - * finalizers run already here). The last round must rescue objects - * from the previous round without running any more finalizers. This - * ensures rescued objects get their FINALIZED flag cleared so that - * their finalizer is called once more in forced finalization to - * satisfy finalizer guarantees. However, we don't want to run any - * more finalizer because that'd required one more loop, and so on. - */ - DUK_D(DUK_DPRINT("forced gc #1 in heap destruction")); - duk_heap_mark_and_sweep(heap, 0); - DUK_D(DUK_DPRINT("forced gc #2 in heap destruction")); - duk_heap_mark_and_sweep(heap, 0); - DUK_D(DUK_DPRINT("forced gc #3 in heap destruction (don't run finalizers)")); - duk_heap_mark_and_sweep(heap, DUK_MS_FLAG_SKIP_FINALIZERS); /* skip finalizers; queue finalizable objects to heap_allocated */ -#endif - - DUK_HEAP_SET_FINALIZER_NORESCUE(heap); /* rescue no longer supported */ - duk__free_run_finalizers(heap); - - /* Note: heap->heap_thread, heap->curr_thread, and heap->heap_object - * are on the heap allocated list. - */ - - DUK_D(DUK_DPRINT("freeing heap objects of heap: %p", (void *) heap)); - duk__free_allocated(heap); - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_D(DUK_DPRINT("freeing refzero list of heap: %p", (void *) heap)); - duk__free_refzero_list(heap); -#endif - -#if defined(DUK_USE_MARK_AND_SWEEP) - DUK_D(DUK_DPRINT("freeing mark-and-sweep finalize list of heap: %p", (void *) heap)); - duk__free_markandsweep_finalize_list(heap); -#endif - - DUK_D(DUK_DPRINT("freeing string table of heap: %p", (void *) heap)); - duk__free_stringtable(heap); - - DUK_D(DUK_DPRINT("freeing heap structure: %p", (void *) heap)); - heap->free_func(heap->heap_udata, heap); -} - -/* - * Allocate a heap. - * - * String table is initialized with built-in strings from genbuiltins.py, - * either by dynamically creating the strings or by referring to ROM strings. - */ - -#if defined(DUK_USE_ROM_STRINGS) -DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { -#if defined(DUK_USE_ASSERTIONS) - duk_small_uint_t i; -#endif - - /* With ROM-based strings, heap->strs[] and thr->strs[] are omitted - * so nothing to initialize for strs[]. - */ - -#if defined(DUK_USE_ASSERTIONS) - for (i = 0; i < sizeof(duk_rom_strings) / sizeof(const duk_hstring *); i++) { - duk_uint32_t hash; - const duk_hstring *h; - h = duk_rom_strings[i]; - DUK_ASSERT(h != NULL); - hash = duk_heap_hashstring(heap, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); - DUK_DD(DUK_DDPRINT("duk_rom_strings[%d] -> hash 0x%08lx, computed 0x%08lx", - (int) i, (unsigned long) DUK_HSTRING_GET_HASH(h), (unsigned long) hash)); - DUK_ASSERT(hash == (duk_uint32_t) DUK_HSTRING_GET_HASH(h)); - } -#endif - return 1; -} -#else /* DUK_USE_ROM_STRINGS */ -DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { - duk_bitdecoder_ctx bd_ctx; - duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */ - duk_small_uint_t i, j; - - DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); - bd->data = (const duk_uint8_t *) duk_strings_data; - bd->length = (duk_size_t) DUK_STRDATA_DATA_LENGTH; - - for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { - duk_uint8_t tmp[DUK_STRDATA_MAX_STRLEN]; - duk_hstring *h; - duk_small_uint_t len; - duk_small_uint_t mode; - duk_small_uint_t t; - - len = duk_bd_decode(bd, 5); - mode = 32; /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */ - for (j = 0; j < len; j++) { - t = duk_bd_decode(bd, 5); - if (t < DUK__BITPACK_LETTER_LIMIT) { - t = t + DUK_ASC_UC_A + mode; - } else if (t == DUK__BITPACK_UNDERSCORE) { - t = DUK_ASC_UNDERSCORE; - } else if (t == DUK__BITPACK_FF) { - /* Internal keys are prefixed with 0xFF in the stringtable - * (which makes them invalid UTF-8 on purpose). - */ - t = 0xff; - } else if (t == DUK__BITPACK_SWITCH1) { - t = duk_bd_decode(bd, 5); - DUK_ASSERT_DISABLE(t >= 0); /* unsigned */ - DUK_ASSERT(t <= 25); - t = t + DUK_ASC_UC_A + (mode ^ 32); - } else if (t == DUK__BITPACK_SWITCH) { - mode = mode ^ 32; - t = duk_bd_decode(bd, 5); - DUK_ASSERT_DISABLE(t >= 0); - DUK_ASSERT(t <= 25); - t = t + DUK_ASC_UC_A + mode; - } else if (t == DUK__BITPACK_SEVENBIT) { - t = duk_bd_decode(bd, 7); - } - tmp[j] = (duk_uint8_t) t; - } - - /* No need to length check string: it will never exceed even - * the 16-bit length maximum. - */ - DUK_ASSERT(len <= 0xffffUL); - DUK_DDD(DUK_DDDPRINT("intern built-in string %ld", (long) i)); - h = duk_heap_string_intern(heap, tmp, len); - if (!h) { - goto error; - } - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)); - - /* Special flags checks. Since these strings are always - * reachable and a string cannot appear twice in the string - * table, there's no need to check/set these flags elsewhere. - * The 'internal' flag is set by string intern code. - */ - if (i == DUK_STRIDX_EVAL || i == DUK_STRIDX_LC_ARGUMENTS) { - DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(h); - } - if (i >= DUK_STRIDX_START_RESERVED && i < DUK_STRIDX_END_RESERVED) { - DUK_HSTRING_SET_RESERVED_WORD(h); - if (i >= DUK_STRIDX_START_STRICT_RESERVED) { - DUK_HSTRING_SET_STRICT_RESERVED_WORD(h); - } - } - - DUK_DDD(DUK_DDDPRINT("interned: %!O", (duk_heaphdr *) h)); - - /* XXX: The incref macro takes a thread pointer but doesn't - * use it right now. - */ - DUK_HSTRING_INCREF(_never_referenced_, h); - -#if defined(DUK_USE_HEAPPTR16) - heap->strs16[i] = DUK_USE_HEAPPTR_ENC16(heap->heap_udata, (void *) h); -#else - heap->strs[i] = h; -#endif - } - - return 1; - - error: - return 0; -} -#endif /* DUK_USE_ROM_STRINGS */ - -DUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) { - duk_hthread *thr; - - DUK_DD(DUK_DDPRINT("heap init: alloc heap thread")); - thr = duk_hthread_alloc(heap, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_THREAD | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); - if (!thr) { - DUK_D(DUK_DPRINT("failed to alloc heap_thread")); - return 0; - } - thr->state = DUK_HTHREAD_STATE_INACTIVE; -#if defined(DUK_USE_ROM_STRINGS) - /* No strs[] pointer. */ -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) - thr->strs16 = heap->strs16; -#else - thr->strs = heap->strs; -#endif -#endif /* DUK_USE_ROM_STRINGS */ - - heap->heap_thread = thr; - DUK_HTHREAD_INCREF(thr, thr); /* Note: first argument not really used */ - - /* 'thr' is now reachable */ - - if (!duk_hthread_init_stacks(heap, thr)) { - return 0; - } - - /* XXX: this may now fail, and is not handled correctly */ - duk_hthread_create_builtin_objects(thr); - - /* default prototype (Note: 'thr' must be reachable) */ - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) thr, thr->builtins[DUK_BIDX_THREAD_PROTOTYPE]); - - return 1; -} - -#if defined(DUK_USE_DEBUG) -#define DUK__DUMPSZ(t) do { \ - DUK_D(DUK_DPRINT("" #t "=%ld", (long) sizeof(t))); \ - } while (0) - -/* These is not 100% because format would need to be non-portable "long long". - * Also print out as doubles to catch cases where the "long" type is not wide - * enough; the limits will then not be printed accurately but the magnitude - * will be correct. - */ -#define DUK__DUMPLM_SIGNED_RAW(t,a,b) do { \ - DUK_D(DUK_DPRINT(t "=[%ld,%ld]=[%lf,%lf]", \ - (long) (a), (long) (b), \ - (double) (a), (double) (b))); \ - } while (0) -#define DUK__DUMPLM_UNSIGNED_RAW(t,a,b) do { \ - DUK_D(DUK_DPRINT(t "=[%lu,%lu]=[%lf,%lf]", \ - (unsigned long) (a), (unsigned long) (b), \ - (double) (a), (double) (b))); \ - } while (0) -#define DUK__DUMPLM_SIGNED(t) do { \ - DUK__DUMPLM_SIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ - } while (0) -#define DUK__DUMPLM_UNSIGNED(t) do { \ - DUK__DUMPLM_UNSIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ - } while (0) - -DUK_LOCAL void duk__dump_type_sizes(void) { - DUK_D(DUK_DPRINT("sizeof()")); - - /* basic platform types */ - DUK__DUMPSZ(char); - DUK__DUMPSZ(short); - DUK__DUMPSZ(int); - DUK__DUMPSZ(long); - DUK__DUMPSZ(double); - DUK__DUMPSZ(void *); - DUK__DUMPSZ(size_t); - - /* basic types from duk_features.h */ - DUK__DUMPSZ(duk_uint8_t); - DUK__DUMPSZ(duk_int8_t); - DUK__DUMPSZ(duk_uint16_t); - DUK__DUMPSZ(duk_int16_t); - DUK__DUMPSZ(duk_uint32_t); - DUK__DUMPSZ(duk_int32_t); - DUK__DUMPSZ(duk_uint64_t); - DUK__DUMPSZ(duk_int64_t); - DUK__DUMPSZ(duk_uint_least8_t); - DUK__DUMPSZ(duk_int_least8_t); - DUK__DUMPSZ(duk_uint_least16_t); - DUK__DUMPSZ(duk_int_least16_t); - DUK__DUMPSZ(duk_uint_least32_t); - DUK__DUMPSZ(duk_int_least32_t); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPSZ(duk_uint_least64_t); - DUK__DUMPSZ(duk_int_least64_t); -#endif - DUK__DUMPSZ(duk_uint_fast8_t); - DUK__DUMPSZ(duk_int_fast8_t); - DUK__DUMPSZ(duk_uint_fast16_t); - DUK__DUMPSZ(duk_int_fast16_t); - DUK__DUMPSZ(duk_uint_fast32_t); - DUK__DUMPSZ(duk_int_fast32_t); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPSZ(duk_uint_fast64_t); - DUK__DUMPSZ(duk_int_fast64_t); -#endif - DUK__DUMPSZ(duk_uintptr_t); - DUK__DUMPSZ(duk_intptr_t); - DUK__DUMPSZ(duk_uintmax_t); - DUK__DUMPSZ(duk_intmax_t); - DUK__DUMPSZ(duk_double_t); - - /* important chosen base types */ - DUK__DUMPSZ(duk_int_t); - DUK__DUMPSZ(duk_uint_t); - DUK__DUMPSZ(duk_int_fast_t); - DUK__DUMPSZ(duk_uint_fast_t); - DUK__DUMPSZ(duk_small_int_t); - DUK__DUMPSZ(duk_small_uint_t); - DUK__DUMPSZ(duk_small_int_fast_t); - DUK__DUMPSZ(duk_small_uint_fast_t); - - /* some derived types */ - DUK__DUMPSZ(duk_codepoint_t); - DUK__DUMPSZ(duk_ucodepoint_t); - DUK__DUMPSZ(duk_idx_t); - DUK__DUMPSZ(duk_errcode_t); - DUK__DUMPSZ(duk_uarridx_t); - - /* tval */ - DUK__DUMPSZ(duk_double_union); - DUK__DUMPSZ(duk_tval); - - /* structs from duk_forwdecl.h */ - DUK__DUMPSZ(duk_jmpbuf); /* just one 'int' for C++ exceptions */ - DUK__DUMPSZ(duk_heaphdr); - DUK__DUMPSZ(duk_heaphdr_string); - DUK__DUMPSZ(duk_hstring); - DUK__DUMPSZ(duk_hstring_external); - DUK__DUMPSZ(duk_hobject); - DUK__DUMPSZ(duk_hcompiledfunction); - DUK__DUMPSZ(duk_hnativefunction); - DUK__DUMPSZ(duk_hthread); - DUK__DUMPSZ(duk_hbuffer); - DUK__DUMPSZ(duk_hbuffer_fixed); - DUK__DUMPSZ(duk_hbuffer_dynamic); - DUK__DUMPSZ(duk_hbuffer_external); - DUK__DUMPSZ(duk_propaccessor); - DUK__DUMPSZ(duk_propvalue); - DUK__DUMPSZ(duk_propdesc); - DUK__DUMPSZ(duk_heap); -#if defined(DUK_USE_STRTAB_CHAIN) - DUK__DUMPSZ(duk_strtab_entry); -#endif - DUK__DUMPSZ(duk_activation); - DUK__DUMPSZ(duk_catcher); - DUK__DUMPSZ(duk_strcache); - DUK__DUMPSZ(duk_ljstate); - DUK__DUMPSZ(duk_fixedbuffer); - DUK__DUMPSZ(duk_bitdecoder_ctx); - DUK__DUMPSZ(duk_bitencoder_ctx); - DUK__DUMPSZ(duk_token); - DUK__DUMPSZ(duk_re_token); - DUK__DUMPSZ(duk_lexer_point); - DUK__DUMPSZ(duk_lexer_ctx); - DUK__DUMPSZ(duk_compiler_instr); - DUK__DUMPSZ(duk_compiler_func); - DUK__DUMPSZ(duk_compiler_ctx); - DUK__DUMPSZ(duk_re_matcher_ctx); - DUK__DUMPSZ(duk_re_compiler_ctx); -} -DUK_LOCAL void duk__dump_type_limits(void) { - DUK_D(DUK_DPRINT("limits")); - - /* basic types */ - DUK__DUMPLM_SIGNED(INT8); - DUK__DUMPLM_UNSIGNED(UINT8); - DUK__DUMPLM_SIGNED(INT_FAST8); - DUK__DUMPLM_UNSIGNED(UINT_FAST8); - DUK__DUMPLM_SIGNED(INT_LEAST8); - DUK__DUMPLM_UNSIGNED(UINT_LEAST8); - DUK__DUMPLM_SIGNED(INT16); - DUK__DUMPLM_UNSIGNED(UINT16); - DUK__DUMPLM_SIGNED(INT_FAST16); - DUK__DUMPLM_UNSIGNED(UINT_FAST16); - DUK__DUMPLM_SIGNED(INT_LEAST16); - DUK__DUMPLM_UNSIGNED(UINT_LEAST16); - DUK__DUMPLM_SIGNED(INT32); - DUK__DUMPLM_UNSIGNED(UINT32); - DUK__DUMPLM_SIGNED(INT_FAST32); - DUK__DUMPLM_UNSIGNED(UINT_FAST32); - DUK__DUMPLM_SIGNED(INT_LEAST32); - DUK__DUMPLM_UNSIGNED(UINT_LEAST32); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPLM_SIGNED(INT64); - DUK__DUMPLM_UNSIGNED(UINT64); - DUK__DUMPLM_SIGNED(INT_FAST64); - DUK__DUMPLM_UNSIGNED(UINT_FAST64); - DUK__DUMPLM_SIGNED(INT_LEAST64); - DUK__DUMPLM_UNSIGNED(UINT_LEAST64); -#endif - DUK__DUMPLM_SIGNED(INTPTR); - DUK__DUMPLM_UNSIGNED(UINTPTR); - DUK__DUMPLM_SIGNED(INTMAX); - DUK__DUMPLM_UNSIGNED(UINTMAX); - - /* derived types */ - DUK__DUMPLM_SIGNED(INT); - DUK__DUMPLM_UNSIGNED(UINT); - DUK__DUMPLM_SIGNED(INT_FAST); - DUK__DUMPLM_UNSIGNED(UINT_FAST); - DUK__DUMPLM_SIGNED(SMALL_INT); - DUK__DUMPLM_UNSIGNED(SMALL_UINT); - DUK__DUMPLM_SIGNED(SMALL_INT_FAST); - DUK__DUMPLM_UNSIGNED(SMALL_UINT_FAST); -} -#undef DUK__DUMPSZ -#undef DUK__DUMPLM_SIGNED_RAW -#undef DUK__DUMPLM_UNSIGNED_RAW -#undef DUK__DUMPLM_SIGNED -#undef DUK__DUMPLM_UNSIGNED - -DUK_LOCAL void duk__dump_misc_options(void) { - DUK_D(DUK_DPRINT("DUK_VERSION: %ld", (long) DUK_VERSION)); - DUK_D(DUK_DPRINT("DUK_GIT_DESCRIBE: %s", DUK_GIT_DESCRIBE)); - DUK_D(DUK_DPRINT("OS string: %s", DUK_USE_OS_STRING)); - DUK_D(DUK_DPRINT("architecture string: %s", DUK_USE_ARCH_STRING)); - DUK_D(DUK_DPRINT("compiler string: %s", DUK_USE_COMPILER_STRING)); -#if defined(DUK_USE_PACKED_TVAL) - DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: yes")); -#else - DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: no")); -#endif -#if defined(DUK_USE_VARIADIC_MACROS) - DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: yes")); -#else - DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: no")); -#endif -#if defined(DUK_USE_INTEGER_LE) - DUK_D(DUK_DPRINT("integer endianness: little")); -#elif defined(DUK_USE_INTEGER_ME) - DUK_D(DUK_DPRINT("integer endianness: mixed")); -#elif defined(DUK_USE_INTEGER_BE) - DUK_D(DUK_DPRINT("integer endianness: big")); -#else - DUK_D(DUK_DPRINT("integer endianness: ???")); -#endif -#if defined(DUK_USE_DOUBLE_LE) - DUK_D(DUK_DPRINT("IEEE double endianness: little")); -#elif defined(DUK_USE_DOUBLE_ME) - DUK_D(DUK_DPRINT("IEEE double endianness: mixed")); -#elif defined(DUK_USE_DOUBLE_BE) - DUK_D(DUK_DPRINT("IEEE double endianness: big")); -#else - DUK_D(DUK_DPRINT("IEEE double endianness: ???")); -#endif -} -#endif /* DUK_USE_DEBUG */ - -DUK_INTERNAL -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_heap *res = NULL; - - /* Silence a few global unused warnings here. */ - DUK_UNREF(duk_str_unsupported); - - DUK_D(DUK_DPRINT("allocate heap")); - - /* - * Debug dump type sizes - */ - -#if defined(DUK_USE_DEBUG) - duk__dump_misc_options(); - duk__dump_type_sizes(); - duk__dump_type_limits(); -#endif - - /* - * If selftests enabled, run them as early as possible - */ -#if defined(DUK_USE_SELF_TESTS) - DUK_D(DUK_DPRINT("running self tests")); - duk_selftest_run_tests(); - DUK_D(DUK_DPRINT("self tests passed")); -#endif - - /* - * Computed values (e.g. INFINITY) - */ - -#if defined(DUK_USE_COMPUTED_NAN) - do { - /* Workaround for some exotic platforms where NAN is missing - * and the expression (0.0 / 0.0) does NOT result in a NaN. - * Such platforms use the global 'duk_computed_nan' which must - * be initialized at runtime. Use 'volatile' to ensure that - * the compiler will actually do the computation and not try - * to do constant folding which might result in the original - * problem. - */ - volatile double dbl1 = 0.0; - volatile double dbl2 = 0.0; - duk_computed_nan = dbl1 / dbl2; - } while (0); -#endif - -#if defined(DUK_USE_COMPUTED_INFINITY) - do { - /* Similar workaround for INFINITY. */ - volatile double dbl1 = 1.0; - volatile double dbl2 = 0.0; - duk_computed_infinity = dbl1 / dbl2; - } while (0); -#endif - - /* - * Allocate heap struct - * - * Use a raw call, all macros expect the heap to be initialized - */ - - res = (duk_heap *) alloc_func(heap_udata, sizeof(duk_heap)); - if (!res) { - goto error; - } - - /* - * Zero the struct, and start initializing roughly in order - */ - - DUK_MEMZERO(res, sizeof(*res)); - - /* explicit NULL inits */ -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->heap_udata = NULL; - res->heap_allocated = NULL; -#if defined(DUK_USE_REFERENCE_COUNTING) - res->refzero_list = NULL; - res->refzero_list_tail = NULL; -#endif -#if defined(DUK_USE_MARK_AND_SWEEP) - res->finalize_list = NULL; -#endif - res->heap_thread = NULL; - res->curr_thread = NULL; - res->heap_object = NULL; -#if defined(DUK_USE_STRTAB_CHAIN) - /* nothing to NULL */ -#elif defined(DUK_USE_STRTAB_PROBE) -#if defined(DUK_USE_HEAPPTR16) - res->strtable16 = (duk_uint16_t *) NULL; -#else - res->strtable = (duk_hstring **) NULL; -#endif -#endif -#if defined(DUK_USE_ROM_STRINGS) - /* no res->strs[] */ -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) - /* res->strs16[] is zeroed and zero decodes to NULL, so no NULL inits. */ -#else - { - duk_small_uint_t i; - for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { - res->strs[i] = NULL; - } - } -#endif -#endif /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - res->dbg_read_cb = NULL; - res->dbg_write_cb = NULL; - res->dbg_peek_cb = NULL; - res->dbg_read_flush_cb = NULL; - res->dbg_write_flush_cb = NULL; - res->dbg_request_cb = NULL; - res->dbg_udata = NULL; - res->dbg_step_thread = NULL; -#endif -#endif /* DUK_USE_EXPLICIT_NULL_INIT */ - - res->alloc_func = alloc_func; - res->realloc_func = realloc_func; - res->free_func = free_func; - res->heap_udata = heap_udata; - res->fatal_func = fatal_func; - -#if defined(DUK_USE_HEAPPTR16) - /* XXX: zero assumption */ - res->heapptr_null16 = DUK_USE_HEAPPTR_ENC16(res->heap_udata, (void *) NULL); - res->heapptr_deleted16 = DUK_USE_HEAPPTR_ENC16(res->heap_udata, (void *) DUK_STRTAB_DELETED_MARKER(res)); -#endif - - /* res->mark_and_sweep_trigger_counter == 0 -> now causes immediate GC; which is OK */ - - res->call_recursion_depth = 0; - res->call_recursion_limit = DUK_USE_NATIVE_CALL_RECLIMIT; - - /* XXX: use the pointer as a seed for now: mix in time at least */ - - /* The casts through duk_intr_pt is to avoid the following GCC warning: - * - * warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] - * - * This still generates a /Wp64 warning on VS2010 when compiling for x86. - */ -#if defined(DUK_USE_ROM_STRINGS) - /* XXX: make a common DUK_USE_ option, and allow custom fixed seed? */ - DUK_D(DUK_DPRINT("using rom strings, force heap hash_seed to fixed value 0x%08lx", (long) DUK__FIXED_HASH_SEED)); - res->hash_seed = (duk_uint32_t) DUK__FIXED_HASH_SEED; -#else /* DUK_USE_ROM_STRINGS */ - res->hash_seed = (duk_uint32_t) (duk_intptr_t) res; - res->rnd_state = (duk_uint32_t) (duk_intptr_t) res; -#if !defined(DUK_USE_STRHASH_DENSE) - res->hash_seed ^= 5381; /* Bernstein hash init value is normally 5381; XOR it in in case pointer low bits are 0 */ -#endif -#endif /* DUK_USE_ROM_STRINGS */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->lj.jmpbuf_ptr = NULL; -#endif - DUK_ASSERT(res->lj.type == DUK_LJ_TYPE_UNKNOWN); /* zero */ - - DUK_TVAL_SET_UNDEFINED(&res->lj.value1); - DUK_TVAL_SET_UNDEFINED(&res->lj.value2); - -#if (DUK_STRTAB_INITIAL_SIZE < DUK_UTIL_MIN_HASH_PRIME) -#error initial heap stringtable size is defined incorrectly -#endif - - /* - * Init stringtable: fixed variant - */ - -#if defined(DUK_USE_STRTAB_CHAIN) - DUK_MEMZERO(res->strtable, sizeof(duk_strtab_entry) * DUK_STRTAB_CHAIN_SIZE); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - { - duk_small_uint_t i; - for (i = 0; i < DUK_STRTAB_CHAIN_SIZE; i++) { -#if defined(DUK_USE_HEAPPTR16) - res->strtable[i].u.str16 = res->heapptr_null16; -#else - res->strtable[i].u.str = NULL; -#endif - } - } -#endif /* DUK_USE_EXPLICIT_NULL_INIT */ -#endif /* DUK_USE_STRTAB_CHAIN */ - - /* - * Init stringtable: probe variant - */ - -#if defined(DUK_USE_STRTAB_PROBE) -#if defined(DUK_USE_HEAPPTR16) - res->strtable16 = (duk_uint16_t *) alloc_func(heap_udata, sizeof(duk_uint16_t) * DUK_STRTAB_INITIAL_SIZE); - if (!res->strtable16) { - goto error; - } -#else /* DUK_USE_HEAPPTR16 */ - res->strtable = (duk_hstring **) alloc_func(heap_udata, sizeof(duk_hstring *) * DUK_STRTAB_INITIAL_SIZE); - if (!res->strtable) { - goto error; - } -#endif /* DUK_USE_HEAPPTR16 */ - res->st_size = DUK_STRTAB_INITIAL_SIZE; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - { - duk_small_uint_t i; - DUK_ASSERT(res->st_size == DUK_STRTAB_INITIAL_SIZE); - for (i = 0; i < DUK_STRTAB_INITIAL_SIZE; i++) { -#if defined(DUK_USE_HEAPPTR16) - res->strtable16[i] = res->heapptr_null16; -#else - res->strtable[i] = NULL; -#endif - } - } -#else /* DUK_USE_EXPLICIT_NULL_INIT */ -#if defined(DUK_USE_HEAPPTR16) - DUK_MEMZERO(res->strtable16, sizeof(duk_uint16_t) * DUK_STRTAB_INITIAL_SIZE); -#else - DUK_MEMZERO(res->strtable, sizeof(duk_hstring *) * DUK_STRTAB_INITIAL_SIZE); -#endif -#endif /* DUK_USE_EXPLICIT_NULL_INIT */ -#endif /* DUK_USE_STRTAB_PROBE */ - - /* - * Init stringcache - */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - { - duk_small_uint_t i; - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - res->strcache[i].h = NULL; - } - } -#endif - - /* XXX: error handling is incomplete. It would be cleanest if - * there was a setjmp catchpoint, so that all init code could - * freely throw errors. If that were the case, the return code - * passing here could be removed. - */ - - /* - * Init built-in strings - */ - - DUK_DD(DUK_DDPRINT("HEAP: INIT STRINGS")); - if (!duk__init_heap_strings(res)) { - goto error; - } - - /* - * Init the heap thread - */ - - DUK_DD(DUK_DDPRINT("HEAP: INIT HEAP THREAD")); - if (!duk__init_heap_thread(res)) { - goto error; - } - - /* - * Init the heap object - */ - - DUK_DD(DUK_DDPRINT("HEAP: INIT HEAP OBJECT")); - DUK_ASSERT(res->heap_thread != NULL); - res->heap_object = duk_hobject_alloc(res, DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT)); - if (!res->heap_object) { - goto error; - } - DUK_HOBJECT_INCREF(res->heap_thread, res->heap_object); - - /* - * All done - */ - - DUK_D(DUK_DPRINT("allocated heap: %p", (void *) res)); - return res; - - error: - DUK_D(DUK_DPRINT("heap allocation failed")); - - if (res) { - /* assumes that allocated pointers and alloc funcs are valid - * if res exists - */ - DUK_ASSERT(res->alloc_func != NULL); - DUK_ASSERT(res->realloc_func != NULL); - DUK_ASSERT(res->free_func != NULL); - duk_heap_free(res); - } - return NULL; -} - -#undef DUK__BITPACK_LETTER_LIMIT -#undef DUK__BITPACK_UNDERSCORE -#undef DUK__BITPACK_FF -#undef DUK__BITPACK_SWITCH1 -#undef DUK__BITPACK_SWITCH -#undef DUK__BITPACK_SEVENBIT -#undef DUK__FIXED_HASH_SEED