diff options
author | Andreas Kling <kling@serenityos.org> | 2020-04-05 18:18:24 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-05 18:19:56 +0200 |
commit | 8bfee015bc7d79c7fc3c89edbc88eba503e8ab37 (patch) | |
tree | 433321217839a56707563d6cedc4f8074d4e5916 /Libraries/LibJS/Runtime | |
parent | a7b21ec0f4a77e6e7cdf2b57f9255a02539b02f4 (diff) | |
download | serenity-8bfee015bc7d79c7fc3c89edbc88eba503e8ab37.zip |
LibJS: Make Object::to_string() call the "toString" property if present
Diffstat (limited to 'Libraries/LibJS/Runtime')
-rw-r--r-- | Libraries/LibJS/Runtime/Object.cpp | 8 | ||||
-rw-r--r-- | Libraries/LibJS/Runtime/ObjectPrototype.cpp | 2 |
2 files changed, 9 insertions, 1 deletions
diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp index c29c7f85d1..6598a3af76 100644 --- a/Libraries/LibJS/Runtime/Object.cpp +++ b/Libraries/LibJS/Runtime/Object.cpp @@ -205,6 +205,14 @@ Value Object::to_primitive(PreferredType preferred_type) const Value Object::to_string() const { + auto to_string_property = get("toString"); + if (to_string_property.has_value() + && to_string_property.value().is_object() + && to_string_property.value().as_object().is_function()) { + auto& to_string_function = static_cast<Function&>(to_string_property.value().as_object()); + return const_cast<Object*>(this)->interpreter().call(&to_string_function, const_cast<Object*>(this)); + } return js_string(heap(), String::format("[object %s]", class_name())); } + } diff --git a/Libraries/LibJS/Runtime/ObjectPrototype.cpp b/Libraries/LibJS/Runtime/ObjectPrototype.cpp index 92e06048b2..c70c590253 100644 --- a/Libraries/LibJS/Runtime/ObjectPrototype.cpp +++ b/Libraries/LibJS/Runtime/ObjectPrototype.cpp @@ -61,7 +61,7 @@ Value ObjectPrototype::to_string(Interpreter& interpreter) auto* this_object = interpreter.this_value().to_object(interpreter.heap()); if (!this_object) return {}; - return Value(this_object->to_string()); + return js_string(interpreter, String::format("[object %s]", this_object->class_name())); } Value ObjectPrototype::value_of(Interpreter& interpreter) |