Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl
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
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.tar
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.tar.gz
IPL-70a7bd82774843a5750fb96c0d7e51553505811c.zip
Parent1d2838877d4b905c68578e5bd4c01ab2857099ee (diff)
Move value in ASTInterpreter to be shared pointer
3 files changed, 74 insertions, 57 deletions
-rw-r--r--JSImpl/src/ASTInterpreter.cpp77
-rw-r--r--JSImpl/src/ASTInterpreter.h2
-rw-r--r--JSImpl/test/ParserTests.cpp52
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
+}
diff --git a/JSImpl/src/ASTInterpreter.h b/JSImpl/src/ASTInterpreter.h
index db89013..16aebfa 100644
--- a/JSImpl/src/ASTInterpreter.h
+++ b/JSImpl/src/ASTInterpreter.h
@@ -11,7 +11,7 @@ public:
// TODO: Changing this to a shared_ptr<Value> (or GC-enabled value*) will
// allow for much simpler implementation of all varible assignments.
- typedef double value_type;
+ typedef IPLSharedPtr<double> value_type;
typedef IPLVector<value_type> ValueStack;
ValueStack Run(Expression* program);
diff --git a/JSImpl/test/ParserTests.cpp b/JSImpl/test/ParserTests.cpp
index d63ae60..31fa123 100644
--- a/JSImpl/test/ParserTests.cpp
+++ b/JSImpl/test/ParserTests.cpp
@@ -27,7 +27,7 @@ TEST(Parser, VariableDeclaration)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("s"));
- ASSERT_TRUE(i.ModifyVariable("s") == 0.0);
+ ASSERT_TRUE(*i.ModifyVariable("s") == 0.0);
}
TEST(Parser, Assignment)
@@ -38,7 +38,7 @@ TEST(Parser, Assignment)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("s"));
- ASSERT_TRUE(i.ModifyVariable("s") == 100);
+ ASSERT_TRUE(*i.ModifyVariable("s") == 100);
}
TEST(Parser, VariableDeclarationAdditionOfLiterals)
@@ -49,7 +49,7 @@ TEST(Parser, VariableDeclarationAdditionOfLiterals)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("s"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("s"), 11.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("s"), 11.0);
}
TEST(Parser, VariableDeclarationAdditionOfVariables)
@@ -62,9 +62,9 @@ TEST(Parser, VariableDeclarationAdditionOfVariables)
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
ASSERT_TRUE(i.HasVariable("c"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 4.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("c"), 9.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 4.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("c"), 9.0);
}
TEST(Parser, VariableDeclarationMultiplicationOfLiterals)
@@ -75,7 +75,7 @@ TEST(Parser, VariableDeclarationMultiplicationOfLiterals)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("s"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("s"), 30.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("s"), 30.0);
}
TEST(Parser, VariableDeclarationMultiplicationOfVariables)
@@ -88,9 +88,9 @@ TEST(Parser, VariableDeclarationMultiplicationOfVariables)
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
ASSERT_TRUE(i.HasVariable("c"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 4.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("c"), 20.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 4.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("c"), 20.0);
}
@@ -103,10 +103,10 @@ TEST(Parser, Unary)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 6.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("minusB"), -5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("plusB"), +5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 6.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("minusB"), -5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("plusB"), +5.0);
}
@@ -120,8 +120,8 @@ TEST(Parser, If)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 6.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 6.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 5.0);
}
{
IPLVector<Token> tokens = Tokenize("var a = 5; var b = 3; if(a == 5)a++; b++; b++;").tokens;
@@ -131,8 +131,8 @@ TEST(Parser, If)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 6.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 6.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 5.0);
}
{
@@ -143,8 +143,8 @@ TEST(Parser, If)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 5.0);
}
{
@@ -155,8 +155,8 @@ TEST(Parser, If)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 5.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 5.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 5.0);
}
{
@@ -167,8 +167,8 @@ TEST(Parser, If)
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("a"));
ASSERT_TRUE(i.HasVariable("b"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 6.0);
- ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 4.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("a"), 6.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("b"), 4.0);
}
}
@@ -181,7 +181,7 @@ TEST(Parser, For)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("i"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("i"), 45.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("i"), 45.0);
}
{
IPLVector<Token> tokens = Tokenize("var i = 0; for (var j = 0; j < 10; j++) i = i + j;").tokens;
@@ -189,7 +189,7 @@ TEST(Parser, For)
ASTInterpreter i;
i.Run(expr.get());
ASSERT_TRUE(i.HasVariable("i"));
- ASSERT_DOUBLE_EQ(i.ModifyVariable("i"), 45.0);
+ ASSERT_DOUBLE_EQ(*i.ModifyVariable("i"), 45.0);
}
}