Make Object.prototype
an immutable prototype object (#317)
* make `Object.prototype` an immutable prototype object * throw an exception on `Object.setPrototypeOf(Object.prototype, xxx)` * do not throw an exception for `Reflect.setPrototypeOf(Object.prototype, xxx)`
This commit is contained in:
parent
5aef8b67b1
commit
3a55b803b0
2 changed files with 9 additions and 0 deletions
|
@ -6859,6 +6859,13 @@ static int JS_SetPrototypeInternal(JSContext *ctx, JSValue obj,
|
|||
sh = p->shape;
|
||||
if (sh->proto == proto)
|
||||
return TRUE;
|
||||
if (p == JS_VALUE_GET_OBJ(ctx->class_proto[JS_CLASS_OBJECT])) {
|
||||
if (throw_flag) {
|
||||
JS_ThrowTypeError(ctx, "'Immutable prototype object \'Object.prototype\' cannot have their prototype set'");
|
||||
return -1;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
if (!p->extensible) {
|
||||
if (throw_flag) {
|
||||
JS_ThrowTypeError(ctx, "object is not extensible");
|
||||
|
|
|
@ -220,6 +220,8 @@ function test()
|
|||
assert(Object.isExtensible(a), false, "extensible");
|
||||
assert(typeof a.y, "undefined", "extensible");
|
||||
assert(err, true, "extensible");
|
||||
|
||||
assert_throws(TypeError, () => Object.setPrototypeOf(Object.prototype, {}));
|
||||
}
|
||||
|
||||
function test_enum()
|
||||
|
|
Loading…
Reference in a new issue