diff src/luan/interp/ExpList.java @ 3:7a2cdbc5767f

add LuaState git-svn-id: https://luan-java.googlecode.com/svn/trunk@4 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 16 Nov 2012 05:23:12 +0000
parents 4da26b11d12a
children b7d7069fee58
line wrap: on
line diff
--- a/src/luan/interp/ExpList.java	Wed Nov 14 08:53:25 2012 +0000
+++ b/src/luan/interp/ExpList.java	Fri Nov 16 05:23:12 2012 +0000
@@ -2,13 +2,15 @@
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Collections;
 import luan.LuaException;
+import luan.LuaState;
 
 
 final class ExpList extends Values {
 
 	private interface Adder {
-		public void addTo(List<Object> list) throws LuaException;
+		public void addTo(LuaState lua,List<Object> list) throws LuaException;
 	}
 
 	private static class ExprAdder implements Adder {
@@ -18,8 +20,8 @@
 			this.expr = expr;
 		}
 
-		public void addTo(List<Object> list) throws LuaException {
-			list.add( expr.eval() );
+		public void addTo(LuaState lua,List<Object> list) throws LuaException {
+			list.add( expr.eval(lua) );
 		}
 
 	}
@@ -31,8 +33,8 @@
 			this.values = values;
 		}
 
-		public void addTo(List<Object> list) throws LuaException {
-			for( Object val : values.eval() ) {
+		public void addTo(LuaState lua,List<Object> list) throws LuaException {
+			for( Object val : values.eval(lua) ) {
 				list.add( val );
 			}
 		}
@@ -50,21 +52,50 @@
 			adders.add( new ValuesAdder(values) );
 		}
 
-		ExpList build() {
+		Values build() {
+			if( adders.isEmpty() )
+				return emptyExpList;
+			if( adders.size() == 1 ) {
+				Adder adder = adders.get(0);
+				if( adder instanceof ValuesAdder ) {
+					ValuesAdder va = (ValuesAdder)adder;
+					return va.values;
+				}
+				ExprAdder ea = (ExprAdder)adder;
+				return new SingleExpList(ea.expr);
+			}
 			return new ExpList( adders.toArray(new Adder[0]) );
 		}
 	}
 
+	private static final Values emptyExpList = new Values() {
+		List eval(LuaState lua) {
+			return Collections.emptyList();
+		}
+	};
+
+	private static class SingleExpList extends Values {
+		private final Expr expr;
+
+		SingleExpList(Expr expr) {
+			this.expr = expr;
+		}
+
+		List eval(LuaState lua) throws LuaException {
+			return Collections.singletonList( expr.eval(lua) );
+		}
+	}
+
 	private final Adder[] adders;
 
 	private ExpList(Adder[] adders) {
 		this.adders = adders;
 	}
 
-	List eval() throws LuaException {
+	List eval(LuaState lua) throws LuaException {
 		List<Object> list = new ArrayList<Object>();
 		for( Adder adder : adders ) {
-			adder.addTo(list);
+			adder.addTo(lua,list);
 		}
 		return list;
 	}