From 9d68e0e7f516f3d614931399f37becf673250d01 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Wed, 4 May 2022 16:23:46 -0700 Subject: [PATCH] Implement OrdinaryDelete() which does not throw exception. --- src/njs_array.c | 4 ++-- src/njs_value.c | 14 +++++++++----- src/njs_value.h | 4 ++-- src/njs_vmcode.c | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/njs_array.c b/src/njs_array.c index 2ceb6be7..ec3a5da9 100644 --- a/src/njs_array.c +++ b/src/njs_array.c @@ -243,7 +243,7 @@ njs_array_length_set(njs_vm_t *vm, njs_value_t *value, idx = njs_string_to_index(&keys->start[i]); if (idx >= length) { ret = njs_value_property_delete(vm, value, &keys->start[i], - NULL); + NULL, 1); if (njs_slow_path(ret == NJS_ERROR)) { goto done; } @@ -1064,7 +1064,7 @@ njs_array_prototype_unshift(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, while (from > 0) { ret = njs_value_property_delete(vm, this, &keys->start[--from], - &entry); + &entry, 1); if (njs_slow_path(ret == NJS_ERROR)) { njs_array_destroy(vm, keys); return ret; diff --git a/src/njs_value.c b/src/njs_value.c index 3f4783c7..9347d505 100644 --- a/src/njs_value.c +++ b/src/njs_value.c @@ -1327,7 +1327,7 @@ fail: njs_int_t njs_value_property_delete(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, - njs_value_t *removed) + njs_value_t *removed, njs_bool_t thrw) { njs_int_t ret; njs_object_prop_t *prop; @@ -1343,10 +1343,14 @@ njs_value_property_delete(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, prop = pq.lhq.value; if (njs_slow_path(!prop->configurable)) { - njs_key_string_get(vm, &pq.key, &pq.lhq.key); - njs_type_error(vm, "Cannot delete property \"%V\" of %s", - &pq.lhq.key, njs_type_string(value->type)); - return NJS_ERROR; + if (thrw) { + njs_key_string_get(vm, &pq.key, &pq.lhq.key); + njs_type_error(vm, "Cannot delete property \"%V\" of %s", + &pq.lhq.key, njs_type_string(value->type)); + return NJS_ERROR; + } + + return NJS_OK; } switch (prop->type) { diff --git a/src/njs_value.h b/src/njs_value.h index b8663406..d654e157 100644 --- a/src/njs_value.h +++ b/src/njs_value.h @@ -1062,7 +1062,7 @@ njs_int_t njs_value_property(njs_vm_t *vm, njs_value_t *value, njs_int_t njs_value_property_set(njs_vm_t *vm, njs_value_t *value, njs_value_t *key, njs_value_t *setval); njs_int_t njs_value_property_delete(njs_vm_t *vm, njs_value_t *value, - njs_value_t *key, njs_value_t *removed); + njs_value_t *key, njs_value_t *removed, njs_bool_t thrw); njs_int_t njs_value_to_object(njs_vm_t *vm, njs_value_t *value); void njs_symbol_conversion_failed(njs_vm_t *vm, njs_bool_t to_string); @@ -1110,7 +1110,7 @@ njs_value_property_i64_delete(njs_vm_t *vm, njs_value_t *value, int64_t index, return ret; } - return njs_value_property_delete(vm, value, &key, removed); + return njs_value_property_delete(vm, value, &key, removed, 1); } diff --git a/src/njs_vmcode.c b/src/njs_vmcode.c index d6be6041..25f9e00c 100644 --- a/src/njs_vmcode.c +++ b/src/njs_vmcode.c @@ -500,7 +500,7 @@ next: break; case NJS_VMCODE_PROPERTY_DELETE: - ret = njs_value_property_delete(vm, value1, value2, NULL); + ret = njs_value_property_delete(vm, value1, value2, NULL, 1); if (njs_fast_path(ret != NJS_ERROR)) { vm->retval = njs_value_true; -- 2.47.3