diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:24:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:24:37 +0100 |
| commit | e6f463257720bee91a1b4954d97684dbb3398cbf (patch) | |
| tree | c8d1f04dfe8928d33361108aefee7e7572dae1c7 /src/main/java/org/zwobble/couscous/interpreter/Executor.java | |
| parent | 9685c8fb7fa14d5b75d828f8443dd948715ac4af (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.java | 20 |
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) { |
