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
|