changeset 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 9ecf5673fb6d
children 56b0b9018319
files core/src/luan/impl/ReturnStmt.java core/src/luan/modules/host/Hosting.luan
diffstat 2 files changed, 20 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/impl/ReturnStmt.java	Mon Dec 14 23:55:36 2015 -0700
+++ b/core/src/luan/impl/ReturnStmt.java	Thu Dec 17 01:53:48 2015 -0700
@@ -8,35 +8,29 @@
 
 final class ReturnStmt extends CodeImpl implements Stmt {
 	private final Expressions expressions;
-	private final Expr tailFnExpr;
 	boolean throwReturnException = true;
 
 	ReturnStmt(LuanElement el,Expressions expressions) {
 		super(el);
-		if( expressions instanceof FnCall ) {  // tail call
-			FnCall fnCall = (FnCall)expressions;
-			this.expressions = fnCall.args;
-			this.tailFnExpr = fnCall.fnExpr;
-		} else {
-			this.expressions = expressions;
-			this.tailFnExpr = null;
-		}
+		this.expressions = expressions;
 	}
 
 	@Override public void eval(LuanStateImpl luan) throws LuanException {
-		luan.returnValues = expressions.eval(luan);
-		if( tailFnExpr != null ) {
-			LuanElement elTail = tailFnExpr.el();
-			luan.push(elTail,elTail.text());
-			try {
-				LuanFunction tailFn = luan.checkFunction( tailFnExpr.eval(luan) );
-				if( tailFn instanceof Closure ) {
-					luan.tailFn = (Closure)tailFn;
-				} else {
+		if( !(expressions instanceof FnCall) ) {
+			luan.returnValues = expressions.eval(luan);
+		} else {  // tail call
+			FnCall tailFnCall = (FnCall)expressions;
+			LuanFunction tailFn = luan.checkFunction( tailFnCall.fnExpr.eval(luan) );
+			luan.returnValues = tailFnCall.args.eval(luan);
+			if( tailFn instanceof Closure ) {
+				luan.tailFn = (Closure)tailFn;
+			} else {
+				luan.push(el,tailFnCall.fnName);
+				try {
 					luan.returnValues =  tailFn.call(luan,Luan.array(luan.returnValues));
+				} finally {
+					luan.pop();
 				}
-			} finally {
-				luan.pop();
 			}
 		}
 		if( throwReturnException )
--- a/core/src/luan/modules/host/Hosting.luan	Mon Dec 14 23:55:36 2015 -0700
+++ b/core/src/luan/modules/host/Hosting.luan	Thu Dec 17 01:53:48 2015 -0700
@@ -63,4 +63,10 @@
 	host.delete(domain,password)
 end
 
+function M.exists(domain)
+	local socket = "socket:" .. domain .. ":" .. M.port
+	local host = Rpc.remote(socket)
+	return host.exists(domain)
+end
+
 return M