From 6ef2dcd9bfeb7f6db0d271f6381c86e5dda0b2a2 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 19 Jun 2017 14:46:39 +0300 Subject: [PATCH] Object.seal() method. --- njs/njs_object.c | 45 ++++++++++++++++++++++++++++++++++++++++ njs/test/njs_unit_test.c | 21 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/njs/njs_object.c b/njs/njs_object.c index 6e2e02af..81094431 100644 --- a/njs/njs_object.c +++ b/njs/njs_object.c @@ -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, diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 420c1334..22d709ec 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") }, -- 2.47.3