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