mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 13:36:13 +03:00
LibJS: Remove non-spec compliant code from internal_construct
It seems that we are now spec compliant enough to be able to remove this code block :^) Diff Tests: +2 ✅ -2 ❌
This commit is contained in:
parent
18d39deefe
commit
f28bb90d9b
Notes:
sideshowbarker
2024-07-16 19:17:47 +09:00
Author: https://github.com/shannonbooth Commit: https://github.com/SerenityOS/serenity/commit/f28bb90d9b Pull-request: https://github.com/SerenityOS/serenity/pull/24449
@ -506,15 +506,6 @@ ThrowCompletionOr<NonnullGCPtr<Object>> ECMAScriptFunctionObject::internal_const
|
||||
|
||||
// 10. If result.[[Type]] is return, then
|
||||
if (result.type() == Completion::Type::Return) {
|
||||
// FIXME: This is leftover from untangling the call/construct mess - doesn't belong here in any way, but removing it breaks derived classes.
|
||||
// Likely fixed by making ClassDefinitionEvaluation fully spec compliant.
|
||||
if (kind == ConstructorKind::Derived && result.value()->is_object()) {
|
||||
auto prototype = TRY(new_target.get(vm.names.prototype));
|
||||
if (prototype.is_object())
|
||||
TRY(result.value()->as_object().internal_set_prototype_of(&prototype.as_object()));
|
||||
}
|
||||
// EOF (End of FIXME)
|
||||
|
||||
// a. If Type(result.[[Value]]) is Object, return result.[[Value]].
|
||||
if (result.value()->is_object())
|
||||
return result.value()->as_object();
|
||||
|
@ -506,3 +506,29 @@ test("When no constructor on deriving class @@iterator of %Array.prototype% is n
|
||||
|
||||
expect(calls).toBe(1);
|
||||
});
|
||||
|
||||
test("constructor return value overrides inheritance and property initialization", () => {
|
||||
let calls = 0;
|
||||
class Base {
|
||||
constructor() {
|
||||
this.prop = 1;
|
||||
calls++;
|
||||
}
|
||||
}
|
||||
|
||||
class Derived extends Base {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
// Return an empty object instead of Derived/Base object
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
let object = new Derived();
|
||||
|
||||
expect(calls).toBe(1);
|
||||
expect(typeof object.prop).toBe("undefined");
|
||||
expect(object instanceof Derived).toBe(false);
|
||||
expect(object instanceof Base).toBe(false);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user