mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
LibJS: Do not coerce nullish references to unresolvable references
These are not strictly unresolvable references. Treating them as such fails an assertion in the `delete UnaryExpression` semantic (which is Reference::delete_ in our implementation) - we enter the unresolvable, branch, which then asserts that the [[Strict]] slot of the reference is false.
This commit is contained in:
parent
f57310999d
commit
2b19d1b5ab
Notes:
sideshowbarker
2024-07-17 07:43:05 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/2b19d1b5ab Pull-request: https://github.com/SerenityOS/serenity/pull/19852
2 changed files with 11 additions and 6 deletions
|
@ -38,12 +38,6 @@ public:
|
||||||
, m_this_value(this_value)
|
, m_this_value(this_value)
|
||||||
, m_strict(strict)
|
, m_strict(strict)
|
||||||
{
|
{
|
||||||
if (base.is_nullish()) {
|
|
||||||
m_base_type = BaseType::Unresolvable;
|
|
||||||
m_base_value = {};
|
|
||||||
m_this_value = {};
|
|
||||||
m_name = {};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference(Environment& base, DeprecatedFlyString referenced_name, bool strict = false, Optional<EnvironmentCoordinate> environment_coordinate = {})
|
Reference(Environment& base, DeprecatedFlyString referenced_name, bool strict = false, Optional<EnvironmentCoordinate> environment_coordinate = {})
|
||||||
|
|
|
@ -87,6 +87,12 @@ test("deleting super property", () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class C {
|
||||||
|
static foo() {
|
||||||
|
delete super.bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const obj = new B();
|
const obj = new B();
|
||||||
expect(() => {
|
expect(() => {
|
||||||
obj.bar();
|
obj.bar();
|
||||||
|
@ -95,6 +101,11 @@ test("deleting super property", () => {
|
||||||
expect(() => {
|
expect(() => {
|
||||||
obj.baz();
|
obj.baz();
|
||||||
}).toThrowWithMessage(ReferenceError, "Can't delete a property on 'super'");
|
}).toThrowWithMessage(ReferenceError, "Can't delete a property on 'super'");
|
||||||
|
|
||||||
|
Object.setPrototypeOf(C, null);
|
||||||
|
expect(() => {
|
||||||
|
C.foo();
|
||||||
|
}).toThrowWithMessage(ReferenceError, "Can't delete a property on 'super'");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("deleting an object computed property coerces the object to a property key", () => {
|
test("deleting an object computed property coerces the object to a property key", () => {
|
||||||
|
|
Loading…
Reference in a new issue