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 }