changeset 23:2446c1755d9b

minor git-svn-id: https://luan-java.googlecode.com/svn/trunk@24 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 06 Dec 2012 00:35:13 +0000
parents 1e37f22a34c8
children 7ee247560db5
files src/luan/interp/Block.java src/luan/interp/Chunk.java src/luan/interp/IfStmt.java
diffstat 3 files changed, 15 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
diff -r 1e37f22a34c8 -r 2446c1755d9b src/luan/interp/Block.java
--- a/src/luan/interp/Block.java	Wed Dec 05 09:03:50 2012 +0000
+++ b/src/luan/interp/Block.java	Thu Dec 06 00:35:13 2012 +0000
@@ -10,6 +10,8 @@
 	private final int stackEnd;
 
 	Block(Stmt[] stmts,int stackStart,int stackEnd) {
+		if( stmts.length==0 )
+			throw new RuntimeException("empty block");
 		this.stmts = stmts;
 		this.stackStart = stackStart;
 		this.stackEnd = stackEnd;
diff -r 1e37f22a34c8 -r 2446c1755d9b src/luan/interp/Chunk.java
--- a/src/luan/interp/Chunk.java	Wed Dec 05 09:03:50 2012 +0000
+++ b/src/luan/interp/Chunk.java	Thu Dec 06 00:35:13 2012 +0000
@@ -14,16 +14,20 @@
 		this.block = block;
 		this.stackSize = stackSize;
 		this.numArgs = numArgs;
-		Stmt stmt = block;
-		while( stmt instanceof Block ) {
-			Block b = (Block)stmt;
-			if( b.stmts.length==0 )
-				break;
-			stmt = b.stmts[b.stmts.length-1];
-		}
+		fixReturns(block);
+	}
+
+	private static void fixReturns(Stmt stmt) {
 		if( stmt instanceof ReturnStmt ) {
 			ReturnStmt rs = (ReturnStmt)stmt;
 			rs.throwReturnException = false;
+		} else if( stmt instanceof Block ) {
+			Block b = (Block)stmt;
+			fixReturns( b.stmts[b.stmts.length-1] );
+		} else if( stmt instanceof IfStmt ) {
+			IfStmt is = (IfStmt)stmt;
+			fixReturns( is.thenStmt );
+			fixReturns( is.elseStmt );
 		}
 	}
 
diff -r 1e37f22a34c8 -r 2446c1755d9b src/luan/interp/IfStmt.java
--- a/src/luan/interp/IfStmt.java	Wed Dec 05 09:03:50 2012 +0000
+++ b/src/luan/interp/IfStmt.java	Thu Dec 06 00:35:13 2012 +0000
@@ -7,8 +7,8 @@
 
 final class IfStmt implements Stmt {
 	private final Expr cnd;
-	private final Stmt thenStmt;
-	private final Stmt elseStmt;
+	final Stmt thenStmt;
+	final Stmt elseStmt;
 
 	IfStmt(Expr cnd,Stmt thenStmt,Stmt elseStmt) {
 		this.cnd = cnd;