mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-12 10:40:39 +09:00
LibJS: Implement Error.prototype.name setter (#1776)
The MDN example for creating a custom error type in javascript uses: function CustomError(foo, message, fileName, lineNumber) { var instance = new Error(message, fileName, lineNumber); instance.name = 'CustomError'; instance.foo = foo; Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); return instance; } The name property on the Error prototype needs to be settable for this to work properly.
This commit is contained in:
parent
984c290ec0
commit
2a65db7c12
Notes:
sideshowbarker
2024-07-19 07:38:25 +09:00
Author: https://github.com/bgianfo
Commit: 2a65db7c12
Pull-request: https://github.com/SerenityOS/serenity/pull/1776
Reviewed-by: https://github.com/awesomekling
4 changed files with 30 additions and 1 deletions
|
@ -39,6 +39,8 @@ public:
|
||||||
const FlyString& name() const { return m_name; }
|
const FlyString& name() const { return m_name; }
|
||||||
const String& message() const { return m_message; }
|
const String& message() const { return m_message; }
|
||||||
|
|
||||||
|
void set_name(const FlyString& name) { m_name = name; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool is_error() const final { return true; }
|
virtual bool is_error() const final { return true; }
|
||||||
virtual const char* class_name() const override { return "Error"; }
|
virtual const char* class_name() const override { return "Error"; }
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace JS {
|
||||||
|
|
||||||
ErrorPrototype::ErrorPrototype()
|
ErrorPrototype::ErrorPrototype()
|
||||||
{
|
{
|
||||||
put_native_property("name", name_getter, nullptr);
|
put_native_property("name", name_getter, name_setter);
|
||||||
put_native_property("message", message_getter, nullptr);
|
put_native_property("message", message_getter, nullptr);
|
||||||
put_native_function("toString", to_string);
|
put_native_function("toString", to_string);
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,19 @@ Value ErrorPrototype::name_getter(Interpreter& interpreter)
|
||||||
return js_string(interpreter, static_cast<const Error*>(this_object)->name());
|
return js_string(interpreter, static_cast<const Error*>(this_object)->name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ErrorPrototype::name_setter(Interpreter& interpreter, Value value)
|
||||||
|
{
|
||||||
|
auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
||||||
|
if (!this_object)
|
||||||
|
return;
|
||||||
|
if (!this_object->is_error()) {
|
||||||
|
interpreter.throw_exception<TypeError>("Not an Error object");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto name = FlyString(value.to_string());
|
||||||
|
static_cast<Error*>(this_object)->set_name(name);
|
||||||
|
}
|
||||||
|
|
||||||
Value ErrorPrototype::message_getter(Interpreter& interpreter)
|
Value ErrorPrototype::message_getter(Interpreter& interpreter)
|
||||||
{
|
{
|
||||||
auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
||||||
|
|
|
@ -41,6 +41,8 @@ private:
|
||||||
static Value to_string(Interpreter&);
|
static Value to_string(Interpreter&);
|
||||||
|
|
||||||
static Value name_getter(Interpreter&);
|
static Value name_getter(Interpreter&);
|
||||||
|
static void name_setter(Interpreter&, Value);
|
||||||
|
|
||||||
static Value message_getter(Interpreter&);
|
static Value message_getter(Interpreter&);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
12
Libraries/LibJS/Tests/Error.prototype.name.js
Normal file
12
Libraries/LibJS/Tests/Error.prototype.name.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
try {
|
||||||
|
var changedInstance = new Error("");
|
||||||
|
changedInstance.name = 'NewCustomError';
|
||||||
|
assert(changedInstance.name === "NewCustomError");
|
||||||
|
|
||||||
|
var normalInstance = new Error("");
|
||||||
|
assert(normalInstance.name === "Error");
|
||||||
|
|
||||||
|
console.log("PASS");
|
||||||
|
} catch (e) {
|
||||||
|
console.log("FAIL: " + e.message);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue