mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 03:07:43 +00:00
LibJS: Check for exceptions in a lot more places
This commit is contained in:
parent
c9059c12dc
commit
0d2fb306af
1 changed files with 61 additions and 10 deletions
|
@ -72,7 +72,10 @@ Value CallExpression::execute(Interpreter& interpreter) const
|
||||||
|
|
||||||
auto& call_frame = interpreter.push_call_frame();
|
auto& call_frame = interpreter.push_call_frame();
|
||||||
for (size_t i = 0; i < m_arguments.size(); ++i) {
|
for (size_t i = 0; i < m_arguments.size(); ++i) {
|
||||||
call_frame.arguments.append(m_arguments[i].execute(interpreter));
|
auto value = m_arguments[i].execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
call_frame.arguments.append(value);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -95,6 +98,8 @@ Value CallExpression::execute(Interpreter& interpreter) const
|
||||||
Value ReturnStatement::execute(Interpreter& interpreter) const
|
Value ReturnStatement::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto value = argument() ? argument()->execute(interpreter) : js_undefined();
|
auto value = argument() ? argument()->execute(interpreter) : js_undefined();
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
interpreter.unwind(ScopeType::Function);
|
interpreter.unwind(ScopeType::Function);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -102,6 +107,8 @@ Value ReturnStatement::execute(Interpreter& interpreter) const
|
||||||
Value IfStatement::execute(Interpreter& interpreter) const
|
Value IfStatement::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto predicate_result = m_predicate->execute(interpreter);
|
auto predicate_result = m_predicate->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
|
||||||
if (predicate_result.to_boolean())
|
if (predicate_result.to_boolean())
|
||||||
return interpreter.run(*m_consequent);
|
return interpreter.run(*m_consequent);
|
||||||
|
@ -116,7 +123,11 @@ Value WhileStatement::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
Value last_value = js_undefined();
|
Value last_value = js_undefined();
|
||||||
while (m_predicate->execute(interpreter).to_boolean()) {
|
while (m_predicate->execute(interpreter).to_boolean()) {
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
last_value = interpreter.run(*m_body);
|
last_value = interpreter.run(*m_body);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
return last_value;
|
return last_value;
|
||||||
|
@ -133,20 +144,35 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
|
|
||||||
Value last_value = js_undefined();
|
Value last_value = js_undefined();
|
||||||
|
|
||||||
if (m_init)
|
if (m_init) {
|
||||||
m_init->execute(interpreter);
|
m_init->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
if (m_test) {
|
if (m_test) {
|
||||||
while (m_test->execute(interpreter).to_boolean()) {
|
while (m_test->execute(interpreter).to_boolean()) {
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
last_value = interpreter.run(*m_body);
|
last_value = interpreter.run(*m_body);
|
||||||
if (m_update)
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
if (m_update) {
|
||||||
m_update->execute(interpreter);
|
m_update->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (true) {
|
while (true) {
|
||||||
last_value = interpreter.run(*m_body);
|
last_value = interpreter.run(*m_body);
|
||||||
if (m_update)
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
if (m_update) {
|
||||||
m_update->execute(interpreter);
|
m_update->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +185,11 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
Value BinaryExpression::execute(Interpreter& interpreter) const
|
Value BinaryExpression::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto lhs_result = m_lhs->execute(interpreter);
|
auto lhs_result = m_lhs->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
|
||||||
switch (m_op) {
|
switch (m_op) {
|
||||||
case BinaryOp::Plus:
|
case BinaryOp::Plus:
|
||||||
|
@ -204,7 +234,11 @@ Value BinaryExpression::execute(Interpreter& interpreter) const
|
||||||
Value LogicalExpression::execute(Interpreter& interpreter) const
|
Value LogicalExpression::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto lhs_result = m_lhs->execute(interpreter).to_boolean();
|
auto lhs_result = m_lhs->execute(interpreter).to_boolean();
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
auto rhs_result = m_rhs->execute(interpreter).to_boolean();
|
auto rhs_result = m_rhs->execute(interpreter).to_boolean();
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
switch (m_op) {
|
switch (m_op) {
|
||||||
case LogicalOp::And:
|
case LogicalOp::And:
|
||||||
return Value(lhs_result && rhs_result);
|
return Value(lhs_result && rhs_result);
|
||||||
|
@ -510,6 +544,8 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
|
||||||
switch (m_op) {
|
switch (m_op) {
|
||||||
case AssignmentOp::Assignment:
|
case AssignmentOp::Assignment:
|
||||||
|
@ -527,6 +563,8 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
|
||||||
rhs_result = div(m_lhs->execute(interpreter), rhs_result);
|
rhs_result = div(m_lhs->execute(interpreter), rhs_result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
commit(rhs_result);
|
commit(rhs_result);
|
||||||
return rhs_result;
|
return rhs_result;
|
||||||
}
|
}
|
||||||
|
@ -615,6 +653,8 @@ Value VariableDeclaration::execute(Interpreter& interpreter) const
|
||||||
interpreter.declare_variable(name().string(), m_declaration_type);
|
interpreter.declare_variable(name().string(), m_declaration_type);
|
||||||
if (m_initializer) {
|
if (m_initializer) {
|
||||||
auto initalizer_result = m_initializer->execute(interpreter);
|
auto initalizer_result = m_initializer->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
interpreter.set_variable(name().string(), initalizer_result, true);
|
interpreter.set_variable(name().string(), initalizer_result, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,8 +703,12 @@ void ExpressionStatement::dump(int indent) const
|
||||||
Value ObjectExpression::execute(Interpreter& interpreter) const
|
Value ObjectExpression::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto object = interpreter.heap().allocate<Object>();
|
auto object = interpreter.heap().allocate<Object>();
|
||||||
for (auto it : m_properties)
|
for (auto it : m_properties) {
|
||||||
object->put(it.key, it.value->execute(interpreter));
|
auto value = it.value->execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
object->put(it.key, value);
|
||||||
|
}
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -688,6 +732,8 @@ FlyString MemberExpression::computed_property_name(Interpreter& interpreter) con
|
||||||
Value MemberExpression::execute(Interpreter& interpreter) const
|
Value MemberExpression::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto object_result = m_object->execute(interpreter).to_object(interpreter.heap());
|
auto object_result = m_object->execute(interpreter).to_object(interpreter.heap());
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
ASSERT(object_result.is_object());
|
ASSERT(object_result.is_object());
|
||||||
auto result = object_result.as_object()->get(computed_property_name(interpreter));
|
auto result = object_result.as_object()->get(computed_property_name(interpreter));
|
||||||
return result.value_or({});
|
return result.value_or({});
|
||||||
|
@ -730,7 +776,10 @@ Value ArrayExpression::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto* array = interpreter.heap().allocate<Array>();
|
auto* array = interpreter.heap().allocate<Array>();
|
||||||
for (auto& element : m_elements) {
|
for (auto& element : m_elements) {
|
||||||
array->push(element.execute(interpreter));
|
auto value = element.execute(interpreter);
|
||||||
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
array->push(value);
|
||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
@ -795,10 +844,12 @@ Value CatchClause::execute(Interpreter&) const
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ThrowStatement::execute(Interpreter& interrupt) const
|
Value ThrowStatement::execute(Interpreter& interpreter) const
|
||||||
{
|
{
|
||||||
auto value = m_argument->execute(interrupt);
|
auto value = m_argument->execute(interpreter);
|
||||||
return interrupt.throw_exception(value);
|
if (interpreter.exception())
|
||||||
|
return {};
|
||||||
|
return interpreter.throw_exception(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue