Skip to content

Commit d6dd2bd

Browse files
committed
store local variables inside script
1 parent c8d983d commit d6dd2bd

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

include/rift/script.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,19 @@ namespace rift {
2121
Script(Script const&) = delete;
2222
Script(Script&&) = delete;
2323

24-
[[nodiscard]] RunResult run(Object const& variables = {}) const noexcept;
25-
[[nodiscard]] EvalResult eval(Object const& variables = {}) const noexcept;
24+
[[nodiscard]] RunResult run(Object const& variables = {}) noexcept;
25+
[[nodiscard]] EvalResult eval(Object const& variables = {}) noexcept;
2626

2727
[[nodiscard]] std::string toDebugString() const noexcept {
2828
return m_root->toDebugString();
2929
}
3030

31+
[[nodiscard]] Object& getVariables() noexcept { return m_variables; }
32+
[[nodiscard]] Object const& getVariables() const noexcept { return m_variables; }
33+
3134
private:
3235
std::unique_ptr<Node> m_root;
36+
Object m_variables;
3337
};
3438

3539
}

include/rift/visitor.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ namespace rift {
2121

2222
class Visitor {
2323
public:
24-
explicit Visitor(Object const& variables) noexcept : m_variables(variables) {}
24+
explicit Visitor(Object const& variables, Object& localVariables) noexcept
25+
: m_variables(variables), m_localVariables(localVariables) {}
2526

2627
/// @brief Visit a node and evaluate its value.
2728
/// @param node the node to visit
@@ -85,7 +86,7 @@ namespace rift {
8586

8687
private:
8788
std::reference_wrapper<Object const> m_variables;
88-
Object m_localVariables;
89+
std::reference_wrapper<Object> m_localVariables;
8990
};
9091

9192
}

src/script.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33

44
namespace rift {
55

6-
RunResult Script::run(Object const &variables) const noexcept {
6+
RunResult Script::run(Object const &variables) noexcept {
77
auto result = eval(variables);
88
if (result.isErr()) {
99
return geode::Err(std::move(result.unwrapErr()));
1010
}
1111
return geode::Ok(result.unwrap().toString());
1212
}
1313

14-
EvalResult Script::eval(Object const &variables) const noexcept {
15-
Visitor visitor(variables);
14+
EvalResult Script::eval(Object const &variables) noexcept {
15+
Visitor visitor(variables, m_variables);
1616
auto result = visitor.visit(*m_root);
1717
if (result.isErr()) {
1818
return geode::Err(std::move(result.unwrapErr()));

src/visitor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace rift {
5454

5555
VisitorResult Visitor::visit(IdentifierNode const& node) noexcept {
5656
// check local variables
57-
if (auto it = m_localVariables.find(node.name()); it != m_localVariables.end()) {
57+
if (auto it = m_localVariables.get().find(node.name()); it != m_localVariables.get().end()) {
5858
return geode::Ok(it->second);
5959
}
6060

@@ -239,7 +239,7 @@ namespace rift {
239239
switch (iterValue.type()) {
240240
case Value::Type::String: {
241241
for (auto const& c : iterValue.toString()) {
242-
m_localVariables[var] = Value(std::string(1, c));
242+
m_localVariables.get()[var] = Value(std::string(1, c));
243243
auto res = visit(node.getBody());
244244
if (res.isErr()) {
245245
return res;
@@ -253,7 +253,7 @@ namespace rift {
253253
return node.error(fmt::format("For loop: {} -> {} : {} exceeds max iterations", var, iter.unwrap().toString(), maxIters));
254254
}
255255
for (auto const& val : arr) {
256-
m_localVariables[var] = val;
256+
m_localVariables.get()[var] = val;
257257
auto res = visit(node.getBody());
258258
if (res.isErr()) {
259259
return res;
@@ -267,7 +267,7 @@ namespace rift {
267267
return node.error(fmt::format("For loop: {} -> {} : {} exceeds max iterations", var, iter.unwrap().toString(), maxIters));
268268
}
269269
for (auto const& [key, val] : obj) {
270-
m_localVariables[var] = key;
270+
m_localVariables.get()[var] = key;
271271
auto res = visit(node.getBody());
272272
if (res.isErr()) {
273273
return res;
@@ -284,7 +284,7 @@ namespace rift {
284284
return node.error(fmt::format("For loop: {} -> {} : {} exceeds max iterations", var, iter.unwrap().toString(), maxIters));
285285
}
286286
for (int64_t i = 0; i < max; ++i) {
287-
m_localVariables[var] = Value(i);
287+
m_localVariables.get()[var] = Value(i);
288288
auto res = visit(node.getBody());
289289
if (res.isErr()) {
290290
return res;
@@ -319,7 +319,7 @@ namespace rift {
319319
return value;
320320
}
321321

322-
m_localVariables[node.getName()] = value.unwrap();
322+
m_localVariables.get()[node.getName()] = value.unwrap();
323323
return geode::Ok(std::move(value.unwrap()));
324324
}
325325
}

0 commit comments

Comments
 (0)