7#if defined(DUK_USE_STRTAB_PROBE)
8#define DUK__HASH_INITIAL(hash,h_size) DUK_STRTAB_HASH_INITIAL((hash),(h_size))
9#define DUK__HASH_PROBE_STEP(hash) DUK_STRTAB_HASH_PROBE_STEP((hash))
10#define DUK__DELETED_MARKER(heap) DUK_STRTAB_DELETED_MARKER((heap))
13#if defined(DUK_USE_MARK_AND_SWEEP)
14#define DUK__PREVENT_MS_SIDE_EFFECTS(heap) do { \
15 (heap)->mark_and_sweep_base_flags |= \
16 DUK_MS_FLAG_NO_STRINGTABLE_RESIZE | \
17 DUK_MS_FLAG_NO_FINALIZERS | \
18 DUK_MS_FLAG_NO_OBJECT_COMPACTION; \
33 const duk_uint8_t *str,
36 const duk_uint8_t *extdata) {
43#if defined(DUK_USE_STRLEN16)
45 if (blen > 0xffffUL) {
46 DUK_D(
DUK_DPRINT(
"16-bit string blen/clen active and blen over 16 bits, reject intern"));
58#if defined(DUK_USE_EXPLICIT_NULL_INIT)
72#if defined(DUK_USE_EXPLICIT_NULL_INIT)
77 data = (duk_uint8_t *) (res + 1);
79 data[blen] = (duk_uint8_t) 0;
95 if (blen > 0 && str[0] == (duk_uint8_t) 0xff) {
104#if defined(DUK_USE_HSTRING_CLEN)
117 DUK_DDD(
DUK_DDDPRINT(
"interned string, hash=0x%08lx, blen=%ld, clen=%ld, has_arridx=%ld, has_extdata=%ld",
144#if defined(DUK_USE_STRTAB_CHAIN)
146#if defined(DUK_USE_HEAPPTR16)
151 duk_uint16_t *new_lst;
153 duk_uint16_t null16 = heap->heapptr_null16;
154 duk_uint16_t h16 = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) h);
164 if (e->
u.str16 == null16) {
168 lst = (duk_uint16_t *)
DUK_ALLOC(heap,
sizeof(duk_uint16_t) * 2);
174 e->
u.strlist16 = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) lst);
179 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
181 for (i = 0, n = e->
listlen; i < n; i++) {
182 if (lst[i] == null16) {
193 new_lst = (duk_uint16_t *)
DUK_REALLOC(heap, lst,
sizeof(duk_uint16_t) * (e->
listlen + 1));
194 if (new_lst ==
NULL) {
198 e->
u.strlist16 = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) new_lst);
234 for (i = 0, n = e->
listlen; i < n; i++) {
235 if (lst[i] ==
NULL) {
247 if (new_lst ==
NULL) {
257#if defined(DUK_USE_HEAPPTR16)
258DUK_LOCAL duk_hstring *duk__find_matching_string_chain(
duk_heap *heap,
const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) {
263 duk_uint16_t null16 = heap->heapptr_null16;
272 if (e->
u.str16 != null16) {
282 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
284 for (i = 0, n = e->
listlen; i < n; i++) {
285 if (lst[i] != null16) {
299DUK_LOCAL duk_hstring *duk__find_matching_string_chain(
duk_heap *heap,
const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) {
320 for (i = 0, n = e->
listlen; i < n; i++) {
321 if (lst[i] !=
NULL &&
333#if defined(DUK_USE_HEAPPTR16)
340 duk_uint16_t null16 = heap->heapptr_null16;
349 h16 = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) h);
353 if (e->
u.str16 == h16) {
359 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
361 for (i = 0, n = e->
listlen; i < n; i++) {
369 DUK_D(
DUK_DPRINT(
"failed to find string that should be in stringtable"));
396 for (i = 0, n = e->
listlen; i < n; i++) {
405 DUK_D(
DUK_DPRINT(
"failed to find string that should be in stringtable"));
411#if defined(DUK_USE_DEBUG)
416#if defined(DUK_USE_HEAPPTR16)
418 duk_uint16_t null16 = heap->heapptr_null16;
429#if defined(DUK_USE_HEAPPTR16)
430 DUK_DD(
DUK_DDPRINT(
"[%03d] -> plain %d", (
int) i, (
int) (e->
u.str16 != null16 ? 1 : 0)));
436#if defined(DUK_USE_HEAPPTR16)
437 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
442 for (j = 0, n = e->
listlen; j < n; j++) {
443#if defined(DUK_USE_HEAPPTR16)
444 if (lst[j] != null16) {
446 if (lst[j] !=
NULL) {
466#if defined(DUK_USE_STRTAB_PROBE)
472#if defined(DUK_USE_HEAPPTR16)
473 duk_uint16_t null16 = heap->heapptr_null16;
474 duk_uint16_t deleted16 = heap->heapptr_deleted16;
478 for (i = 0; i < n; i++) {
479#if defined(DUK_USE_HEAPPTR16)
480 if (heap->strtable16[i] != null16 && heap->strtable16[i] != deleted16) {
490#if defined(DUK_USE_HEAPPTR16)
497#if defined(DUK_USE_HEAPPTR16)
498 duk_uint16_t null16 = heap->heapptr_null16;
499 duk_uint16_t deleted16 = heap->heapptr_deleted16;
507#if defined(DUK_USE_HEAPPTR16)
508 duk_uint16_t e16 = entries16[i];
513#if defined(DUK_USE_HEAPPTR16)
522#if defined(DUK_USE_HEAPPTR16)
523 entries16[i] = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) h);
529#if defined(DUK_USE_HEAPPTR16)
530 }
else if (e16 == deleted16) {
536#if defined(DUK_USE_HEAPPTR16)
537 entries16[i] = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) h);
544 i = (i + step) % size;
551#if defined(DUK_USE_HEAPPTR16)
565#if defined(DUK_USE_HEAPPTR16)
577 (
long) i, (
long) step, (
long) size));
582 (
long) i, (
long) step, (
long) size));
583 i = (i + step) % size;
591#if defined(DUK_USE_HEAPPTR16)
599#if defined(DUK_USE_HEAPPTR16)
600 duk_uint16_t null16 = heap->heapptr_null16;
601 duk_uint16_t h16 = DUK_USE_HEAPPTR_ENC16(heap->
heap_udata, (
void *) h);
610#if defined(DUK_USE_HEAPPTR16)
611 duk_uint16_t e16 = entries16[i];
616#if defined(DUK_USE_HEAPPTR16)
624#if defined(DUK_USE_HEAPPTR16)
631#if defined(DUK_USE_HEAPPTR16)
632 entries16[i] = heap->heapptr_deleted16;
640 i = (i + step) % size;
648#if defined(DUK_USE_DEBUG)
649 duk_uint32_t old_used = heap->
st_used;
651 duk_uint32_t old_size = heap->
st_size;
652#if defined(DUK_USE_HEAPPTR16)
653 duk_uint16_t *old_entries = heap->strtable16;
654 duk_uint16_t *new_entries =
NULL;
659 duk_uint32_t new_used = 0;
662#if defined(DUK_USE_DEBUG)
666#ifdef DUK_USE_DDDPRINT
667 DUK_DDD(
DUK_DDDPRINT(
"attempt to resize stringtable: %ld entries, %ld bytes, %ld used, %ld%% load -> %ld entries, %ld bytes, %ld used, %ld%% load",
668 (
long) old_size, (
long) (
sizeof(
duk_hstring *) * old_size), (
long) old_used,
669 (
long) (((
double) old_used) / ((
double) old_size) * 100.0),
684#if defined(DUK_USE_MARK_AND_SWEEP)
690#if defined(DUK_USE_HEAPPTR16)
691 new_entries = (duk_uint16_t *)
DUK_ALLOC(heap,
sizeof(duk_uint16_t) * new_size);
700#if defined(DUK_USE_EXPLICIT_NULL_INIT)
701 for (i = 0; i < new_size; i++) {
702#if defined(DUK_USE_HEAPPTR16)
703 new_entries[i] = heap->heapptr_null16;
705 new_entries[i] =
NULL;
709#if defined(DUK_USE_HEAPPTR16)
711 DUK_MEMZERO(new_entries,
sizeof(duk_uint16_t) * new_size);
718 for (i = 0; i < old_size; i++) {
721#if defined(DUK_USE_HEAPPTR16)
733#ifdef DUK_USE_DDPRINT
734 DUK_DD(
DUK_DDPRINT(
"resized stringtable: %ld entries, %ld bytes, %ld used, %ld%% load -> %ld entries, %ld bytes, %ld used, %ld%% load",
735 (
long) old_size, (
long) (
sizeof(
duk_hstring *) * old_size), (
long) old_used,
736 (
long) (((
double) old_used) / ((
double) old_size) * 100.0),
737 (
long) new_size, (
long) (
sizeof(
duk_hstring *) * new_size), (
long) new_used,
738 (
long) (((
double) new_used) / ((
double) new_size) * 100.0)));
741#if defined(DUK_USE_HEAPPTR16)
743 heap->strtable16 = new_entries;
759 duk_uint32_t new_size;
763 if (new_size >= 0x80000000UL) {
781 duk_uint32_t new_free;
786 new_free = heap->
st_size - new_used;
794 if (new_free <= tmp1 || new_used <= tmp2) {
802#if defined(DUK_USE_DEBUG)
808#if defined(DUK_USE_HEAPPTR16)
815 for (i = 0; i < heap->
st_size; i++) {
816#if defined(DUK_USE_HEAPPTR16)
817 h = (
duk_hstring *) DUK_USE_HEAPPTR_DEC16(heap->strtable16[i]);
835 const duk_uint8_t *extdata;
836#if defined(DUK_USE_MARK_AND_SWEEP)
845#if defined(DUK_USE_MARK_AND_SWEEP)
851#if defined(DUK_USE_STRTAB_PROBE)
862 for (i = 0; i < blen; i++) {
863 duk_uint8_t x = str[i];
864 if (x >= 0x20 && x <= 0x7e && x !=
'"' && x !=
'\\') {
874#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)
877 extdata = (
const duk_uint8_t *)
NULL;
884#if defined(DUK_USE_STRTAB_CHAIN)
885 if (duk__insert_hstring_chain(heap, res)) {
890#elif defined(DUK_USE_STRTAB_PROBE)
893#
if defined(DUK_USE_HEAPPTR16)
902#error internal error, invalid strtab options
911#if defined(DUK_USE_MARK_AND_SWEEP)
928#if defined(DUK_USE_ROM_STRINGS)
939 DUK_DD(
DUK_DDPRINT(
"intern check: rom string: %!O, computed hash 0x%08lx, rom hash 0x%08lx",
949#if defined(DUK_USE_STRTAB_CHAIN)
950 res = duk__find_matching_string_chain(heap, str, blen, *out_strhash);
951#elif defined(DUK_USE_STRTAB_PROBE)
953#
if defined(DUK_USE_HEAPPTR16)
963#error internal error, invalid strtab options
975 duk_uint32_t strhash;
982 duk_uint32_t strhash;
1007 DUK_SNPRINTF(buf,
sizeof(buf),
"%lu", (
unsigned long) val);
1008 buf[
sizeof(buf) - 1] = (
char) 0;
1010 return duk_heap_string_lookup(heap, (
const duk_uint8_t *) buf, (duk_uint32_t)
DUK_STRLEN(buf));
1016 DUK_SNPRINTF(buf,
sizeof(buf),
"%lu", (
unsigned long) val);
1017 buf[
sizeof(buf) - 1] = (
char) 0;
1031#if defined(DUK_USE_REFERENCE_COUNTING)
1035#if defined(DUK_USE_STRTAB_CHAIN)
1036 duk__remove_matching_hstring_chain(heap, h);
1037#elif defined(DUK_USE_STRTAB_PROBE)
1039#
if defined(DUK_USE_HEAPPTR16)
1047#error internal error, invalid strtab options
1052#if defined(DUK_USE_MARK_AND_SWEEP) && defined(DUK_USE_MS_STRINGTABLE_RESIZE)
1065#if defined(DUK_USE_STRTAB_CHAIN)
1067#elif defined(DUK_USE_STRTAB_PROBE)
1075#if defined(DUK_USE_STRTAB_CHAIN)
1082#if defined(DUK_USE_HEAPPTR16)
1084 duk_uint16_t null16 = heap->heapptr_null16;
1093#if defined(DUK_USE_HEAPPTR16)
1094 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
1100 for (j = 0; j < e->
listlen; j++) {
1101#if defined(DUK_USE_HEAPPTR16)
1102 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, lst[j]);
1114#if defined(DUK_USE_HEAPPTR16)
1115 e->
u.strlist16 = null16;
1121#if defined(DUK_USE_HEAPPTR16)
1122 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.str16);
1123 e->
u.str16 = null16;
1138#if defined(DUK_USE_STRTAB_PROBE)
1143#if defined(DUK_USE_HEAPPTR16)
1144 if (heap->strtable16) {
1149#if defined(DUK_USE_HEAPPTR16)
1166#if defined(DUK_USE_HEAPPTR16)
1179#undef DUK__HASH_INITIAL
1180#undef DUK__HASH_PROBE_STEP
1181#undef DUK__DELETED_MARKER
#define DUK_UNREACHABLE()
unsigned int duk_small_uint_t
#define DUK_LOSE_CONST(src)
duk_int_fast32_t duk_int_t
#define DUK_MEMZERO(p, n)
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
#define DUK_MS_FLAG_NO_OBJECT_COMPACTION
#define DUK_STRTAB_DELETED_MARKER(heap)
#define DUK_HSTRING_HAS_ASCII(x)
#define DUK_HSTRING_GET_DATA(x)
DUK_INTERNAL_DECL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen)
#define DUK_ALLOC(heap, size)
#define DUK_HEAPHDR_STRING_INIT_NULLS(h)
#define DUK_STRTAB_MIN_USED_DIVISOR
#define DUK_STRTAB_MIN_FREE_DIVISOR
#define DUK_HSTRING_GET_CHARLEN(x)
#define DUK_HSTRING_GET_HASH(x)
#define DUK_FREE(heap, ptr)
DUK_INTERNAL_DECL void duk_free_hstring_inner(duk_heap *heap, duk_hstring *h)
#define DUK_MS_FLAG_NO_FINALIZERS
#define DUK_ERROR_ALLOC_DEFMSG(thr)
#define DUK_HSTRING_HAS_EXTDATA(x)
#define DUK_STRTAB_HIGHEST_32BIT_PRIME
DUK_INTERNAL_DECL duk_small_int_t duk_js_to_arrayindex_raw_string(const duk_uint8_t *str, duk_uint32_t blen, duk_uarridx_t *out_idx)
#define DUK_HSTRING_GET_BYTELEN(x)
#define DUK_STRTAB_GROW_ST_SIZE(n)
#define DUK_STRTAB_CHAIN_SIZE
#define DUK_HSTRING_SET_CHARLEN(x, v)
#define DUK_HSTRING_FLAG_EXTDATA
#define DUK_HSTRING_MAX_BYTELEN
#define DUK_MS_FLAG_NO_STRINGTABLE_RESIZE
#define DUK_HSTRING_SET_HASH(x, v)
#define DUK_HSTRING_SET_ARRIDX(x)
#define DUK_HSTRING_HAS_INTERNAL(x)
#define DUK_HSTRING_SET_ASCII(x)
#define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h, tval, fval)
#define DUK_HSTRING_HAS_ARRIDX(x)
DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len)
#define DUK_HSTRING_SET_INTERNAL(x)
#define DUK_REALLOC(heap, ptr, newsize)
#define DUK_HSTRING_SET_BYTELEN(x, v)
#define DUK_STRTAB_U32_MAX_STRLEN
DUK_INTERNAL_DECL duk_uint32_t duk_util_get_hash_prime(duk_uint32_t size)
DUK_LOCAL duk_bool_t duk__recheck_strtab_size_probe(duk_heap *heap, duk_uint32_t new_used)
DUK_LOCAL void duk__insert_hstring_probe(duk_heap *heap, duk_hstring **entries, duk_uint32_t size, duk_uint32_t *p_used, duk_hstring *h)
DUK_LOCAL duk_hstring * duk__alloc_init_hstring(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash, const duk_uint8_t *extdata)
DUK_LOCAL duk_hstring * duk__do_lookup(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t *out_strhash)
#define DUK__DELETED_MARKER(heap)
DUK_INTERNAL duk_hstring * duk_heap_string_intern_u32(duk_heap *heap, duk_uint32_t val)
DUK_LOCAL duk_bool_t duk__resize_strtab_probe(duk_heap *heap)
DUK_INTERNAL duk_hstring * duk_heap_string_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen)
#define DUK__HASH_INITIAL(hash, h_size)
DUK_LOCAL duk_bool_t duk__resize_strtab_raw_probe(duk_heap *heap, duk_uint32_t new_size)
#define DUK__HASH_PROBE_STEP(hash)
DUK_INTERNAL duk_hstring * duk_heap_string_intern_u32_checked(duk_hthread *thr, duk_uint32_t val)
#define DUK__PREVENT_MS_SIDE_EFFECTS(heap)
DUK_INTERNAL void duk_heap_string_remove(duk_heap *heap, duk_hstring *h)
DUK_LOCAL duk_int_t duk__count_used_probe(duk_heap *heap)
DUK_LOCAL void duk__remove_matching_hstring_probe(duk_heap *heap, duk_hstring **entries, duk_uint32_t size, duk_hstring *h)
DUK_LOCAL duk_hstring * duk__find_matching_string_probe(duk_heap *heap, duk_hstring **entries, duk_uint32_t size, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash)
DUK_LOCAL duk_hstring * duk__do_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash)
DUK_INTERNAL void duk_heap_free_strtab(duk_heap *heap)
DUK_INTERNAL duk_hstring * duk_heap_string_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t blen)
DUK_INTERNAL void duk_heap_force_strtab_resize(duk_heap *heap)
duk_small_uint_t mark_and_sweep_base_flags
union duk_strtab_entry::@21 u