diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 875a53633d..c5e670fa7a 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -450,15 +450,21 @@ Value UpdateExpression::execute(Interpreter& interpreter) const auto previous_value = interpreter.get_variable(name); ASSERT(previous_value.is_number()); + int op_result = 0; switch (m_op) { case UpdateOp::Increment: - interpreter.set_variable(name, Value(previous_value.as_double() + 1)); + op_result = 1; break; case UpdateOp::Decrement: - interpreter.set_variable(name, Value(previous_value.as_double() - 1)); + op_result = -1; break; } + interpreter.set_variable(name, Value(previous_value.as_double() + op_result)); + + if (m_prefixed) + return JS::Value(previous_value.as_double() + op_result); + return previous_value; } @@ -504,8 +510,13 @@ void UpdateExpression::dump(int indent) const ASTNode::dump(indent); print_indent(indent + 1); - printf("%s\n", op_string); + if (m_prefixed) + printf("%s\n", op_string); m_argument->dump(indent + 1); + if (!m_prefixed) { + print_indent(indent + 1); + printf("%s\n", op_string); + } } Value VariableDeclaration::execute(Interpreter& interpreter) const diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index 841ea7f4a3..c5ded7710a 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -451,9 +451,10 @@ enum class UpdateOp { class UpdateExpression : public Expression { public: - UpdateExpression(UpdateOp op, NonnullOwnPtr argument) + UpdateExpression(UpdateOp op, NonnullOwnPtr argument, bool prefixed = false) : m_op(op) , m_argument(move(argument)) + , m_prefixed(prefixed) { } @@ -465,6 +466,7 @@ private: UpdateOp m_op; NonnullOwnPtr m_argument; + bool m_prefixed; }; enum class DeclarationType {