52#define DUK__NO_ARRAY_INDEX DUK_HSTRING_NO_ARRAY_INDEX
55#define DUK__HASH_INITIAL(hash,h_size) DUK_HOBJECT_HASH_INITIAL((hash),(h_size))
56#define DUK__HASH_PROBE_STEP(hash) DUK_HOBJECT_HASH_PROBE_STEP((hash))
59#define DUK__HASH_UNUSED DUK_HOBJECT_HASHIDX_UNUSED
60#define DUK__HASH_DELETED DUK_HOBJECT_HASHIDX_DELETED
65#define DUK__VALSTACK_SPACE 10
70#define DUK__VALSTACK_PROXY_LOOKUP 20
109 idx = (duk_uint32_t) dbl;
119#if defined(DUK_USE_FASTINT)
127 t = DUK_TVAL_GET_FASTINT(tv);
128 if ((t & ~0xffffffffULL) != 0) {
136 return (duk_uint32_t) t;
144 duk_uint32_t arr_idx;
173#if defined(DUK_USE_HOBJECT_HASH_PART)
229 return (duk_uint32_t) n;
263 *out_min_size = highest_idx + 1;
317#if defined(DUK_USE_ES6_PROXY)
344 *out_handler = h_handler;
355 *out_target = h_target;
365#if defined(DUK_USE_ES6_PROXY)
392#if defined(DUK_USE_ES6_PROXY)
490 duk_uint32_t new_e_size,
491 duk_uint32_t new_a_size,
492 duk_uint32_t new_h_size,
495#ifdef DUK_USE_MARK_AND_SWEEP
498 duk_uint32_t new_alloc_size;
499 duk_uint32_t new_e_size_adjusted;
503 duk_uint8_t *new_e_f;
506 duk_uint32_t new_e_next;
512 DUK_ASSERT(!abandon_array || new_a_size == 0);
514 DUK_ASSERT(new_h_size == 0 || new_h_size >= new_e_size);
524#ifdef DUK_USE_ASSERTIONS
537#if defined(DUK_USE_HOBJECT_LAYOUT_2) || defined(DUK_USE_HOBJECT_LAYOUT_3)
538 DUK_DDD(
DUK_DDDPRINT(
"using layout 2 or 3, no need to pad e_size: %ld", (
long) new_e_size));
539 new_e_size_adjusted = new_e_size;
540#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && (DUK_HOBJECT_ALIGN_TARGET == 1)
541 DUK_DDD(
DUK_DDDPRINT(
"using layout 1, but no need to pad e_size: %ld", (
long) new_e_size));
542 new_e_size_adjusted = new_e_size;
543#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && ((DUK_HOBJECT_ALIGN_TARGET == 4) || (DUK_HOBJECT_ALIGN_TARGET == 8))
545 DUK_DDD(
DUK_DDDPRINT(
"using layout 1, and alignment target is %ld, adjusted e_size: %ld -> %ld",
547 DUK_ASSERT(new_e_size_adjusted >= new_e_size);
549#error invalid hobject layout defines
556 DUK_DDD(
DUK_DDDPRINT(
"attempt to resize hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to "
557 "{e_size=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld",
568 (
long) new_e_size_adjusted,
571 (
long) abandon_array,
603#ifdef DUK_USE_MARK_AND_SWEEP
614 if (new_alloc_size == 0) {
632 new_p = (duk_uint8_t *)
DUK_ALLOC(thr->
heap, new_alloc_size);
645 new_e_size_adjusted, new_a_size, new_h_size);
650 (new_e_k ==
NULL && new_e_pv ==
NULL && new_e_f ==
NULL &&
653 DUK_DDD(
DUK_DDDPRINT(
"new alloc size %ld, new_e_k=%p, new_e_pv=%p, new_e_f=%p, new_a=%p, new_h=%p",
654 (
long) new_alloc_size, (
void *) new_e_k, (
void *) new_e_pv, (
void *) new_e_f,
655 (
void *) new_a, (
void *) new_h));
695 new_e_pv !=
NULL && new_e_f !=
NULL);
721 new_e_k[new_e_next] = key;
722 tv2 = &new_e_pv[new_e_next].
v;
734 DUK_DDD(
DUK_DDDPRINT(
"abandon array: pop %ld key temps from valstack", (
long) new_e_next));
753 new_e_pv !=
NULL && new_e_f !=
NULL);
755 new_e_k[new_e_next] = key;
785#ifdef DUK_USE_ASSERTIONS
787 if (!abandon_array) {
797 if (new_a_size > 0) {
816#if defined(DUK_USE_HOBJECT_HASH_PART)
823 DUK_MEMSET(new_h, 0xff,
sizeof(duk_uint32_t) * new_h_size);
826 for (i = 0; i < new_e_next; i++) {
828 duk_uint32_t j, step;
842 j = (j + step) % new_h_size;
857 DUK_DD(
DUK_DDPRINT(
"resized hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to "
858 "{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld",
863 (
long) new_alloc_size,
870 (
long) new_e_size_adjusted,
874 (
long) abandon_array,
895#ifdef DUK_USE_MARK_AND_SWEEP
903#ifdef DUK_USE_ASSERTIONS
927#ifdef DUK_USE_MARK_AND_SWEEP
940 duk_uint32_t old_e_used;
941 duk_uint32_t new_e_size;
942 duk_uint32_t new_a_size;
943 duk_uint32_t new_h_size;
957#if defined(DUK_USE_HOBJECT_HASH_PART)
970 duk_uint32_t new_e_size;
971 duk_uint32_t new_a_size;
972 duk_uint32_t new_h_size;
983 DUK_ASSERT(new_a_size >= highest_arr_idx + 1);
994 duk_uint32_t new_e_size;
995 duk_uint32_t new_a_size;
996 duk_uint32_t new_h_size;
1013 new_e_size = e_used + a_used;
1016#if defined(DUK_USE_HOBJECT_HASH_PART)
1023 "array stats before: e_used=%ld, a_used=%ld, a_size=%ld; "
1024 "resize to e_size=%ld, a_size=%ld, h_size=%ld",
1025 (
void *) obj, (
long) e_used, (
long) a_used, (
long) a_size,
1026 (
long) new_e_size, (
long) new_a_size, (
long) new_h_size));
1044 duk_uint32_t e_size;
1045 duk_uint32_t a_size;
1046 duk_uint32_t a_used;
1047 duk_uint32_t h_size;
1053#if defined(DUK_USE_ROM_OBJECTS)
1063 DUK_DD(
DUK_DDPRINT(
"compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, "
1064 "resized array density would be: %ld/%ld = %lf",
1065 (
long) e_size, (
long) a_used, (
long) a_size,
1066 (
long) a_used, (
long) a_size,
1067 (
double) a_used / (
double) a_size));
1070 DUK_DD(
DUK_DDPRINT(
"decided to abandon array during compaction, a_used=%ld, a_size=%ld",
1071 (
long) a_used, (
long) a_size));
1080#if defined(DUK_USE_HOBJECT_HASH_PART)
1090 DUK_DD(
DUK_DDPRINT(
"compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld",
1091 (
long) e_size, (
long) a_size, (
long) h_size, (
long) abandon_array));
1127 for (i = 0; i < n; i++) {
1128 if (h_keys_base[i] == key) {
1135#if defined(DUK_USE_HOBJECT_HASH_PART)
1140 duk_uint32_t i, step;
1141 duk_uint32_t *h_base;
1163 (
long) i, (
long) t));
1168 (
long) i, (
long) t, (
void *) key));
1174 (
long) i, (
long) t));
1260#ifdef DUK_USE_ASSERTIONS
1282#if defined(DUK_USE_HOBJECT_HASH_PART)
1285 duk_uint32_t i, step;
1293 duk_uint32_t t = h_base[i];
1295 DUK_DDD(
DUK_DDDPRINT(
"duk__alloc_entry_checked() inserted key into hash part, %ld -> %ld",
1296 (
long) i, (
long) idx));
1398 "(obj -> %!O, key -> %!O)",
1399 (
void *) thr, (
void *) obj, (
void *) key, (
void *) temp_desc,
1417 DUK_DDD(
DUK_DDDPRINT(
"-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T",
1433 *out_varenv = varenv;
1461 "key=%!O, varname=%!O",
1499 "key=%!O, varname=%!O, value=%!T",
1538 DUK_DDD(
DUK_DDDPRINT(
"-> have 'map', delete key %!O from map (if exists)); ignore result",
1591 DUK_DDD(
DUK_DDDPRINT(
"duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
1592 "arr_idx=%ld (obj -> %!O, key -> %!O)",
1593 (
void *) thr, (
void *) obj, (
void *) key, (
void *) out_desc,
1594 (
long) flags, (
long) arr_idx,
1606 out_desc->
flags = 0;
1609 out_desc->
e_idx = -1;
1610 out_desc->
h_idx = -1;
1611 out_desc->
a_idx = -1;
1629 out_desc->
a_idx = arr_idx;
1637 "should be there if present)"));
1638 goto prop_not_found_concrete;
1646 if (out_desc->
e_idx >= 0) {
1674 prop_not_found_concrete:
1733 if (arr_idx < (h_bufobj->
length >> h_bufobj->
shift)) {
1734 byte_off = arr_idx << h_bufobj->
shift;
1735 elem_size = 1 << h_bufobj->
shift;
1743 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (read zero)"));
1903 duk_uint32_t arr_idx;
1915 DUK_DDD(
DUK_DDDPRINT(
"duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
1916 "arr_idx=%ld (obj -> %!O, key -> %!O)",
1917 (
void *) thr, (
void *) obj, (
void *) key, (
void *) out_desc,
1918 (
long) flags, (
long) arr_idx,
1931 if (sanity-- == 0) {
1990 "behavior, object has array part)"));
1992#if defined(DUK_USE_FASTINT)
1993 if (DUK_TVAL_IS_FASTINT(tv_key)) {
1994 idx = duk__tval_fastint_to_arr_idx(tv_key);
2034 duk_uint32_t old_len, new_len;
2043#if defined(DUK_USE_FASTINT)
2044 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2045 idx = duk__tval_fastint_to_arr_idx(tv_key);
2068 if (idx >= old_len) {
2070 "(arr_idx=%ld, old_len=%ld)",
2071 (
long) idx, (
long) old_len));
2112#if defined(DUK_USE_FASTINT)
2113 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2114 idx = duk__tval_fastint_to_arr_idx(tv_key);
2129 if (idx >= (h_bufobj->
length >> h_bufobj->
shift)) {
2134 byte_off = idx << h_bufobj->
shift;
2135 elem_size = 1 << h_bufobj->
shift;
2141 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (read zero)"));
2165#if defined(DUK_USE_FASTINT)
2166 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2167 idx = duk__tval_fastint_to_arr_idx(tv_key);
2182 if (idx >= (h_bufobj->
length >> h_bufobj->
shift)) {
2187 byte_off = idx << h_bufobj->
shift;
2188 elem_size = 1 << h_bufobj->
shift;
2200 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (write skipped)"));
2222 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
2244 tv_obj = &tv_obj_copy;
2245 tv_key = &tv_key_copy;
2256#if defined(DUK_USE_PARANOID_ERRORS)
2275#if defined(DUK_USE_FASTINT)
2276 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2277 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
2278 DUK_DDD(
DUK_DDDPRINT(
"base object string, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
2284 DUK_DDD(
DUK_DDDPRINT(
"base object string, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
2290 "coercion key is %!T, arr_idx %ld",
2302 "after coercion -> return char)",
2307 if (pop_count == 0) {
2314 "coercion key is %!T, arr_idx %ld",
2323 "return string length)",
2356#if defined(DUK_USE_ES6_PROXY)
2381 "conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
2382 "desc.get=%p, desc.set=%p",
2384 (
unsigned long) desc.
flags,
2385 (
void *) desc.
get, (
void *) desc.
set));
2395 if (datadesc_reject || accdesc_reject) {
2417 "key matches magically bound property -> skip standard "
2418 "Get with replacement value)",
2444#if defined(DUK_USE_FASTINT)
2445 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2446 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
2447 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
2454 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
2460 "coercion key is %!T, arr_idx %ld",
2471 "after coercion -> return byte as number)",
2476 if (pop_count == 0) {
2483 "coercion key is %!T, arr_idx %ld",
2493 "after coercion -> return buffer length)",
2501 "return 0 for consistency with Buffer objects)",
2508 DUK_DDD(
DUK_DDDPRINT(
"-> %!T (base is buffer, key is 'BYTES_PER_ELEMENT' after coercion -> "
2509 "return 1 for consistency with Buffer objects)",
2542 DUK_DDD(
DUK_DDDPRINT(
"base object is a lightfunc, start lookup from function prototype"));
2547#if defined(DUK_USE_FASTINT)
2548 case DUK_TAG_FASTINT:
2587#ifdef DUK_USE_NONSTD_GETTER_KEY_ARGUMENT
2617 if (sanity-- == 0) {
2639#if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
2712 duk_uint32_t arr_idx;
2717 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
2727 tv_key = &tv_key_copy;
2753 goto pop_and_return;
2774#if defined(DUK_USE_ES6_PROXY)
2798 "conflicting property; desc.flags=0x%08lx, "
2799 "desc.get=%p, desc.set=%p",
2801 (
void *) desc.
get, (
void *) desc.
set));
2891#if defined(DUK_USE_FASTINT)
2897 if (DUK_TVAL_IS_FASTINT(tv)) {
2898 res = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv);
2922 res = (duk_uint32_t) d;
2940 duk_uint32_t old_len,
2941 duk_uint32_t new_len,
2943 duk_uint32_t *out_result_len) {
2944 duk_uint32_t target_len;
2946 duk_uint32_t arr_idx;
2952 "probably need to remove elements",
2953 (
long) old_len, (
long) new_len));
2993 while (i > new_len) {
2999 *out_result_len = new_len;
3013 "(highest preventing non-configurable entry (if any))"));
3015 target_len = new_len;
3036 if (arr_idx < new_len) {
3038 (
long) i, (
long) arr_idx));
3042 DUK_DDD(
DUK_DDDPRINT(
"skip entry index %ld: key is a relevant array index %ld, but configurable",
3043 (
long) i, (
long) arr_idx));
3048 if (arr_idx >= target_len) {
3050 "update target_len %ld -> %ld",
3051 (
long) i, (
long) arr_idx, (
long) target_len,
3052 (
long) (arr_idx + 1)));
3053 target_len = arr_idx + 1;
3061 (
long) old_len, (
long) new_len, (
long) target_len));
3064 "entries >= target_len"));
3082 if (arr_idx < target_len) {
3084 (
long) i, (
long) arr_idx));
3090 (
long) i, (
long) arr_idx));
3104 DUK_DDD(
DUK_DDDPRINT(
"array length write, no array part, stage 3: update length (done by caller)"));
3106 *out_result_len = target_len;
3108 if (target_len == new_len) {
3113 "full length adjustment), return error"));
3124 duk_uint32_t old_len;
3125 duk_uint32_t new_len;
3126 duk_uint32_t result_len;
3165 if (new_len >= old_len) {
3166 DUK_DDD(
DUK_DDDPRINT(
"new length is higher than old length, just update length, no deletions"));
3178 DUK_DDD(
DUK_DDDPRINT(
"new length is lower than old length, probably must delete entries"));
3189 DUK_ASSERT(result_len >= new_len && result_len <= old_len);
3243 duk_uint32_t arr_idx;
3247 duk_uint32_t new_array_length = 0;
3250 "(obj -> %!T, key -> %!T, val -> %!T)",
3251 (
void *) thr, (
void *) tv_obj, (
void *) tv_key, (
void *) tv_val,
3274 tv_obj = &tv_obj_copy;
3275 tv_key = &tv_key_copy;
3276 tv_val = &tv_val_copy;
3288#if defined(DUK_USE_PARANOID_ERRORS)
3316 goto fail_not_writable;
3321 goto fail_not_writable;
3333#if defined(DUK_USE_ROM_OBJECTS)
3341 goto fail_not_writable_no_pop;
3370#if defined(DUK_USE_ES6_PROXY)
3386 goto fail_proxy_rejected;
3401 "conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
3402 "desc.get=%p, desc.set=%p",
3404 (
unsigned long) desc.
flags,
3405 (
void *) desc.
get, (
void *) desc.
set));
3414 if (datadesc_reject || accdesc_reject) {
3443#if defined(DUK_USE_FASTINT)
3444 if (DUK_TVAL_IS_FASTINT(tv_key)) {
3445 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
3446 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
3452 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
3458 "coercion key is %!T, arr_idx %ld",
3472#if defined(DUK_USE_FASTINT)
3474 if (DUK_TVAL_IS_FASTINT(tv_val)) {
3475 data[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val);
3490 if (pop_count == 0) {
3497 "coercion key is %!T, arr_idx %ld",
3505 goto fail_not_writable;
3528 goto fail_not_writable;
3531 DUK_DDD(
DUK_DDDPRINT(
"base object is a lightfunc, start lookup from function prototype"));
3536#if defined(DUK_USE_FASTINT)
3537 case DUK_TAG_FASTINT:
3585 goto fail_no_setter;
3590#ifdef DUK_USE_NONSTD_SETTER_KEY_ARGUMENT
3597 goto success_no_arguments_exotic;
3605 DUK_DD(
DUK_DDPRINT(
"attempt to create a new property in a primitive base object"));
3606 goto fail_base_primitive;
3616 DUK_DD(
DUK_DDPRINT(
"found existing inherited plain property, but original object is not extensible"));
3617 goto fail_not_extensible;
3620 DUK_DD(
DUK_DDPRINT(
"found existing inherited plain property, original object is extensible, but inherited property is not writable"));
3621 goto fail_not_writable;
3623 DUK_DD(
DUK_DDPRINT(
"put to new property, object extensible, inherited property found and is writable"));
3632 DUK_DD(
DUK_DDPRINT(
"found existing own (non-inherited) plain property, but property is not writable"));
3633 goto fail_not_writable;
3636 DUK_DD(
DUK_DDPRINT(
"found existing own (non-inherited) virtual property, property is writable"));
3650 if (arr_idx < (h_bufobj->
length >> h_bufobj->
shift)) {
3655 byte_off = arr_idx << h_bufobj->
shift;
3656 elem_size = 1 << h_bufobj->
shift;
3670 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (write skipped)"));
3673 goto success_no_arguments_exotic;
3679 DUK_DD(
DUK_DDPRINT(
"put to existing own plain property, property is writable"));
3688 if (sanity-- == 0) {
3701 DUK_DD(
DUK_DDPRINT(
"attempt to create a new property in a primitive base object"));
3702 goto fail_base_primitive;
3706 DUK_DD(
DUK_DDPRINT(
"put to a new property (not found in prototype chain), but original object not extensible"));
3707 goto fail_not_extensible;
3723#if defined(DUK_USE_ROM_OBJECTS)
3728 goto fail_not_writable;
3752 DUK_DDD(
DUK_DDDPRINT(
"writing existing 'length' property to array exotic, invoke complex helper"));
3763 goto fail_array_length_partial;
3767 goto success_no_arguments_exotic;
3770 if (desc.
e_idx >= 0) {
3787 DUK_DD(
DUK_DDPRINT(
"put to an existing array entry at index %ld -> new value %!iT",
3795 goto success_with_arguments_exotic;
3814#if defined(DUK_USE_ROM_OBJECTS)
3819 goto fail_not_writable;
3833 duk_uint32_t old_len;
3837 if (arr_idx >= old_len) {
3839 "(arr_idx=%ld, old_len=%ld)",
3840 (
long) arr_idx, (
long) old_len));
3843 DUK_DD(
DUK_DDPRINT(
"attempt to extend array, but array 'length' is not writable"));
3844 goto fail_not_writable;
3854 new_array_length = arr_idx + 1;
3857 "(arr_idx=%ld, old_len=%ld)",
3858 (
long) arr_idx, (
long) old_len));
3876 goto no_array_growth;
3898 "fast resize without abandon check (arr_idx=%ld, old_size=%ld)",
3902 duk_uint32_t old_used;
3903 duk_uint32_t old_size;
3909 DUK_DDD(
DUK_DDDPRINT(
"abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld",
3910 (
long) old_used, (
long) old_size, (
long) arr_idx));
3918 "decided to abandon array part (would become too sparse)"));
3927 goto write_to_entry_part;
3936 "decided to extend current allocation"));
3965 write_to_entry_part:
3992 if (new_array_length > 0) {
4002 (
long) new_array_length));
4022 goto success_no_arguments_exotic;
4024 success_with_arguments_exotic:
4059 success_no_arguments_exotic:
4065#if defined(DUK_USE_ES6_PROXY)
4066 fail_proxy_rejected:
4075 fail_base_primitive:
4078#if defined(DUK_USE_PARANOID_ERRORS)
4088 fail_not_extensible:
4104#if defined(DUK_USE_ROM_OBJECTS)
4105 fail_not_writable_no_pop:
4113 fail_array_length_partial:
4145 duk_uint32_t arr_idx;
4152 DUK_DDD(
DUK_DDDPRINT(
"delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)",
4153 (
void *) thr, (
void *) obj, (
void *) key, (
long) throw_flag, (
long) force_flag,
4171#if defined(DUK_USE_ROM_OBJECTS)
4174 goto fail_not_configurable;
4179 goto fail_not_configurable;
4188 if (desc.
a_idx >= 0) {
4207#if defined(DUK_USE_HOBJECT_HASH_PART)
4208 if (desc.
h_idx >= 0) {
4226 DUK_MEMSET((
void *) &tv_tmp, 0,
sizeof(tv_tmp));
4297 fail_not_configurable:
4313#if defined(DUK_USE_ES6_PROXY)
4321 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
4340 goto fail_invalid_base_uncond;
4351#if defined(DUK_USE_ES6_PROXY)
4367 goto fail_proxy_rejected;
4380 DUK_DDD(
DUK_DDDPRINT(
"proxy 'deleteProperty': target has matching property %!O, check for "
4381 "conflicting property; desc.flags=0x%08lx, "
4382 "desc.get=%p, desc.set=%p",
4384 (
void *) desc.
get, (
void *) desc.
set));
4418 goto fail_not_configurable;
4425 goto fail_not_configurable;
4440 goto fail_not_configurable;
4447 goto fail_not_configurable;
4459 goto fail_not_configurable;
4471 fail_invalid_base_uncond:
4474#if defined(DUK_USE_PARANOID_ERRORS)
4482#if defined(DUK_USE_ES6_PROXY)
4483 fail_proxy_rejected:
4491 fail_not_configurable:
4521 duk_uint32_t arr_idx;
4527 DUK_DDD(
DUK_DDDPRINT(
"define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T",
4542 if (desc.
e_idx >= 0) {
4547 DUK_DDD(
DUK_DDDPRINT(
"property already exists in the entry part -> update value and attributes"));
4550 goto error_internal;
4555 }
else if (desc.
a_idx >= 0) {
4560 DUK_DDD(
DUK_DDDPRINT(
"property already exists in the array part -> update value (assert attributes)"));
4562 DUK_D(
DUK_DPRINT(
"existing property in array part, but propflags not WEC (0x%02lx)",
4563 (
unsigned long) propflags));
4564 goto error_internal;
4582 DUK_DDD(
DUK_DDDPRINT(
"property does not exist, object has array part -> possibly extend array part and write value (assert attributes)"));
4596 DUK_DDD(
DUK_DDDPRINT(
"property does not exist, object belongs in entry part -> allocate new entry and write value and attributes"));
4639 DUK_DDD(
DUK_DDDPRINT(
"define new property (internal) arr_idx fast path: thr=%p, obj=%!O, "
4640 "arr_idx=%ld, flags=0x%02lx, val=%!T",
4641 (
void *) thr, obj, (
long) arr_idx, (
unsigned long) flags,
4654 DUK_DDD(
DUK_DDDPRINT(
"define property to array part (property may or may not exist yet)"));
4697 "getter=%!O, setter=%!O, flags=0x%02lx",
4700 (
unsigned long) propflags));
4762 return (duk_uint32_t) val;
4971 if (is_data_desc && is_acc_desc) {
4975 *out_defprop_flags = defprop_flags;
4976 *out_idx_value = idx_value;
4977 *out_getter = getter;
4978 *out_setter = setter;
5015 duk_uint32_t arr_idx;
5030 duk_uint32_t arridx_new_array_length;
5031 duk_uint32_t arrlen_old_len;
5032 duk_uint32_t arrlen_new_len;
5060 arridx_new_array_length = 0;
5061 pending_write_protect = 0;
5066 "has_configurable=%ld is_configurable=%ld "
5067 "has_writable=%ld is_writable=%ld "
5068 "has_value=%ld value=%!T "
5069 "has_get=%ld get=%p=%!O "
5070 "has_set=%ld set=%p=%!O "
5072 (
long) has_enumerable, (
long) is_enumerable,
5073 (
long) has_configurable, (
long) is_configurable,
5074 (
long) has_writable, (
long) is_writable,
5076 (
long) has_get, (
void *) get, (
duk_heaphdr *) get,
5077 (long) has_set, (
void *) set, (
duk_heaphdr *) set,
5087 goto skip_array_exotic;
5093 DUK_DDD(
DUK_DDDPRINT(
"exotic array behavior for 'length', but no value in descriptor -> normal behavior"));
5094 goto skip_array_exotic;
5097 DUK_DDD(
DUK_DDDPRINT(
"exotic array behavior for 'length', value present in descriptor -> exotic behavior"));
5111 DUK_DDD(
DUK_DDDPRINT(
"old_len=%ld, new_len=%ld", (
long) arrlen_old_len, (
long) arrlen_new_len));
5113 if (arrlen_new_len >= arrlen_old_len) {
5116 goto skip_array_exotic;
5123 goto fail_not_writable_array_length;
5127 if (has_writable && !is_writable) {
5128 DUK_DDD(
DUK_DDDPRINT(
"desc writable is false, force it back to true, and flag pending write protect"));
5130 pending_write_protect = 1;
5138 duk_uint32_t old_len;
5143 if (arr_idx >= old_len) {
5145 "(arr_idx=%ld, old_len=%ld)",
5146 (
long) arr_idx, (
long) old_len));
5150 goto fail_not_writable_array_length;
5157 arridx_new_array_length = arr_idx + 1;
5160 "(arr_idx=%ld, old_len=%ld) -> standard behavior",
5161 (
long) arr_idx, (
long) old_len));
5186 goto fail_not_extensible;
5195 if (has_set || has_get) {
5206 if (has_enumerable && is_enumerable) {
5209 if (has_configurable && is_configurable) {
5228 goto success_exotics;
5239 if (has_writable && is_writable) {
5242 if (has_enumerable && is_enumerable) {
5245 if (has_configurable && is_configurable) {
5258 DUK_DDD(
DUK_DDDPRINT(
"new data property attributes match array defaults, attempt to write to array part"));
5279 goto success_exotics;
5294 if (has_enumerable) {
5295 if (is_enumerable) {
5305 if (has_configurable) {
5306 if (is_configurable) {
5349 if (set != curr.
set) {
5358 if (get != curr.
get) {
5369 goto success_no_exotics;
5379 if (has_configurable && is_configurable) {
5380 goto fail_not_configurable;
5382 if (has_enumerable) {
5384 if (!is_enumerable) {
5385 goto fail_not_configurable;
5388 if (is_enumerable) {
5389 goto fail_not_configurable;
5405#if defined(DUK_USE_ROM_OBJECTS)
5408 goto fail_not_configurable;
5413 if (has_set || has_get) {
5421 if (has_set && set != curr.
set) {
5422 goto fail_not_configurable;
5424 if (has_get && get != curr.
get) {
5425 goto fail_not_configurable;
5435 goto fail_not_configurable;
5439 if (curr.
a_idx >= 0) {
5440 DUK_DDD(
DUK_DDDPRINT(
"property to convert is stored in an array entry, abandon array and re-lookup"));
5476 }
else if (has_value || has_writable) {
5488 goto fail_not_configurable;
5526 goto fail_not_configurable;
5533 goto fail_not_configurable;
5544 DUK_ASSERT(!has_value && !has_writable && !has_get && !has_set);
5554 new_flags = curr.
flags;
5556 if (has_enumerable) {
5557 if (is_enumerable) {
5560 new_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE;
5563 if (has_configurable) {
5564 if (is_configurable) {
5567 new_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
5574 new_flags &= ~DUK_PROPDESC_FLAG_WRITABLE;
5581 (
unsigned long) new_flags));
5587 if (curr.
a_idx >= 0) {
5595 DUK_DDD(
DUK_DDDPRINT(
"array index, new property attributes match array defaults, update in-place"));
5604 goto success_exotics;
5607 DUK_DDD(
DUK_DDDPRINT(
"array index, new property attributes do not match array defaults, abandon array and re-lookup"));
5676 if (arridx_new_array_length > 0) {
5688 (
long) arridx_new_array_length));
5715 duk_uint32_t result_len;
5718 DUK_DDD(
DUK_DDDPRINT(
"defineProperty successful, key is 'length', exotic array behavior, "
5719 "doing array element deletion and length update"));
5724 DUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len);
5734 if (pending_write_protect) {
5744 goto fail_array_length_partial;
5757 goto success_no_exotics;
5764 if (has_set || has_get) {
5767 "changed to an accessor, delete arguments binding"));
5773 "check for value update / binding deletion"));
5779 "update bound value (variable/argument)"));
5785 "key=%!O, varname=%!O, value=%!T",
5793 if (has_writable && !is_writable) {
5795 "changed to non-writable, delete arguments binding"));
5813 fail_not_writable_array_length:
5817 fail_not_extensible:
5821 fail_not_configurable:
5825 fail_array_length_partial:
5878#if defined(DUK_USE_ROM_OBJECTS)
5906 *fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
5990#undef DUK__NO_ARRAY_INDEX
5991#undef DUK__HASH_INITIAL
5992#undef DUK__HASH_PROBE_STEP
5993#undef DUK__HASH_UNUSED
5994#undef DUK__HASH_DELETED
5995#undef DUK__VALSTACK_SPACE
#define DUK_UNREACHABLE()
unsigned int duk_small_uint_t
duk_small_int_t duk_ret_t
duk_int_fast32_t duk_int_t
duk_uint_fast32_t duk_uint_t
#define DUK_MEMZERO(p, n)
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
#define DUK_HTHREAD_STRING_BYTES_PER_ELEMENT(thr)
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)
#define DUK_TVAL_DECREF(thr, tv)
#define DUK_MS_FLAG_NO_OBJECT_COMPACTION
#define DUK_HSTRING_GET_ARRIDX_FAST(h)
DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag)
#define DUK_TVAL_SET_TVAL(v, x)
#define DUK_ERROR_RANGE(thr, msg)
#define DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)
#define DUK_HOBJECT_DECREF_ALLOWNULL(thr, h)
DUK_INTERNAL_DECL duk_hstring * duk_to_hstring(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)
DUK_EXTERNAL void duk_pop_2(duk_context *ctx)
#define DUK_HOBJECT_ALIGN_TARGET
#define DUK_STR_ARRAY_LENGTH_WRITE_FAILED
#define DUK_HOBJECT_A_MIN_GROW_ADD
#define DUK_TVAL_SET_FASTINT_U32(tv, val)
#define DUK_STRIDX_ENUMERABLE
DUK_EXTERNAL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_HOBJECT_GET_PROTOTYPE(heap, h)
DUK_INTERNAL_DECL duk_hobject * duk_require_hobject(duk_context *ctx, duk_idx_t index)
#define DUK_TVAL_IS_NUMBER(tv)
#define DUK_HOBJECT_E_GET_FLAGS_PTR(heap, h, i)
DUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t index)
#define DUK_ERROR_TYPE(thr, msg)
#define DUK_HOBJECT_HAS_BOUND(h)
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)
#define DUK_STR_NOT_WRITABLE
DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_HOBJECT_POSTINC_ENEXT(h)
#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent, n_arr, n_hash)
#define DUK_ALLOC(heap, size)
#define DUK_STR_INVALID_ARRAY_LENGTH
#define DUK_HOBJECT_HAS_EXOTIC_DUKFUNC(h)
DUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict)
#define DUK_GETDESC_FLAG_PUSH_VALUE
#define DUK_DELPROP_FLAG_THROW
#define DUK_TVAL_SET_OBJECT(tv, hptr)
#define DUK_HOBJECT_GET_ENEXT(h)
#define DUK_TVAL_GET_OBJECT(tv)
#define DUK_HOBJECT_GET_PROPS(heap, h)
#define DUK_HOBJECT_E_GET_KEY_BASE(heap, h)
DUK_EXTERNAL void duk_push_boolean(duk_context *ctx, duk_bool_t val)
#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h, i)
#define DUK_STR_SETTER_UNDEFINED
DUK_EXTERNAL void duk_to_undefined(duk_context *ctx, duk_idx_t index)
#define DUK_STR_STRICT_CALLER_READ
#define DUK_HOBJECT_A_GET_BASE(heap, h)
#define DUK_HOBJECT_A_ABANDON_LIMIT
#define DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h, off)
#define DUK_TVAL_IS_NULL(tv)
#define DUK_STR_REDEFINE_VIRT_PROP
#define DUK_TVAL_IS_BUFFER(tv)
DUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_context *ctx, duk_tval *tv)
#define DUK_TVAL_SET_UNUSED_UPDREF
#define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)
#define DUK_TVAL_IS_UNDEFINED(tv)
#define DUK_TVAL_SET_UNUSED(tv)
#define DUK_BIDX_POINTER_PROTOTYPE
#define DUK_TVAL_IS_OBJECT(tv)
#define DUK_HTHREAD_STRING_BYTE_LENGTH(thr)
#define DUK_BIDX_FUNCTION_PROTOTYPE
#define DUK_TVAL_GET_BUFFER(tv)
#define DUK_PROPDESC_FLAG_VIRTUAL
DUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_context *ctx, duk_small_int_t stridx)
#define DUK_STRIDX_WRITABLE
DUK_EXTERNAL void duk_require_stack(duk_context *ctx, duk_idx_t extra)
#define DUK_HOBJECT_SET_PROPS(heap, h, x)
#define DUK_HSTRING_GET_CHARLEN(x)
#define duk_js_samevalue(tv_x, tv_y)
#define DUK_HTHREAD_STRING_INT_TARGET(thr)
#define DUK_STR_ARRAY_LENGTH_NOT_WRITABLE
#define DUK_TVAL_INCREF(thr, tv)
#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h, i)
#define DUK_PROPDESC_FLAG_ACCESSOR
#define DUK_HOBJECT_E_GET_KEY(heap, h, i)
#define DUK_ERROR_INTERNAL_DEFMSG(thr)
#define DUK_TVAL_GET_TAG(tv)
DUK_EXTERNAL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h)
DUK_EXTERNAL void duk_remove(duk_context *ctx, duk_idx_t index)
#define DUK_BIDX_STRING_PROTOTYPE
#define DUK_HOBJECT_GET_ASIZE(h)
#define DUK_ASSERT_HBUFFEROBJECT_VALID(h)
#define DUK_TVAL_IS_UNUSED(tv)
#define DUK_HSTRING_GET_HASH(x)
#define DUK_FREE(heap, ptr)
#define DUK_HOBJECT_E_SET_KEY(heap, h, i, k)
DUK_INTERNAL_DECL duk_hstring * duk_heap_string_intern_u32(duk_heap *heap, duk_uint32_t val)
#define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap, h, i)
DUK_INTERNAL_DECL duk_hobject * duk_get_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index)
#define DUK_HTHREAD_STRING_INT_VARENV(thr)
#define DUK_MS_FLAG_NO_FINALIZERS
#define DUK_ASSERT_DISABLE(x)
#define DUK_HOBJECT_IS_CALLABLE(h)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
#define DUK_HOBJECT_SET_ESIZE(h, v)
#define DUK_ERROR_ALLOC_DEFMSG(thr)
DUK_EXTERNAL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index)
#define DUK_TVAL_GET_STRING(tv)
DUK_EXTERNAL void duk_replace(duk_context *ctx, duk_idx_t to_index)
#define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)
#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base, set_e_k, set_e_pv, set_e_f, set_a, set_h, n_ent, n_arr, n_hash)
#define DUK_HOBJECT_H_SIZE_DIVISOR
#define DUK_STR_NOT_EXTENSIBLE
#define DUK_HOBJECT_HAS_ARRAY_PART(h)
#define DUK_HSTRING_DECREF(thr, h)
#define DUK_HSTRING_INCREF(thr, h)
#define DUK_TVAL_SET_TVAL_UPDREF
#define DUK_STRIDX_DELETE_PROPERTY
#define DUK_TVAL_IS_STRING(tv)
#define DUK_PROPDESC_FLAG_NO_OVERWRITE
#define DUK_PROPDESC_FLAGS_MASK
#define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap, h, i)
#define DUK_HOBJECT_GET_HSIZE(h)
DUK_INTERNAL_DECL duk_hobject * duk_require_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index)
#define DUK_HEAP_STRING_INT_VALUE(heap)
#define DUK_HEAPHDR_HAS_READONLY(h)
#define DUK_HOBJECT_IS_BUFFEROBJECT(h)
#define DUK_ASSERT_VALSTACK_SPACE(thr, n)
#define DUK_TVAL_IS_LIGHTFUNC(tv)
DUK_EXTERNAL void duk_set_top(duk_context *ctx, duk_idx_t index)
#define DUK_BIDX_NUMBER_PROTOTYPE
DUK_EXTERNAL duk_idx_t duk_push_object(duk_context *ctx)
DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_context *ctx)
#define DUK_STRIDX_LENGTH
DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index)
DUK_EXTERNAL void duk_insert(duk_context *ctx, duk_idx_t to_index)
#define DUK_STR_PROTOTYPE_CHAIN_LIMIT
#define DUK_PROPDESC_FLAG_CONFIGURABLE
#define DUK_HOBJECT_E_SET_VALUE_SETTER(heap, h, i, v)
DUK_EXTERNAL duk_idx_t duk_get_top(duk_context *ctx)
#define DUK_TVAL_IS_DOUBLE(v)
#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)
DUK_INTERNAL_DECL void duk_push_tval(duk_context *ctx, duk_tval *tv)
#define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY
DUK_EXTERNAL void duk_push_uint(duk_context *ctx, duk_uint_t val)
#define DUK_HOBJECT_MAX_PROPERTIES
#define DUK_ERROR_FMT2(thr, err, fmt, arg1, arg2)
#define DUK_DELPROP_FLAG_FORCE
#define DUK_HOBJECT_IS_FUNCTION(h)
#define DUK_BIDX_BOOLEAN_PROTOTYPE
#define DUK_HOBJECT_SET_ENEXT(h, v)
#define DUK_STR_INVALID_BASE
DUK_EXTERNAL void duk_push_undefined(duk_context *ctx)
#define DUK_STR_NOT_CONFIGURABLE
#define DUK_HSTRING_HAS_INTERNAL(x)
DUK_EXTERNAL void duk_call_method(duk_context *ctx, duk_idx_t nargs)
#define DUK_HOBJECT_E_SET_FLAGS(heap, h, i, f)
#define DUK_TAG_UNDEFINED
DUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t index)
#define DUK_HTHREAD_STRING_NAME(thr)
#define DUK_HOBJECT_E_MIN_GROW_DIVISOR
#define DUK_PROPDESC_FLAG_WRITABLE
#define DUK_BIDX_BUFFER_PROTOTYPE
#define DUK_HNATIVEFUNCTION_NARGS_VARARGS
DUK_EXTERNAL void duk_pop_n(duk_context *ctx, duk_idx_t count)
#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)
DUK_INTERNAL_DECL duk_tval * duk_require_tval(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_A_MIN_GROW_DIVISOR
#define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h)
#define DUK_HTHREAD_STRING_BYTE_OFFSET(thr)
#define DUK_GET_TVAL_NEGIDX(ctx, idx)
#define DUK_STR_PROPERTY_IS_VIRTUAL
DUK_EXTERNAL void duk_substring(duk_context *ctx, duk_idx_t index, duk_size_t start_offset, duk_size_t end_offset)
#define DUK_PROPDESC_IS_ENUMERABLE(p)
#define DUK_HOBJECT_SET_ASIZE(h, v)
#define DUK_PROPDESC_FLAGS_WEC
#define DUK_HOBJECT_CLEAR_ARRAY_PART(h)
#define DUK_HSTRING_HAS_ARRIDX(x)
#define DUK_PROPDESC_FLAG_ENUMERABLE
#define DUK_PROPDESC_IS_ACCESSOR(p)
#define DUK_HOBJECT_E_USE_HASH_LIMIT
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
#define DUK_PROPDESC_IS_WRITABLE(p)
#define DUK_HOBJECT_E_SET_VALUE_GETTER(heap, h, i, v)
#define DUK_HBUFFER_GET_DATA_PTR(heap, x)
#define DUK_STRIDX_CONFIGURABLE
DUK_EXTERNAL void duk_pop(duk_context *ctx)
#define DUK_HOBJECT_E_GET_VALUE(heap, h, i)
DUK_INTERNAL_DECL duk_hobject * duk_get_hobject(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL void duk_push_hobject(duk_context *ctx, duk_hobject *h)
DUK_EXTERNAL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra)
#define DUK_STR_INVALID_DESCRIPTOR
#define DUK_HOBJECT_SET_HSIZE(h, v)
#define DUK_TVAL_GET_NUMBER(tv)
#define DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags)
#define DUK_HOBJECT_E_GET_FLAGS(heap, h, i)
#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h, i)
#define DUK_HOBJECT_CLEAR_EXTENSIBLE(h)
DUK_INTERNAL_DECL void duk_push_hstring(duk_context *ctx, duk_hstring *h)
DUK_INTERNAL_DECL duk_hstring * duk_get_hstring(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_hobject * duk_push_this_coercible_to_object(duk_context *ctx)
DUK_EXTERNAL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_hstring * duk_require_hstring(duk_context *ctx, duk_idx_t index)
#define DUK_HTHREAD_STRING_LENGTH(thr)
#define DUK_HOBJECT_GET_ESIZE(h)
#define DUK_TVAL_SET_UNDEFINED(tv)
DUK_INTERNAL_DECL duk_uint32_t duk_util_get_hash_prime(duk_uint32_t size)
#define DUK_PROPDESC_IS_CONFIGURABLE(p)
#define DUK_HOBJECT_HAS_EXTENSIBLE(h)
#define DUK_HOBJECT_H_GET_BASE(heap, h)
#define DUK_HTHREAD_STRING_INT_HANDLER(thr)
#define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP
DUK_INTERNAL_DECL const char * duk_push_string_tval_readable(duk_context *ctx, duk_tval *tv)
#define DUK_HOBJECT_HAS_STRICT(h)
#define DUK_HTHREAD_STRING_INT_MAP(thr)
#define DUK_HOBJECT_A_FAST_RESIZE_LIMIT
#define DUK_HOBJECT_E_MIN_GROW_ADD
#define DUK_STR_PROXY_REVOKED
#define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap, h, i)
#define DUK_HSTRING_GET_ARRIDX_SLOW(h)
#define DUK_TVAL_GET_DOUBLE(tv)
#define DUK_HOBJECT_INCREF_ALLOWNULL(thr, h)
#define duk_push_u32(ctx, val)
#define DUK_HTHREAD_STRING_CALLER(thr)
#define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap, h, i)
#define DUK_HBUFFER_GET_SIZE(x)
#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv)
DUK_INTERNAL_DECL duk_tval * duk_get_tval(duk_context *ctx, duk_idx_t index)
#define DUK_TAG_LIGHTFUNC
#define DUK_STR_PROXY_REJECTED
#define DUK_ERR_TYPE_ERROR
#define DUK_DEFPROP_HAVE_GETTER
#define DUK_DEFPROP_HAVE_VALUE
#define DUK_DEFPROP_FORCE
#define DUK_DEFPROP_CONFIGURABLE
#define DUK_DEFPROP_HAVE_WRITABLE
#define DUK_DEFPROP_HAVE_SETTER
#define DUK_DEFPROP_HAVE_CONFIGURABLE
#define DUK_DEFPROP_ENUMERABLE
#define DUK_DEFPROP_HAVE_ENUMERABLE
#define DUK_DEFPROP_WRITABLE
#define DUK__NO_ARRAY_INDEX
DUK_LOCAL_DECL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag)
DUK_LOCAL duk_uint32_t duk__to_new_array_length_checked(duk_hthread *thr)
DUK_LOCAL duk_bool_t duk__getprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key)
DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len)
DUK_LOCAL void duk__grow_props_for_new_entry_item(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL void duk_hobject_set_length_zero(duk_hthread *thr, duk_hobject *obj)
DUK_LOCAL duk_bool_t duk__lookup_arguments_map(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_hobject **out_map, duk_hobject **out_varenv)
DUK_INTERNAL duk_hstring * duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj)
DUK_LOCAL duk_uint32_t duk__get_min_grow_a(duk_uint32_t a_size)
DUK_LOCAL duk_tval * duk__getprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key)
DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj)
DUK_LOCAL duk_bool_t duk__putprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val, duk_propdesc *temp_desc)
DUK_LOCAL void duk__realloc_props(duk_hthread *thr, duk_hobject *obj, duk_uint32_t new_e_size, duk_uint32_t new_a_size, duk_uint32_t new_h_size, duk_bool_t abandon_array)
DUK_LOCAL duk_uint32_t duk__get_min_grow_e(duk_uint32_t e_size)
DUK_INTERNAL void duk_hobject_define_accessor_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_hobject *getter, duk_hobject *setter, duk_small_uint_t propflags)
DUK_INTERNAL duk_tval * duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i)
DUK_LOCAL duk_bool_t duk__alloc_entry_checked(duk_hthread *thr, duk_hobject *obj, duk_hstring *key)
DUK_LOCAL void duk__abandon_array_checked(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL void duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx)
#define DUK__HASH_INITIAL(hash, h_size)
DUK_INTERNAL duk_tval * duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key)
DUK_INTERNAL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key)
DUK_INTERNAL duk_tval * duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *out_attrs)
DUK_LOCAL_DECL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc)
DUK_INTERNAL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags)
DUK_LOCAL duk_bool_t duk__abandon_array_density_check(duk_uint32_t a_used, duk_uint32_t a_size)
DUK_INTERNAL duk_hobject * duk_hobject_resolve_proxy_target(duk_hthread *thr, duk_hobject *obj)
DUK_LOCAL duk_uint32_t duk__push_tval_to_hstring_arr_idx(duk_context *ctx, duk_tval *tv, duk_hstring **out_h)
DUK_INTERNAL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags)
DUK_INTERNAL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen)
#define DUK__VALSTACK_PROXY_LOOKUP
DUK_INTERNAL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag)
DUK_INTERNAL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key)
#define DUK__HASH_PROBE_STEP(hash)
DUK_INTERNAL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key)
DUK_LOCAL void duk__grow_props_for_array_item(duk_hthread *thr, duk_hobject *obj, duk_uint32_t highest_arr_idx)
DUK_LOCAL duk_uint32_t duk__count_used_e_keys(duk_hthread *thr, duk_hobject *obj)
DUK_LOCAL_DECL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags)
#define DUK__HASH_DELETED
DUK_INTERNAL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags)
DUK_INTERNAL void duk_hobject_prepare_property_descriptor(duk_context *ctx, duk_idx_t idx_in, duk_uint_t *out_defprop_flags, duk_idx_t *out_idx_value, duk_hobject **out_getter, duk_hobject **out_setter)
DUK_LOCAL duk_uint32_t duk__tval_number_to_arr_idx(duk_tval *tv)
DUK_INTERNAL duk_uint32_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL duk_bool_t duk_hobject_object_ownprop_helper(duk_context *ctx, duk_small_uint_t required_desc_flags)
DUK_INTERNAL void duk_hobject_define_property_helper(duk_context *ctx, duk_uint_t defprop_flags, duk_hobject *obj, duk_hstring *key, duk_idx_t idx_value, duk_hobject *get, duk_hobject *set)
DUK_INTERNAL duk_ret_t duk_hobject_object_get_own_property_descriptor(duk_context *ctx)
DUK_LOCAL duk_bool_t duk__abandon_array_slow_check_required(duk_uint32_t arr_idx, duk_uint32_t old_size)
DUK_INTERNAL void duk_hobject_set_length(duk_hthread *thr, duk_hobject *obj, duk_uint32_t length)
DUK_LOCAL duk_bool_t duk__proxy_check_prop(duk_hthread *thr, duk_hobject *obj, duk_small_uint_t stridx_trap, duk_tval *tv_key, duk_hobject **out_target)
DUK_LOCAL duk_bool_t duk__putprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val)
DUK_INTERNAL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags)
DUK_LOCAL duk_uint32_t duk__get_default_h_size(duk_uint32_t e_size)
DUK_LOCAL duk_uint32_t duk__get_old_array_length(duk_hthread *thr, duk_hobject *obj, duk_propdesc *temp_desc)
DUK_INTERNAL duk_bool_t duk_hobject_proxy_check(duk_hthread *thr, duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler)
#define DUK__VALSTACK_SPACE
DUK_LOCAL void duk__compute_a_stats(duk_hthread *thr, duk_hobject *obj, duk_uint32_t *out_used, duk_uint32_t *out_min_size)
DUK_INTERNAL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag)
DUK_LOCAL_DECL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags)
DUK_INTERNAL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze)
DUK_LOCAL duk_bool_t duk__key_is_lightfunc_ownprop(duk_hthread *thr, duk_hstring *key)
DUK_INTERNAL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv_out)
DUK_LOCAL_DECL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc)
duk_small_uint_t mark_and_sweep_base_flags
duk_hobject * builtins[DUK_NUM_BUILTINS]