Mercurial Hosting > luan
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; }