aboutsummaryrefslogtreecommitdiffstats
path: root/clox/src
diff options
context:
space:
mode:
Diffstat (limited to 'clox/src')
-rw-r--r--clox/src/compiler.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/clox/src/compiler.c b/clox/src/compiler.c
index ea40d7e..b1e4811 100644
--- a/clox/src/compiler.c
+++ b/clox/src/compiler.c
@@ -444,6 +444,20 @@ static void printStatement() {
emitByte(OP_PRINT);
}
+static void returnStatement() {
+ if (current->type == TYPE_SCRIPT) {
+ error("Can't return from top-level code.");
+ }
+
+ if (match(TOKEN_SEMICOLON)) {
+ emitReturn();
+ } else {
+ expression();
+ consume(TOKEN_SEMICOLON, "Expect ';' after return value.");
+ emitByte(OP_RETURN);
+ }
+}
+
static void whileStatement() {
int loopStart = currentChunk()->count;
consume(TOKEN_LEFT_PAREN, "Expect '(' after 'while'.");
@@ -503,6 +517,8 @@ static void statement() {
forStatement();
} else if (match(TOKEN_IF)) {
ifStatement();
+ } else if (match(TOKEN_RETURN)) {
+ returnStatement();
} else if (match(TOKEN_WHILE)) {
whileStatement();
} else if (match(TOKEN_LEFT_BRACE)) {