Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / ASTInterpreter.cpp
diff options
context:
space:
mode:
Commit70a7bd82774843a5750fb96c0d7e51553505811c (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2020-11-01 20:39:33 +0200
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2020-11-09 22:08:19 +0200
Files89ac6dacc53ba58ad10fe791c487180dc68a1c85 /JSImpl/src/ASTInterpreter.cpp
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.tar
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.tar.gz
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.zip
Parent1d2838877d4b905c68578e5bd4c01ab2857099ee (diff)
Move value in ASTInterpreter to be shared pointer
1 files changed, 47 insertions, 30 deletions
-rw-r--r--JSImpl/src/ASTInterpreter.cpp77
diff --git a/JSImpl/src/ASTInterpreter.cpp b/JSImpl/src/ASTInterpreter.cpp
index 9874a4d..d5017aa 100644
--- a/JSImpl/src/ASTInterpreter.cpp
+++ b/JSImpl/src/ASTInterpreter.cpp
@@ -6,6 +6,21 @@
#undef NOT_IMPLEMENTED
#define NOT_IMPLEMENTED (void)e; assert(0 && "not-implemented")
+namespace
+{
+ template <typename T>
+ ASTInterpreter::value_type MakeValue(T&& v)
+ {
+ return IPLMakeSharePtr<double>(v);
+ }
+
+ template <typename T>
+ ASTInterpreter::value_type MakeValue(const T& v)
+ {
+ return IPLMakeSharePtr<double>(v);
+ }
+}
+
struct LValueExtractor : public ExpressionVisitor
{
public:
@@ -14,17 +29,17 @@ public:
{}
~LValueExtractor() {}
- ASTInterpreter::value_type* Run(Expression* program)
+ ASTInterpreter::value_type Run(Expression* program)
{
m_LValue = nullptr;
program->Accept(*this);
return m_LValue;
}
- virtual void Visit(IdentifierExpression* e) override { m_LValue = &m_Interpreter->ModifyVariable(e->GetName()); }
+ virtual void Visit(IdentifierExpression* e) override { m_LValue = m_Interpreter->ModifyVariable(e->GetName()); }
ASTInterpreter* m_Interpreter;
- ASTInterpreter::value_type* m_LValue;
+ ASTInterpreter::value_type m_LValue;
};
@@ -98,7 +113,7 @@ bool ASTInterpreter::EvalToBool(const ExpressionPtr& e)
e->Accept(*this);
auto result = m_Evaluation.back();
m_Evaluation.pop_back();
- return result != 0.0;
+ return *result != 0.0;
}
void ASTInterpreter::EnterScope()
@@ -154,54 +169,54 @@ void ASTInterpreter::Visit(LiteralObject* e)
}
void ASTInterpreter::Visit(LiteralNumber* e) {
- m_Evaluation.push_back(e->GetValue());
+ m_Evaluation.push_back(MakeValue(e->GetValue()));
}
void ASTInterpreter::Visit(LiteralBoolean* e) {
- m_Evaluation.push_back(e->GetValue());
+ m_Evaluation.push_back(MakeValue(e->GetValue()));
}
void ASTInterpreter::Visit(BinaryExpression* e) {
e->GetLeft()->Accept(*this);
e->GetRight()->Accept(*this);
- auto right = m_Evaluation.back();
+ auto right = *m_Evaluation.back();
m_Evaluation.pop_back();
- auto left = m_Evaluation.back();
+ auto left = *m_Evaluation.back();
m_Evaluation.pop_back();
switch (e->GetOperator()) {
case TokenType::Plus:
- m_Evaluation.push_back(left + right);
+ m_Evaluation.push_back(MakeValue(left + right));
break;
case TokenType::Minus:
- m_Evaluation.push_back(left - right);
+ m_Evaluation.push_back(MakeValue(left - right));
break;
case TokenType::Star:
- m_Evaluation.push_back(left * right);
+ m_Evaluation.push_back(MakeValue(left * right));
break;
case TokenType::Division:
- m_Evaluation.push_back(left / right);
+ m_Evaluation.push_back(MakeValue(left / right));
break;
case TokenType::Less:
- m_Evaluation.push_back(left < right);
+ m_Evaluation.push_back(MakeValue(left < right));
+ break;
+ case TokenType::LessEqual:
+ m_Evaluation.push_back(MakeValue(left <= right));
+ break;
+ case TokenType::Greater:
+ m_Evaluation.push_back(MakeValue(left > right));
+ break;
+ case TokenType::GreaterEqual:
+ m_Evaluation.push_back(MakeValue(left >= right));
break;
- case TokenType::LessEqual:
- m_Evaluation.push_back(left <= right);
- break;
- case TokenType::Greater:
- m_Evaluation.push_back(left > right);
- break;
- case TokenType::GreaterEqual:
- m_Evaluation.push_back(left >= right);
- break;
case TokenType::Comma:
- m_Evaluation.push_back(right);
+ m_Evaluation.push_back(MakeValue(std::move(right)));
break;
case TokenType::EqualEqual:
- m_Evaluation.push_back(fabs(left - right) < 0.0001);
+ m_Evaluation.push_back(MakeValue(fabs(left - right) < 0.0001));
break;
case TokenType::BangEqual:
- m_Evaluation.push_back(fabs(left - right) > 0.0001);
+ m_Evaluation.push_back(MakeValue(fabs(left - right) > 0.0001));
break;
case TokenType::Equal:
{
@@ -221,7 +236,9 @@ void ASTInterpreter::Visit(UnaryExpression* e) {
case TokenType::Minus:
{
e->GetExpr()->Accept(*this);
- m_Evaluation.back() *= -1;
+ auto v = m_Evaluation.back();
+ m_Evaluation.pop_back();
+ m_Evaluation.push_back(MakeValue(-(*v)));
break;
}
case TokenType::Plus:
@@ -236,12 +253,12 @@ void ASTInterpreter::Visit(UnaryExpression* e) {
auto lvalue = extractor.Run(e->GetExpr().get());
if (e->GetSuffix())
{
- m_Evaluation.push_back(*lvalue);
+ m_Evaluation.push_back(MakeValue(*lvalue));
}
*lvalue += e->GetOperator() == TokenType::PlusPlus ? 1 : -1;
if (!e->GetSuffix())
{
- m_Evaluation.push_back(*lvalue);
+ m_Evaluation.push_back(MakeValue(*lvalue));
}
break;
}
@@ -347,6 +364,6 @@ void ASTInterpreter::Print(Printer& p)
{
for (auto& it : m_Variables)
{
- p.PrintVariable(it.first.c_str(), ModifyVariable(it.first));
+ p.PrintVariable(it.first.c_str(), *ModifyVariable(it.first));
}
-} \ No newline at end of file
+}