]> git.kaiwu.me - njs.git/commitdiff
Object.seal() method.
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 19 Jun 2017 11:46:39 +0000 (14:46 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 19 Jun 2017 11:46:39 +0000 (14:46 +0300)
njs/njs_object.c
njs/test/njs_unit_test.c

index 6e2e02af8c6703cb75442f1e0942bc1fdea11811..81094431e0e63b7caec683fd6149e5ff047a80b0 100644 (file)
@@ -802,6 +802,43 @@ done:
 }
 
 
+static njs_ret_t
+njs_object_seal(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    nxt_lvlhsh_t       *hash;
+    njs_object_t       *object;
+    njs_object_prop_t  *prop;
+    nxt_lvlhsh_each_t  lhe;
+
+    if (nargs < 2 || !njs_is_object(&args[1])) {
+        vm->exception = &njs_exception_type_error;
+        return NXT_ERROR;
+    }
+
+    object = args[1].data.u.object;
+    object->extensible = 0;
+
+    nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto);
+
+    hash = &object->hash;
+
+    for ( ;; ) {
+        prop = nxt_lvlhsh_each(hash, &lhe);
+
+        if (prop == NULL) {
+            break;
+        }
+
+        prop->configurable = 0;
+    }
+
+    vm->retval = args[1];
+
+    return NXT_OK;
+}
+
+
 static njs_ret_t
 njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_index_t unused)
@@ -1033,6 +1070,14 @@ static const njs_object_prop_t  njs_object_constructor_properties[] =
                                      NJS_SKIP_ARG, NJS_OBJECT_ARG),
     },
 
+    /* Object.seal(). */
+    {
+        .type = NJS_METHOD,
+        .name = njs_string("seal"),
+        .value = njs_native_function(njs_object_seal, 0,
+                                     NJS_SKIP_ARG, NJS_OBJECT_ARG),
+    },
+
     /* Object.preventExtensions(). */
     {
         .type = NJS_METHOD,
index 420c1334310e2895668f186c9b898b5e70ecdc47..22d709ec65d1db7f55a0cad45ba8f5c1bc4a7012 100644 (file)
@@ -6215,6 +6215,27 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"),
       nxt_string("true") },
 
+    { nxt_string("var o = Object.seal({a:1}); o.a = 2; o.a"),
+      nxt_string("2") },
+
+    { nxt_string("var o = Object.seal({a:1}); delete o.a; o.a"),
+      nxt_string("1") },
+
+    { nxt_string("var o = Object.seal({a:1}); o.b = 1; o.b"),
+      nxt_string("undefined") },
+
+    { nxt_string("var o = Object.seal(Object.create({a:1})); o.a = 2; o.a"),
+      nxt_string("1") },
+
+    { nxt_string("var o = Object.seal({a:{b:1}}); o.a.b = 2; o.a.b"),
+      nxt_string("2") },
+
+    { nxt_string("Object.seal(1)"),
+      nxt_string("TypeError") },
+
+    { nxt_string("Object.seal('')"),
+      nxt_string("TypeError") },
+
     { nxt_string("var o = Object.preventExtensions({a:1});"
                  "Object.defineProperty(o, 'b', {value:1})"),
       nxt_string("TypeError") },