From: Dmitry Volyntsev Date: Mon, 19 Jun 2017 11:41:03 +0000 (+0300) Subject: Object.isFrozen() method. X-Git-Tag: 0.1.11~11 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=303bbee6c24417a4234b0caf757a58a1e6f42a8e;p=njs.git Object.isFrozen() method. --- diff --git a/njs/njs_object.c b/njs/njs_object.c index ac6d717b..6f200035 100644 --- a/njs/njs_object.c +++ b/njs/njs_object.c @@ -754,6 +754,54 @@ njs_object_freeze(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, } +static njs_ret_t +njs_object_is_frozen(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; + const njs_value_t *retval; + + if (nargs < 2 || !njs_is_object(&args[1])) { + vm->exception = &njs_exception_type_error; + return NXT_ERROR; + } + + retval = &njs_string_false; + + object = args[1].data.u.object; + nxt_lvlhsh_each_init(&lhe, &njs_object_hash_proto); + + hash = &object->hash; + + if (object->extensible) { + goto done; + } + + for ( ;; ) { + prop = nxt_lvlhsh_each(hash, &lhe); + + if (prop == NULL) { + break; + } + + if (prop->writable || prop->configurable) { + goto done; + } + } + + retval = &njs_string_true; + +done: + + vm->retval = *retval; + + 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) @@ -957,6 +1005,14 @@ static const njs_object_prop_t njs_object_constructor_properties[] = NJS_SKIP_ARG, NJS_OBJECT_ARG), }, + /* Object.isFrozen(). */ + { + .type = NJS_METHOD, + .name = njs_string("isFrozen"), + .value = njs_native_function(njs_object_is_frozen, 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 e43cfe84..9c22ef63 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -6164,6 +6164,57 @@ static njs_unit_test_t njs_test[] = { nxt_string("var r = Object.freeze(new RegExp('')); r.a = 1; r.a"), nxt_string("undefined") }, + { nxt_string("Object.isFrozen({a:1})"), + nxt_string("false") }, + + { nxt_string("Object.isFrozen([1,2])"), + nxt_string("false") }, + + { nxt_string("Object.isFrozen(function() {})"), + nxt_string("false") }, + + { nxt_string("Object.isFrozen(new Date(''))"), + nxt_string("false") }, + + { nxt_string("Object.isFrozen(new RegExp(''))"), + nxt_string("false") }, + + { nxt_string("Object.isFrozen(1)"), + nxt_string("TypeError") }, + + { nxt_string("Object.isFrozen('')"), + nxt_string("TypeError") }, + + { nxt_string("Object.isFrozen(Object.defineProperties({}, {a:{value:1}}))"), + nxt_string("false") }, + + { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{}});" + "o = Object.preventExtensions(o);" + "Object.isFrozen(o)"), + nxt_string("true") }, + + { nxt_string("var o = Object.defineProperties({}, {a:{}, b:{writable:1}});" + "o = Object.preventExtensions(o);" + "Object.isFrozen(o)"), + nxt_string("false") }, + + { nxt_string("var o = Object.defineProperties({}, {a:{writable:1}});" + "o = Object.preventExtensions(o);" + "Object.isFrozen(o)"), + nxt_string("false") }, + + { nxt_string("var o = Object.defineProperties({}, {a:{configurable:1}});" + "o = Object.preventExtensions(o);" + "Object.isFrozen(o)"), + nxt_string("false") }, + + { nxt_string("var o = Object.preventExtensions({a:1});" + "Object.isFrozen(o)"), + nxt_string("false") }, + + { nxt_string("var o = Object.freeze({a:1}); Object.isFrozen(o)"), + nxt_string("true") }, + { nxt_string("var o = Object.preventExtensions({a:1});" "Object.defineProperty(o, 'b', {value:1})"), nxt_string("TypeError") },