Mercurial Hosting > luan
comparison src/luan/interp/ExpList.java @ 111:2428ecfed375
change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
git-svn-id: https://luan-java.googlecode.com/svn/trunk@112 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 23 May 2014 20:40:05 +0000 |
parents | dbf459397217 |
children | 14281d5bd36f |
comparison
equal
deleted
inserted
replaced
110:7afa6df829f3 | 111:2428ecfed375 |
---|---|
37 ExpressionsAdder(Expressions expressions) { | 37 ExpressionsAdder(Expressions expressions) { |
38 this.expressions = expressions; | 38 this.expressions = expressions; |
39 } | 39 } |
40 | 40 |
41 public void addTo(LuanStateImpl luan,List<Object> list) throws LuanException { | 41 public void addTo(LuanStateImpl luan,List<Object> list) throws LuanException { |
42 for( Object val : expressions.eval(luan) ) { | 42 Object obj = expressions.eval(luan); |
43 list.add( val ); | 43 if( obj instanceof Object[] ) { |
44 for( Object val : (Object[])obj ) { | |
45 list.add( val ); | |
46 } | |
47 } else { | |
48 list.add(obj); | |
44 } | 49 } |
45 } | 50 } |
46 | 51 |
47 public Code code() { | 52 public Code code() { |
48 return expressions; | 53 return expressions; |
113 | 118 |
114 SingleExpList(Expr expr) { | 119 SingleExpList(Expr expr) { |
115 this.expr = expr; | 120 this.expr = expr; |
116 } | 121 } |
117 | 122 |
118 @Override public Object[] eval(LuanStateImpl luan) throws LuanException { | 123 @Override public Object eval(LuanStateImpl luan) throws LuanException { |
119 return new Object[]{expr.eval(luan)}; | 124 return expr.eval(luan); |
120 } | 125 } |
121 | 126 |
122 @Override public LuanSource.Element se() { | 127 @Override public LuanSource.Element se() { |
123 return expr.se(); | 128 return expr.se(); |
124 } | 129 } |
128 | 133 |
129 private ExpList(Adder[] adders) { | 134 private ExpList(Adder[] adders) { |
130 this.adders = adders; | 135 this.adders = adders; |
131 } | 136 } |
132 | 137 |
133 @Override public Object[] eval(LuanStateImpl luan) throws LuanException { | 138 @Override public Object eval(LuanStateImpl luan) throws LuanException { |
134 List<Object> list = new ArrayList<Object>(); | 139 List<Object> list = new ArrayList<Object>(); |
135 for( Adder adder : adders ) { | 140 for( Adder adder : adders ) { |
136 adder.addTo(luan,list); | 141 adder.addTo(luan,list); |
137 } | 142 } |
138 return list.toArray(); | 143 switch( list.size() ) { |
144 case 0: | |
145 return EMPTY; | |
146 case 1: | |
147 return list.get(0); | |
148 default: | |
149 return list.toArray(); | |
150 } | |
139 } | 151 } |
140 | 152 |
141 @Override public LuanSource.Element se() { | 153 @Override public LuanSource.Element se() { |
142 return new LuanSource.Element(adders[0].code().se().source,adders[0].code().se().start,adders[adders.length-1].code().se().end); | 154 return new LuanSource.Element(adders[0].code().se().source,adders[0].code().se().start,adders[adders.length-1].code().se().end); |
143 } | 155 } |