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
612 if (new_alloc_size == 0) {
637 new_e_size_adjusted, new_a_size, new_h_size);
643 (new_e_k ==
NULL && new_e_pv ==
NULL && new_e_f ==
NULL &&
646 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",
647 (
long) new_alloc_size, (
void *) new_e_k, (
void *) new_e_pv, (
void *) new_e_f,
648 (
void *) new_a, (
void *) new_h));
688 new_e_pv !=
NULL && new_e_f !=
NULL);
714 new_e_k[new_e_next] = key;
715 tv2 = &new_e_pv[new_e_next].
v;
727 DUK_DDD(
DUK_DDDPRINT(
"abandon array: pop %ld key temps from valstack", (
long) new_e_next));
746 new_e_pv !=
NULL && new_e_f !=
NULL);
748 new_e_k[new_e_next] = key;
778#ifdef DUK_USE_ASSERTIONS
780 if (!abandon_array) {
790 if (new_a_size > 0) {
809#if defined(DUK_USE_HOBJECT_HASH_PART)
816 DUK_MEMSET(new_h, 0xff,
sizeof(duk_uint32_t) * new_h_size);
819 for (i = 0; i < new_e_next; i++) {
821 duk_uint32_t j, step;
835 j = (j + step) % new_h_size;
850 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 "
851 "{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld",
856 (
long) new_alloc_size,
863 (
long) new_e_size_adjusted,
867 (
long) abandon_array,
904#ifdef DUK_USE_MARK_AND_SWEEP
912#ifdef DUK_USE_ASSERTIONS
923 DUK_D(
DUK_DPRINT(
"hobject resize failed during abandon array, decref keys"));
932#ifdef DUK_USE_MARK_AND_SWEEP
945 duk_uint32_t old_e_used;
946 duk_uint32_t new_e_size;
947 duk_uint32_t new_a_size;
948 duk_uint32_t new_h_size;
962#if defined(DUK_USE_HOBJECT_HASH_PART)
975 duk_uint32_t new_e_size;
976 duk_uint32_t new_a_size;
977 duk_uint32_t new_h_size;
988 DUK_ASSERT(new_a_size >= highest_arr_idx + 1);
999 duk_uint32_t new_e_size;
1000 duk_uint32_t new_a_size;
1001 duk_uint32_t new_h_size;
1002 duk_uint32_t e_used;
1003 duk_uint32_t a_used;
1004 duk_uint32_t a_size;
1018 new_e_size = e_used + a_used;
1021#if defined(DUK_USE_HOBJECT_HASH_PART)
1028 "array stats before: e_used=%ld, a_used=%ld, a_size=%ld; "
1029 "resize to e_size=%ld, a_size=%ld, h_size=%ld",
1030 (
void *) obj, (
long) e_used, (
long) a_used, (
long) a_size,
1031 (
long) new_e_size, (
long) new_a_size, (
long) new_h_size));
1049 duk_uint32_t e_size;
1050 duk_uint32_t a_size;
1051 duk_uint32_t a_used;
1052 duk_uint32_t h_size;
1058#if defined(DUK_USE_ROM_OBJECTS)
1068 DUK_DD(
DUK_DDPRINT(
"compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, "
1069 "resized array density would be: %ld/%ld = %lf",
1070 (
long) e_size, (
long) a_used, (
long) a_size,
1071 (
long) a_used, (
long) a_size,
1072 (
double) a_used / (
double) a_size));
1075 DUK_DD(
DUK_DDPRINT(
"decided to abandon array during compaction, a_used=%ld, a_size=%ld",
1076 (
long) a_used, (
long) a_size));
1085#if defined(DUK_USE_HOBJECT_HASH_PART)
1095 DUK_DD(
DUK_DDPRINT(
"compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld",
1096 (
long) e_size, (
long) a_size, (
long) h_size, (
long) abandon_array));
1132 for (i = 0; i < n; i++) {
1133 if (h_keys_base[i] == key) {
1140#if defined(DUK_USE_HOBJECT_HASH_PART)
1145 duk_uint32_t i, step;
1146 duk_uint32_t *h_base;
1168 (
long) i, (
long) t));
1173 (
long) i, (
long) t, (
void *) key));
1179 (
long) i, (
long) t));
1265#ifdef DUK_USE_ASSERTIONS
1287#if defined(DUK_USE_HOBJECT_HASH_PART)
1290 duk_uint32_t i, step;
1298 duk_uint32_t t = h_base[i];
1300 DUK_DDD(
DUK_DDDPRINT(
"duk__alloc_entry_checked() inserted key into hash part, %ld -> %ld",
1301 (
long) i, (
long) idx));
1403 "(obj -> %!O, key -> %!O)",
1404 (
void *) thr, (
void *) obj, (
void *) key, (
void *) temp_desc,
1422 DUK_DDD(
DUK_DDDPRINT(
"-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T",
1438 *out_varenv = varenv;
1466 "key=%!O, varname=%!O",
1504 "key=%!O, varname=%!O, value=%!T",
1543 DUK_DDD(
DUK_DDDPRINT(
"-> have 'map', delete key %!O from map (if exists)); ignore result",
1596 DUK_DDD(
DUK_DDDPRINT(
"duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
1597 "arr_idx=%ld (obj -> %!O, key -> %!O)",
1598 (
void *) thr, (
void *) obj, (
void *) key, (
void *) out_desc,
1599 (
long) flags, (
long) arr_idx,
1611 out_desc->
flags = 0;
1614 out_desc->
e_idx = -1;
1615 out_desc->
h_idx = -1;
1616 out_desc->
a_idx = -1;
1634 out_desc->
a_idx = arr_idx;
1642 "should be there if present)"));
1643 goto prop_not_found_concrete;
1651 if (out_desc->
e_idx >= 0) {
1679 prop_not_found_concrete:
1738 if (arr_idx < (h_bufobj->
length >> h_bufobj->
shift)) {
1739 byte_off = arr_idx << h_bufobj->
shift;
1740 elem_size = 1 << h_bufobj->
shift;
1748 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (read zero)"));
1908 duk_uint32_t arr_idx;
1920 DUK_DDD(
DUK_DDDPRINT(
"duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, "
1921 "arr_idx=%ld (obj -> %!O, key -> %!O)",
1922 (
void *) thr, (
void *) obj, (
void *) key, (
void *) out_desc,
1923 (
long) flags, (
long) arr_idx,
1936 if (sanity-- == 0) {
1995 "behavior, object has array part)"));
1997#if defined(DUK_USE_FASTINT)
1998 if (DUK_TVAL_IS_FASTINT(tv_key)) {
1999 idx = duk__tval_fastint_to_arr_idx(tv_key);
2039 duk_uint32_t old_len, new_len;
2048#if defined(DUK_USE_FASTINT)
2049 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2050 idx = duk__tval_fastint_to_arr_idx(tv_key);
2073 if (idx >= old_len) {
2075 "(arr_idx=%ld, old_len=%ld)",
2076 (
long) idx, (
long) old_len));
2117#if defined(DUK_USE_FASTINT)
2118 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2119 idx = duk__tval_fastint_to_arr_idx(tv_key);
2134 if (idx >= (h_bufobj->
length >> h_bufobj->
shift)) {
2139 byte_off = idx << h_bufobj->
shift;
2140 elem_size = 1 << h_bufobj->
shift;
2146 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (read zero)"));
2170#if defined(DUK_USE_FASTINT)
2171 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2172 idx = duk__tval_fastint_to_arr_idx(tv_key);
2187 if (idx >= (h_bufobj->
length >> h_bufobj->
shift)) {
2192 byte_off = idx << h_bufobj->
shift;
2193 elem_size = 1 << h_bufobj->
shift;
2205 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (write skipped)"));
2227 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
2249 tv_obj = &tv_obj_copy;
2250 tv_key = &tv_key_copy;
2261#if defined(DUK_USE_PARANOID_ERRORS)
2280#if defined(DUK_USE_FASTINT)
2281 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2282 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
2283 DUK_DDD(
DUK_DDDPRINT(
"base object string, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
2289 DUK_DDD(
DUK_DDDPRINT(
"base object string, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
2295 "coercion key is %!T, arr_idx %ld",
2307 "after coercion -> return char)",
2312 if (pop_count == 0) {
2319 "coercion key is %!T, arr_idx %ld",
2328 "return string length)",
2361#if defined(DUK_USE_ES6_PROXY)
2386 "conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
2387 "desc.get=%p, desc.set=%p",
2389 (
unsigned long) desc.
flags,
2390 (
void *) desc.
get, (
void *) desc.
set));
2400 if (datadesc_reject || accdesc_reject) {
2422 "key matches magically bound property -> skip standard "
2423 "Get with replacement value)",
2449#if defined(DUK_USE_FASTINT)
2450 if (DUK_TVAL_IS_FASTINT(tv_key)) {
2451 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
2452 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
2459 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
2465 "coercion key is %!T, arr_idx %ld",
2476 "after coercion -> return byte as number)",
2481 if (pop_count == 0) {
2488 "coercion key is %!T, arr_idx %ld",
2498 "after coercion -> return buffer length)",
2506 "return 0 for consistency with Buffer objects)",
2513 DUK_DDD(
DUK_DDDPRINT(
"-> %!T (base is buffer, key is 'BYTES_PER_ELEMENT' after coercion -> "
2514 "return 1 for consistency with Buffer objects)",
2547 DUK_DDD(
DUK_DDDPRINT(
"base object is a lightfunc, start lookup from function prototype"));
2552#if defined(DUK_USE_FASTINT)
2553 case DUK_TAG_FASTINT:
2592#ifdef DUK_USE_NONSTD_GETTER_KEY_ARGUMENT
2622 if (sanity-- == 0) {
2644#if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)
2717 duk_uint32_t arr_idx;
2722 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
2732 tv_key = &tv_key_copy;
2758 goto pop_and_return;
2779#if defined(DUK_USE_ES6_PROXY)
2803 "conflicting property; desc.flags=0x%08lx, "
2804 "desc.get=%p, desc.set=%p",
2806 (
void *) desc.
get, (
void *) desc.
set));
2896#if defined(DUK_USE_FASTINT)
2902 if (DUK_TVAL_IS_FASTINT(tv)) {
2903 res = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv);
2927 res = (duk_uint32_t) d;
2945 duk_uint32_t old_len,
2946 duk_uint32_t new_len,
2948 duk_uint32_t *out_result_len) {
2949 duk_uint32_t target_len;
2951 duk_uint32_t arr_idx;
2957 "probably need to remove elements",
2958 (
long) old_len, (
long) new_len));
2998 while (i > new_len) {
3004 *out_result_len = new_len;
3018 "(highest preventing non-configurable entry (if any))"));
3020 target_len = new_len;
3041 if (arr_idx < new_len) {
3043 (
long) i, (
long) arr_idx));
3047 DUK_DDD(
DUK_DDDPRINT(
"skip entry index %ld: key is a relevant array index %ld, but configurable",
3048 (
long) i, (
long) arr_idx));
3053 if (arr_idx >= target_len) {
3055 "update target_len %ld -> %ld",
3056 (
long) i, (
long) arr_idx, (
long) target_len,
3057 (
long) (arr_idx + 1)));
3058 target_len = arr_idx + 1;
3066 (
long) old_len, (
long) new_len, (
long) target_len));
3069 "entries >= target_len"));
3087 if (arr_idx < target_len) {
3089 (
long) i, (
long) arr_idx));
3095 (
long) i, (
long) arr_idx));
3109 DUK_DDD(
DUK_DDDPRINT(
"array length write, no array part, stage 3: update length (done by caller)"));
3111 *out_result_len = target_len;
3113 if (target_len == new_len) {
3118 "full length adjustment), return error"));
3129 duk_uint32_t old_len;
3130 duk_uint32_t new_len;
3131 duk_uint32_t result_len;
3170 if (new_len >= old_len) {
3171 DUK_DDD(
DUK_DDDPRINT(
"new length is higher than old length, just update length, no deletions"));
3183 DUK_DDD(
DUK_DDDPRINT(
"new length is lower than old length, probably must delete entries"));
3194 DUK_ASSERT(result_len >= new_len && result_len <= old_len);
3248 duk_uint32_t arr_idx;
3252 duk_uint32_t new_array_length = 0;
3255 "(obj -> %!T, key -> %!T, val -> %!T)",
3256 (
void *) thr, (
void *) tv_obj, (
void *) tv_key, (
void *) tv_val,
3279 tv_obj = &tv_obj_copy;
3280 tv_key = &tv_key_copy;
3281 tv_val = &tv_val_copy;
3293#if defined(DUK_USE_PARANOID_ERRORS)
3321 goto fail_not_writable;
3326 goto fail_not_writable;
3338#if defined(DUK_USE_ROM_OBJECTS)
3346 goto fail_not_writable_no_pop;
3375#if defined(DUK_USE_ES6_PROXY)
3391 goto fail_proxy_rejected;
3406 "conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, "
3407 "desc.get=%p, desc.set=%p",
3409 (
unsigned long) desc.
flags,
3410 (
void *) desc.
get, (
void *) desc.
set));
3419 if (datadesc_reject || accdesc_reject) {
3448#if defined(DUK_USE_FASTINT)
3449 if (DUK_TVAL_IS_FASTINT(tv_key)) {
3450 arr_idx = duk__tval_fastint_to_arr_idx(tv_key);
3451 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path fastint; arr_idx %ld", (
long) arr_idx));
3457 DUK_DDD(
DUK_DDDPRINT(
"base object buffer, key is a fast-path number; arr_idx %ld", (
long) arr_idx));
3463 "coercion key is %!T, arr_idx %ld",
3477#if defined(DUK_USE_FASTINT)
3479 if (DUK_TVAL_IS_FASTINT(tv_val)) {
3480 data[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val);
3495 if (pop_count == 0) {
3502 "coercion key is %!T, arr_idx %ld",
3510 goto fail_not_writable;
3533 goto fail_not_writable;
3536 DUK_DDD(
DUK_DDDPRINT(
"base object is a lightfunc, start lookup from function prototype"));
3541#if defined(DUK_USE_FASTINT)
3542 case DUK_TAG_FASTINT:
3590 goto fail_no_setter;
3595#ifdef DUK_USE_NONSTD_SETTER_KEY_ARGUMENT
3602 goto success_no_arguments_exotic;
3610 DUK_DD(
DUK_DDPRINT(
"attempt to create a new property in a primitive base object"));
3611 goto fail_base_primitive;
3621 DUK_DD(
DUK_DDPRINT(
"found existing inherited plain property, but original object is not extensible"));
3622 goto fail_not_extensible;
3625 DUK_DD(
DUK_DDPRINT(
"found existing inherited plain property, original object is extensible, but inherited property is not writable"));
3626 goto fail_not_writable;
3628 DUK_DD(
DUK_DDPRINT(
"put to new property, object extensible, inherited property found and is writable"));
3637 DUK_DD(
DUK_DDPRINT(
"found existing own (non-inherited) plain property, but property is not writable"));
3638 goto fail_not_writable;
3641 DUK_DD(
DUK_DDPRINT(
"found existing own (non-inherited) virtual property, property is writable"));
3655 if (arr_idx < (h_bufobj->
length >> h_bufobj->
shift)) {
3660 byte_off = arr_idx << h_bufobj->
shift;
3661 elem_size = 1 << h_bufobj->
shift;
3675 DUK_D(
DUK_DPRINT(
"bufferobject access out of underlying buffer, ignoring (write skipped)"));
3678 goto success_no_arguments_exotic;
3684 DUK_DD(
DUK_DDPRINT(
"put to existing own plain property, property is writable"));
3693 if (sanity-- == 0) {
3706 DUK_DD(
DUK_DDPRINT(
"attempt to create a new property in a primitive base object"));
3707 goto fail_base_primitive;
3711 DUK_DD(
DUK_DDPRINT(
"put to a new property (not found in prototype chain), but original object not extensible"));
3712 goto fail_not_extensible;
3728#if defined(DUK_USE_ROM_OBJECTS)
3733 goto fail_not_writable;
3757 DUK_DDD(
DUK_DDDPRINT(
"writing existing 'length' property to array exotic, invoke complex helper"));
3768 goto fail_array_length_partial;
3772 goto success_no_arguments_exotic;
3775 if (desc.
e_idx >= 0) {
3792 DUK_DD(
DUK_DDPRINT(
"put to an existing array entry at index %ld -> new value %!iT",
3800 goto success_with_arguments_exotic;
3819#if defined(DUK_USE_ROM_OBJECTS)
3824 goto fail_not_writable;
3838 duk_uint32_t old_len;
3842 if (arr_idx >= old_len) {
3844 "(arr_idx=%ld, old_len=%ld)",
3845 (
long) arr_idx, (
long) old_len));
3848 DUK_DD(
DUK_DDPRINT(
"attempt to extend array, but array 'length' is not writable"));
3849 goto fail_not_writable;
3859 new_array_length = arr_idx + 1;
3862 "(arr_idx=%ld, old_len=%ld)",
3863 (
long) arr_idx, (
long) old_len));
3881 goto no_array_growth;
3903 "fast resize without abandon check (arr_idx=%ld, old_size=%ld)",
3907 duk_uint32_t old_used;
3908 duk_uint32_t old_size;
3914 DUK_DDD(
DUK_DDDPRINT(
"abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld",
3915 (
long) old_used, (
long) old_size, (
long) arr_idx));
3923 "decided to abandon array part (would become too sparse)"));
3932 goto write_to_entry_part;
3941 "decided to extend current allocation"));
3970 write_to_entry_part:
3997 if (new_array_length > 0) {
4007 (
long) new_array_length));
4027 goto success_no_arguments_exotic;
4029 success_with_arguments_exotic:
4064 success_no_arguments_exotic:
4070#if defined(DUK_USE_ES6_PROXY)
4071 fail_proxy_rejected:
4080 fail_base_primitive:
4083#if defined(DUK_USE_PARANOID_ERRORS)
4093 fail_not_extensible:
4109#if defined(DUK_USE_ROM_OBJECTS)
4110 fail_not_writable_no_pop:
4118 fail_array_length_partial:
4150 duk_uint32_t arr_idx;
4157 DUK_DDD(
DUK_DDDPRINT(
"delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)",
4158 (
void *) thr, (
void *) obj, (
void *) key, (
long) throw_flag, (
long) force_flag,
4176#if defined(DUK_USE_ROM_OBJECTS)
4179 goto fail_not_configurable;
4184 goto fail_not_configurable;
4193 if (desc.
a_idx >= 0) {
4212#if defined(DUK_USE_HOBJECT_HASH_PART)
4213 if (desc.
h_idx >= 0) {
4231 DUK_MEMSET((
void *) &tv_tmp, 0,
sizeof(tv_tmp));
4302 fail_not_configurable:
4318#if defined(DUK_USE_ES6_PROXY)
4326 (
void *) thr, (
void *) tv_obj, (
void *) tv_key,
4345 goto fail_invalid_base_uncond;
4356#if defined(DUK_USE_ES6_PROXY)
4372 goto fail_proxy_rejected;
4384 DUK_DDD(
DUK_DDDPRINT(
"proxy 'deleteProperty': target has matching property %!O, check for "
4385 "conflicting property; desc.flags=0x%08lx, "
4386 "desc.get=%p, desc.set=%p",
4388 (
void *) desc.
get, (
void *) desc.
set));
4422 goto fail_not_configurable;
4429 goto fail_not_configurable;
4444 goto fail_not_configurable;
4451 goto fail_not_configurable;
4463 goto fail_not_configurable;
4475 fail_invalid_base_uncond:
4478#if defined(DUK_USE_PARANOID_ERRORS)
4486#if defined(DUK_USE_ES6_PROXY)
4487 fail_proxy_rejected:
4495 fail_not_configurable:
4525 duk_uint32_t arr_idx;
4531 DUK_DDD(
DUK_DDDPRINT(
"define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T",
4546 if (desc.
e_idx >= 0) {
4551 DUK_DDD(
DUK_DDDPRINT(
"property already exists in the entry part -> update value and attributes"));
4554 goto error_internal;
4559 }
else if (desc.
a_idx >= 0) {
4564 DUK_DDD(
DUK_DDDPRINT(
"property already exists in the array part -> update value (assert attributes)"));
4566 DUK_D(
DUK_DPRINT(
"existing property in array part, but propflags not WEC (0x%02lx)",
4567 (
unsigned long) propflags));
4568 goto error_internal;
4586 DUK_DDD(
DUK_DDDPRINT(
"property does not exist, object has array part -> possibly extend array part and write value (assert attributes)"));
4600 DUK_DDD(
DUK_DDDPRINT(
"property does not exist, object belongs in entry part -> allocate new entry and write value and attributes"));
4643 DUK_DDD(
DUK_DDDPRINT(
"define new property (internal) arr_idx fast path: thr=%p, obj=%!O, "
4644 "arr_idx=%ld, flags=0x%02lx, val=%!T",
4645 (
void *) thr, obj, (
long) arr_idx, (
unsigned long) flags,
4658 DUK_DDD(
DUK_DDDPRINT(
"define property to array part (property may or may not exist yet)"));
4701 "getter=%!O, setter=%!O, flags=0x%02lx",
4704 (
unsigned long) propflags));
4766 return (duk_uint32_t) val;
4975 if (is_data_desc && is_acc_desc) {
4979 *out_defprop_flags = defprop_flags;
4980 *out_idx_value = idx_value;
4981 *out_getter = getter;
4982 *out_setter = setter;
5019 duk_uint32_t arr_idx;
5034 duk_uint32_t arridx_new_array_length;
5035 duk_uint32_t arrlen_old_len;
5036 duk_uint32_t arrlen_new_len;
5064 arridx_new_array_length = 0;
5065 pending_write_protect = 0;
5070 "has_configurable=%ld is_configurable=%ld "
5071 "has_writable=%ld is_writable=%ld "
5072 "has_value=%ld value=%!T "
5073 "has_get=%ld get=%p=%!O "
5074 "has_set=%ld set=%p=%!O "
5076 (
long) has_enumerable, (
long) is_enumerable,
5077 (
long) has_configurable, (
long) is_configurable,
5078 (
long) has_writable, (
long) is_writable,
5080 (
long) has_get, (
void *) get, (
duk_heaphdr *) get,
5081 (long) has_set, (
void *) set, (
duk_heaphdr *) set,
5091 goto skip_array_exotic;
5097 DUK_DDD(
DUK_DDDPRINT(
"exotic array behavior for 'length', but no value in descriptor -> normal behavior"));
5098 goto skip_array_exotic;
5101 DUK_DDD(
DUK_DDDPRINT(
"exotic array behavior for 'length', value present in descriptor -> exotic behavior"));
5115 DUK_DDD(
DUK_DDDPRINT(
"old_len=%ld, new_len=%ld", (
long) arrlen_old_len, (
long) arrlen_new_len));
5117 if (arrlen_new_len >= arrlen_old_len) {
5120 goto skip_array_exotic;
5127 goto fail_not_writable_array_length;
5131 if (has_writable && !is_writable) {
5132 DUK_DDD(
DUK_DDDPRINT(
"desc writable is false, force it back to true, and flag pending write protect"));
5134 pending_write_protect = 1;
5142 duk_uint32_t old_len;
5147 if (arr_idx >= old_len) {
5149 "(arr_idx=%ld, old_len=%ld)",
5150 (
long) arr_idx, (
long) old_len));
5154 goto fail_not_writable_array_length;
5161 arridx_new_array_length = arr_idx + 1;
5164 "(arr_idx=%ld, old_len=%ld) -> standard behavior",
5165 (
long) arr_idx, (
long) old_len));
5190 goto fail_not_extensible;
5199 if (has_set || has_get) {
5210 if (has_enumerable && is_enumerable) {
5213 if (has_configurable && is_configurable) {
5232 goto success_exotics;
5243 if (has_writable && is_writable) {
5246 if (has_enumerable && is_enumerable) {
5249 if (has_configurable && is_configurable) {
5262 DUK_DDD(
DUK_DDDPRINT(
"new data property attributes match array defaults, attempt to write to array part"));
5283 goto success_exotics;
5298 if (has_enumerable) {
5299 if (is_enumerable) {
5309 if (has_configurable) {
5310 if (is_configurable) {
5353 if (set != curr.
set) {
5362 if (get != curr.
get) {
5373 goto success_no_exotics;
5383 if (has_configurable && is_configurable) {
5384 goto fail_not_configurable;
5386 if (has_enumerable) {
5388 if (!is_enumerable) {
5389 goto fail_not_configurable;
5392 if (is_enumerable) {
5393 goto fail_not_configurable;
5409#if defined(DUK_USE_ROM_OBJECTS)
5412 goto fail_not_configurable;
5417 if (has_set || has_get) {
5425 if (has_set && set != curr.
set) {
5426 goto fail_not_configurable;
5428 if (has_get && get != curr.
get) {
5429 goto fail_not_configurable;
5439 goto fail_not_configurable;
5443 if (curr.
a_idx >= 0) {
5444 DUK_DDD(
DUK_DDDPRINT(
"property to convert is stored in an array entry, abandon array and re-lookup"));
5480 }
else if (has_value || has_writable) {
5492 goto fail_not_configurable;
5530 goto fail_not_configurable;
5537 goto fail_not_configurable;
5548 DUK_ASSERT(!has_value && !has_writable && !has_get && !has_set);
5558 new_flags = curr.
flags;
5560 if (has_enumerable) {
5561 if (is_enumerable) {
5564 new_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE;
5567 if (has_configurable) {
5568 if (is_configurable) {
5571 new_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
5578 new_flags &= ~DUK_PROPDESC_FLAG_WRITABLE;
5585 (
unsigned long) new_flags));
5591 if (curr.
a_idx >= 0) {
5599 DUK_DDD(
DUK_DDDPRINT(
"array index, new property attributes match array defaults, update in-place"));
5608 goto success_exotics;
5611 DUK_DDD(
DUK_DDDPRINT(
"array index, new property attributes do not match array defaults, abandon array and re-lookup"));
5680 if (arridx_new_array_length > 0) {
5692 (
long) arridx_new_array_length));
5719 duk_uint32_t result_len;
5722 DUK_DDD(
DUK_DDDPRINT(
"defineProperty successful, key is 'length', exotic array behavior, "
5723 "doing array element deletion and length update"));
5728 DUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len);
5738 if (pending_write_protect) {
5748 goto fail_array_length_partial;
5761 goto success_no_exotics;
5768 if (has_set || has_get) {
5771 "changed to an accessor, delete arguments binding"));
5777 "check for value update / binding deletion"));
5783 "update bound value (variable/argument)"));
5789 "key=%!O, varname=%!O, value=%!T",
5797 if (has_writable && !is_writable) {
5799 "changed to non-writable, delete arguments binding"));
5817 fail_not_writable_array_length:
5821 fail_not_extensible:
5825 fail_not_configurable:
5829 fail_array_length_partial:
5882#if defined(DUK_USE_ROM_OBJECTS)
5910 *fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;
5994#undef DUK__NO_ARRAY_INDEX
5995#undef DUK__HASH_INITIAL
5996#undef DUK__HASH_PROBE_STEP
5997#undef DUK__HASH_UNUSED
5998#undef DUK__HASH_DELETED
5999#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_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
DUK_EXTERNAL void * duk_steal_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size)
#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_push_dynamic_buffer(ctx, size)
#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]