Skip to content

Commit

Permalink
LibJS: Throw error in Object::to_string() if string conversion fails
Browse files Browse the repository at this point in the history
  • Loading branch information
linusg authored and awesomekling committed Apr 29, 2020
1 parent 95abcc3 commit 2c6e7db
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 3 deletions.
8 changes: 7 additions & 1 deletion Libraries/LibJS/Runtime/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,13 @@ Value Object::to_string() const
&& to_string_property.is_object()
&& to_string_property.as_object().is_function()) {
auto& to_string_function = static_cast<Function&>(to_string_property.as_object());
return const_cast<Object*>(this)->interpreter().call(to_string_function, const_cast<Object*>(this));
auto& interpreter = const_cast<Object*>(this)->interpreter();
auto string_value = interpreter.call(to_string_function, const_cast<Object*>(this));
if (!string_value.is_string())
interpreter.throw_exception<TypeError>("Cannot convert object to string");
if (interpreter.exception())
return {};
return string_value;
}
return js_string(heap(), String::format("[object %s]", class_name()));
}
Expand Down
9 changes: 7 additions & 2 deletions Libraries/LibJS/Runtime/Value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,13 @@ String Value::to_string() const
return String::format("%.4f", as_double());
}

if (is_object())
return as_object().to_primitive(Object::PreferredType::String).to_string();
if (is_object()) {
auto primitive_value = as_object().to_primitive(Object::PreferredType::String);
// FIXME: Maybe we should pass in the Interpreter& and call interpreter.exception() instead?
if (primitive_value.is_empty())
return {};
return primitive_value.to_string();
}

if (is_string())
return m_value.as_string->string();
Expand Down

0 comments on commit 2c6e7db

Please sign in to comment.