From e6f463257720bee91a1b4954d97684dbb3398cbf Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 6 Oct 2015 16:24:37 +0100 Subject: Add support for constructors and fields --- .../org/zwobble/couscous/interpreter/Executor.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java') 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> { - 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 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> } private static Environment buildEnvironment( - final Environment environment, - final MethodNode method, - PositionalArguments arguments) { + final Environment environment, + final CallableNode method, + Optional 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> findDeclarations(method.getBody()).forEach(declaration -> stackFrame.declare(declaration)); - return environment.withStackFrame(stackFrame.build()); + return environment.withStackFrame(thisValue, stackFrame.build()); } private static Stream findDeclarations(List body) { -- cgit v1.2.3