1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 21:57:35 +00:00

LibJS: Consider non-extensible objects in Reflect.setPrototypeOf()

This commit is contained in:
Linus Groh 2020-06-02 12:39:02 +01:00 committed by Andreas Kling
parent c1248a7fd8
commit b32761f2e0
2 changed files with 6 additions and 4 deletions

View file

@ -261,9 +261,7 @@ Value ReflectObject::set_prototype_of(Interpreter& interpreter)
Object* prototype = nullptr; Object* prototype = nullptr;
if (!prototype_value.is_null()) if (!prototype_value.is_null())
prototype = const_cast<Object*>(&prototype_value.as_object()); prototype = const_cast<Object*>(&prototype_value.as_object());
target->set_prototype(prototype); return Value(target->set_prototype(prototype));
// FIXME: Needs to return false for prototype chain cycles and non-extensible objects (don't have those yet).
return Value(true);
} }
} }

View file

@ -28,10 +28,14 @@ try {
assert(Reflect.setPrototypeOf({}, Reflect.getPrototypeOf({})) === true); assert(Reflect.setPrototypeOf({}, Reflect.getPrototypeOf({})) === true);
var o = {}; var o = {};
var p = { foo: "bar" };
assert(o.foo === undefined); assert(o.foo === undefined);
assert(Reflect.setPrototypeOf(o, { foo: "bar" }) === true); assert(Reflect.setPrototypeOf(o, p) === true);
assert(o.foo === "bar"); assert(o.foo === "bar");
Reflect.preventExtensions(o);
assert(Reflect.setPrototypeOf(o, {}) === false);
assert(Reflect.setPrototypeOf(o, p) === true);
console.log("PASS"); console.log("PASS");
} catch (e) { } catch (e) {