comparison 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
comparison
equal deleted inserted replaced
2:4da26b11d12a 3:7a2cdbc5767f
1 package luan.interp; 1 package luan.interp;
2 2
3 import java.util.List; 3 import java.util.List;
4 import java.util.ArrayList; 4 import java.util.ArrayList;
5 import java.util.Collections;
5 import luan.LuaException; 6 import luan.LuaException;
7 import luan.LuaState;
6 8
7 9
8 final class ExpList extends Values { 10 final class ExpList extends Values {
9 11
10 private interface Adder { 12 private interface Adder {
11 public void addTo(List<Object> list) throws LuaException; 13 public void addTo(LuaState lua,List<Object> list) throws LuaException;
12 } 14 }
13 15
14 private static class ExprAdder implements Adder { 16 private static class ExprAdder implements Adder {
15 private final Expr expr; 17 private final Expr expr;
16 18
17 ExprAdder(Expr expr) { 19 ExprAdder(Expr expr) {
18 this.expr = expr; 20 this.expr = expr;
19 } 21 }
20 22
21 public void addTo(List<Object> list) throws LuaException { 23 public void addTo(LuaState lua,List<Object> list) throws LuaException {
22 list.add( expr.eval() ); 24 list.add( expr.eval(lua) );
23 } 25 }
24 26
25 } 27 }
26 28
27 private static class ValuesAdder implements Adder { 29 private static class ValuesAdder implements Adder {
29 31
30 ValuesAdder(Values values) { 32 ValuesAdder(Values values) {
31 this.values = values; 33 this.values = values;
32 } 34 }
33 35
34 public void addTo(List<Object> list) throws LuaException { 36 public void addTo(LuaState lua,List<Object> list) throws LuaException {
35 for( Object val : values.eval() ) { 37 for( Object val : values.eval(lua) ) {
36 list.add( val ); 38 list.add( val );
37 } 39 }
38 } 40 }
39 41
40 } 42 }
48 50
49 void add(Values values) { 51 void add(Values values) {
50 adders.add( new ValuesAdder(values) ); 52 adders.add( new ValuesAdder(values) );
51 } 53 }
52 54
53 ExpList build() { 55 Values build() {
56 if( adders.isEmpty() )
57 return emptyExpList;
58 if( adders.size() == 1 ) {
59 Adder adder = adders.get(0);
60 if( adder instanceof ValuesAdder ) {
61 ValuesAdder va = (ValuesAdder)adder;
62 return va.values;
63 }
64 ExprAdder ea = (ExprAdder)adder;
65 return new SingleExpList(ea.expr);
66 }
54 return new ExpList( adders.toArray(new Adder[0]) ); 67 return new ExpList( adders.toArray(new Adder[0]) );
68 }
69 }
70
71 private static final Values emptyExpList = new Values() {
72 List eval(LuaState lua) {
73 return Collections.emptyList();
74 }
75 };
76
77 private static class SingleExpList extends Values {
78 private final Expr expr;
79
80 SingleExpList(Expr expr) {
81 this.expr = expr;
82 }
83
84 List eval(LuaState lua) throws LuaException {
85 return Collections.singletonList( expr.eval(lua) );
55 } 86 }
56 } 87 }
57 88
58 private final Adder[] adders; 89 private final Adder[] adders;
59 90
60 private ExpList(Adder[] adders) { 91 private ExpList(Adder[] adders) {
61 this.adders = adders; 92 this.adders = adders;
62 } 93 }
63 94
64 List eval() throws LuaException { 95 List eval(LuaState lua) throws LuaException {
65 List<Object> list = new ArrayList<Object>(); 96 List<Object> list = new ArrayList<Object>();
66 for( Adder adder : adders ) { 97 for( Adder adder : adders ) {
67 adder.addTo(list); 98 adder.addTo(lua,list);
68 } 99 }
69 return list; 100 return list;
70 } 101 }
71 } 102 }