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:
Timothy Flynn 2023-07-06 16:18:17 -04:00 committed by Linus Groh
parent f57310999d
commit 2b19d1b5ab
Notes: sideshowbarker 2024-07-17 07:43:05 +09:00
2 changed files with 11 additions and 6 deletions

View file

@ -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 = {})

View file

@ -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", () => {