]> git.kaiwu.me - njs.git/commitdiff
Implement OrdinaryDelete() which does not throw exception.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 4 May 2022 23:23:46 +0000 (16:23 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 4 May 2022 23:23:46 +0000 (16:23 -0700)
src/njs_array.c
src/njs_value.c
src/njs_value.h
src/njs_vmcode.c

index 2ceb6be7e6b3725dad533a34a56ac60e7a8c2523..ec3a5da93e1e7a44e1e1c45da98f09ce6e9c9065 100644 (file)
@@ -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;
index 3f4783c709ca9bb5be54fa23bad43ae78b286130..9347d505f7f9f7d1deace69aa2ddc45949ce6f58 100644 (file)
@@ -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) {
index b86634067f00f4e5560f1de973a94cd06b56ce34..d654e1572506726961f4b6a8e300ae4dbc42623f 100644 (file)
@@ -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);
 }
 
 
index d6be604166b2ab20b958f034590897d8d27efc28..25f9e00c986b10d843e9e79001aab84da5633289 100644 (file)
@@ -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;