annotate core/src/luan/impl/ReturnStmt.java @ 615:abc3198c86dd

fix tail recursion bug; add Hosting.exists();
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 17 Dec 2015 01:53:48 -0700
parents 4723d22062ce
children 859c0dedc8b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 228
diff changeset
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
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 228
diff changeset
13 ReturnStmt(LuanElement el,Expressions expressions) {
b48cfa14ba60 improve stack trace
Franklin Schmidt <fschmidt@gmail.com>
parents: 228
diff changeset
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
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 460
diff changeset
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
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 460
diff changeset
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 }