aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Executor.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-06 16:24:37 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-06 16:24:37 +0100
commite6f463257720bee91a1b4954d97684dbb3398cbf (patch)
treec8d1f04dfe8928d33361108aefee7e7572dae1c7 /src/main/java/org/zwobble/couscous/interpreter/Executor.java
parent9685c8fb7fa14d5b75d828f8443dd948715ac4af (diff)
Add support for constructors and fields
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index e9304cb..5c26244 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -4,9 +4,9 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
+import org.zwobble.couscous.ast.CallableNode;
import org.zwobble.couscous.ast.ExpressionStatementNode;
import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
-import org.zwobble.couscous.ast.MethodNode;
import org.zwobble.couscous.ast.ReturnNode;
import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.ast.VariableNode;
@@ -19,8 +19,13 @@ import static org.zwobble.couscous.interpreter.Evaluator.eval;
import lombok.val;
public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> {
- public static InterpreterValue callMethod(Environment environment, MethodNode method, PositionalArguments arguments) {
- val innerEnvironment = buildEnvironment(environment, method, arguments);
+ public static InterpreterValue callMethod(
+ Environment environment,
+ CallableNode method,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments arguments) {
+
+ val innerEnvironment = buildEnvironment(environment, method, thisValue, arguments);
for (val statement : method.getBody()) {
val result = exec(innerEnvironment, statement);
@@ -32,9 +37,10 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
}
private static Environment buildEnvironment(
- final Environment environment,
- final MethodNode method,
- PositionalArguments arguments) {
+ final Environment environment,
+ final CallableNode method,
+ Optional<InterpreterValue> thisValue,
+ PositionalArguments arguments) {
val stackFrame = new StackFrameBuilder();
for (int index = 0; index < method.getArguments().size(); index++) {
@@ -44,7 +50,7 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
findDeclarations(method.getBody()).forEach(declaration ->
stackFrame.declare(declaration));
- return environment.withStackFrame(stackFrame.build());
+ return environment.withStackFrame(thisValue, stackFrame.build());
}
private static Stream<VariableNode> findDeclarations(List<StatementNode> body) {