}
+static njs_ret_t
+njs_object_prevent_extensions(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ if (nargs < 2 || !njs_is_object(&args[1])) {
+ vm->exception = &njs_exception_type_error;
+ return NXT_ERROR;
+ }
+
+ args[1].data.u.object->extensible = 0;
+
+ vm->retval = args[1];
+
+ return NXT_OK;
+}
+
+
/*
* The __proto__ property of booleans, numbers and strings primitives,
* of objects created by Boolean(), Number(), and String() constructors,
.value = njs_native_function(njs_object_freeze, 0,
NJS_SKIP_ARG, NJS_OBJECT_ARG),
},
+
+ /* Object.preventExtensions(). */
+ {
+ .type = NJS_METHOD,
+ .name = njs_long_string("preventExtensions"),
+ .value = njs_native_function(njs_object_prevent_extensions, 0,
+ NJS_SKIP_ARG, NJS_OBJECT_ARG),
+ },
};
{ nxt_string("var r = Object.freeze(new RegExp('')); r.a = 1; r.a"),
nxt_string("undefined") },
+ { nxt_string("var o = Object.preventExtensions({a:1});"
+ "Object.defineProperty(o, 'b', {value:1})"),
+ nxt_string("TypeError") },
+
+ { nxt_string("var o = Object.preventExtensions({a:1});"
+ "Object.defineProperties(o, {b:{value:1}})"),
+ nxt_string("TypeError") },
+
+ { nxt_string("var o = Object.preventExtensions({a:1}); o.a = 2; o.a"),
+ nxt_string("2") },
+
+ { nxt_string("var o = Object.preventExtensions({a:1}); delete o.a; o.a"),
+ nxt_string("undefined") },
+
+ { nxt_string("var o = Object.preventExtensions({a:1}); o.b = 1; o.b"),
+ nxt_string("undefined") },
+
{ nxt_string("var d = new Date(''); d +' '+ d.getTime()"),
nxt_string("Invalid Date NaN") },