static void duk__dump_stringtable(duk_heap *heap) { duk_uint_fast32_t i; char buf[64+1]; DUK_D(DUK_DPRINT("stringtable %p, used %ld, size %ld, load %ld%%", (void *) heap->st, (long) heap->st_used, (long) heap->st_size, (long) (((double) heap->st_used) / ((double) heap->st_size) * 100.0))); for (i = 0; i < (duk_uint_fast32_t) heap->st_size; i++) { duk_hstring *e = heap->st[i]; if (!e) { DUK_D(DUK_DPRINT(" [%ld]: NULL", (long) i)); } else if (e == DUK_STRTAB_DELETED_MARKER(heap)) { DUK_D(DUK_DPRINT(" [%ld]: DELETED", (long) i)); } else { duk__sanitize_snippet(buf, sizeof(buf), e); #ifdef DUK_USE_REFERENCE_COUNTING DUK_D(DUK_DPRINT(" [%ld]: %p (flags: 0x%08lx, ref: %ld) '%s', strhash=0x%08lx, blen=%ld, clen=%ld, " "arridx=%ld, internal=%ld, reserved_word=%ld, strict_reserved_word=%ld, eval_or_arguments=%ld", (long) i, (void *) e, (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) e), (long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) e), (const char *) buf, (unsigned long) e->hash, (long) e->blen, (long) e->clen, (long) (DUK_HSTRING_HAS_ARRIDX(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_INTERNAL(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_RESERVED_WORD(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(e) ? 1 : 0))); #else DUK_D(DUK_DPRINT(" [%ld]: %p (flags: 0x%08lx) '%s', strhash=0x%08lx, blen=%ld, clen=%ld, " "arridx=%ld, internal=%ld, reserved_word=%ld, strict_reserved_word=%ld, eval_or_arguments=%ld", (long) i, (void *) e, (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) e), (const char *) buf, (long) e->hash, (long) e->blen, (long) e->clen, (long) (DUK_HSTRING_HAS_ARRIDX(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_INTERNAL(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_RESERVED_WORD(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(e) ? 1 : 0), (long) (DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(e) ? 1 : 0))); #endif } } }
static void dump_stringtable(duk_heap *heap) { duk_uint32_t i; char buf[64+1]; DUK_DPRINT("stringtable %p, used %d, size %d, load %d%%", (void *) heap->st, (int) heap->st_used, (int) heap->st_size, (int) (((double) heap->st_used) / ((double) heap->st_size) * 100.0)); for (i = 0; i < heap->st_size; i++) { duk_hstring *e = heap->st[i]; if (!e) { DUK_DPRINT(" [%d]: NULL", i); } else if (e == DUK_STRTAB_DELETED_MARKER(heap)) { DUK_DPRINT(" [%d]: DELETED", i); } else { sanitize_snippet(buf, sizeof(buf), e); /* FIXME: all string flags not printed now */ #ifdef DUK_USE_REFERENCE_COUNTING DUK_DPRINT(" [%d]: %p (flags: 0x%08x, ref: %d) '%s', strhash=0x%08x, blen=%d, clen=%d, arridx=%d, internal=%d", i, (void *) e, (int) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) e), (int) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) e), buf, (int) e->hash, (int) e->blen, (int) e->clen, DUK_HSTRING_HAS_ARRIDX(e) ? 1 : 0, DUK_HSTRING_HAS_INTERNAL(e) ? 1 : 0); #else DUK_DPRINT(" [%d]: %p (flags: 0x%08x) '%s', strhash=0x%08x, blen=%d, clen=%d, arridx=%d, internal=%d", i, (void *) e, (int) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) e), buf, (int) e->hash, (int) e->blen, (int) e->clen, DUK_HSTRING_HAS_ARRIDX(e) ? 1 : 0, DUK_HSTRING_HAS_INTERNAL(e) ? 1 : 0); #endif } } }
DUK_LOCAL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h) { duk_fixedbuffer *fb = st->fb; if (st->heavy) { duk_fb_sprintf(fb, "(%p)", (void *) h); } if (!h) { return; } if (st->binary) { duk_size_t i; duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); for (i = 0; i < (duk_size_t) sizeof(*h); i++) { duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]); } duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); } #if defined(DUK_USE_REFERENCE_COUNTING) /* currently implicitly also DUK_USE_DOUBLE_LINKED_HEAP */ if (st->heavy) { duk_fb_sprintf(fb, "[h_next=%p,h_prev=%p,h_refcount=%lu,h_flags=%08lx,type=%ld," "reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), (void *) DUK_HEAPHDR_GET_PREV(NULL, h), (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(h), (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), (long) DUK_HEAPHDR_GET_TYPE(h), (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); } #else if (st->heavy) { duk_fb_sprintf(fb, "[h_next=%p,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), (long) DUK_HEAPHDR_GET_TYPE(h), (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); } #endif }
static void duk__dump_indented(duk_heaphdr *obj, int index) { #ifdef DUK_USE_REFERENCE_COUNTING DUK_D(DUK_DPRINT(" [%ld]: %p %s (flags: 0x%08lx, ref: %ld) -> %!O", (long) index, (void *) obj, (const char *) duk__get_heap_type_string(obj), (unsigned long) DUK_HEAPHDR_GET_FLAGS(obj), (long) DUK_HEAPHDR_GET_REFCOUNT(obj), (duk_heaphdr *) obj)); #else DUK_D(DUK_DPRINT(" [%ld]: %p %s (flags: 0x%08lx) -> %!O", (long) index, (void *) obj, (const char *) duk__get_heap_type_string(obj), (unsigned long) DUK_HEAPHDR_GET_FLAGS(obj), (duk_heaphdr *) obj)); #endif }
static void dump_indented(duk_heaphdr *obj, int index) { #ifdef DUK_USE_REFERENCE_COUNTING DUK_DPRINT(" [%d]: %p %s (flags: 0x%08x, ref: %d) -> %!O", index, (void *) obj, get_heap_type_string(obj), (int) DUK_HEAPHDR_GET_FLAGS(obj), DUK_HEAPHDR_GET_REFCOUNT(obj), obj); #else DUK_DPRINT(" [%d]: %p %s (flags: 0x%08x) -> %!O", index, (void *) obj, get_heap_type_string(obj), (int) DUK_HEAPHDR_GET_FLAGS(obj), obj); #endif }