Mercurial Hosting > luan
annotate core/src/luan/impl/ReturnStmt.java @ 645:859c0dedc8b6
remove LuanSource
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 29 Mar 2016 18:09:51 -0600 |
parents | abc3198c86dd |
children | 8e8c30b72e9b |
rev | line source |
---|---|
166
4eaee12f6c65
move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
1 package luan.impl; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
3 import luan.Luan; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
4 import luan.LuanException; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
5 import luan.LuanFunction; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 |
40
e3624b7cd603
implement stack trace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
8 final class ReturnStmt extends CodeImpl implements Stmt { |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
9 private final Expressions expressions; |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 boolean throwReturnException = true; |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 |
645 | 12 ReturnStmt(Expressions expressions) { |
615
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
13 this.expressions = expressions; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
49
8ede219cd111
add WebShell
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
48
diff
changeset
|
16 @Override public void eval(LuanStateImpl luan) throws LuanException { |
615
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
17 if( !(expressions instanceof FnCall) ) { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
18 luan.returnValues = expressions.eval(luan); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
19 } else { // tail call |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
20 FnCall tailFnCall = (FnCall)expressions; |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
21 LuanFunction tailFn = luan.checkFunction( tailFnCall.fnExpr.eval(luan) ); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
22 luan.returnValues = tailFnCall.args.eval(luan); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
23 if( tailFn instanceof Closure ) { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
24 luan.tailFn = (Closure)tailFn; |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
25 } else { |
645 | 26 luan.returnValues = tailFn.call(luan,Luan.array(luan.returnValues)); |
22
1e37f22a34c8
proper tail calls
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
21
diff
changeset
|
27 } |
1e37f22a34c8
proper tail calls
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
21
diff
changeset
|
28 } |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
29 if( throwReturnException ) |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
30 throw new ReturnException(); |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
32 } |