Mercurial Hosting > luan
annotate core/src/luan/impl/ReturnStmt.java @ 623:d592bf0947a9
remove "~a" idea
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 07 Jan 2016 03:58:51 -0700 |
parents | abc3198c86dd |
children | 859c0dedc8b6 |
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; |
460 | 6 import luan.LuanElement; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 |
40
e3624b7cd603
implement stack trace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
9 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
|
10 private final Expressions expressions; |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 boolean throwReturnException = true; |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 |
460 | 13 ReturnStmt(LuanElement el,Expressions expressions) { |
14 super(el); | |
615
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
15 this.expressions = expressions; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 |
49
8ede219cd111
add WebShell
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
48
diff
changeset
|
18 @Override public void eval(LuanStateImpl luan) throws LuanException { |
615
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
19 if( !(expressions instanceof FnCall) ) { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
20 luan.returnValues = expressions.eval(luan); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
21 } else { // tail call |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
22 FnCall tailFnCall = (FnCall)expressions; |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
23 LuanFunction tailFn = luan.checkFunction( tailFnCall.fnExpr.eval(luan) ); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
24 luan.returnValues = tailFnCall.args.eval(luan); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
25 if( tailFn instanceof Closure ) { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
26 luan.tailFn = (Closure)tailFn; |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
27 } else { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
28 luan.push(el,tailFnCall.fnName); |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
29 try { |
576 | 30 luan.returnValues = tailFn.call(luan,Luan.array(luan.returnValues)); |
615
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
31 } finally { |
abc3198c86dd
fix tail recursion bug;
Franklin Schmidt <fschmidt@gmail.com>
parents:
576
diff
changeset
|
32 luan.pop(); |
576 | 33 } |
22
1e37f22a34c8
proper tail calls
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
21
diff
changeset
|
34 } |
1e37f22a34c8
proper tail calls
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
21
diff
changeset
|
35 } |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
36 if( throwReturnException ) |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
37 throw new ReturnException(); |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
38 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
39 } |