view src/luan/interp/FnDef.java @ 157:1de3e4a6e82d

remove LuanJavaFunction.RTN_NUMBER_ARRAY; add request.java and response.java; convert java Object[] members to List; let LuanState.eval() take env; improve web_run.luan; rename LuanParser.JspExpressions to TemplateExpressions and add TemplateStmt; git-svn-id: https://luan-java.googlecode.com/svn/trunk@158 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Wed, 18 Jun 2014 21:07:11 +0000
parents 6db8f286fa6c
children
line wrap: on
line source

package luan.interp;

import luan.LuanException;
import luan.LuanSource;


final class FnDef extends CodeImpl implements Expr {
	final Stmt block;
	final int stackSize;
	final int numArgs;
	final boolean isVarArg;
	final UpValue.Getter[] upValueGetters;

	FnDef(LuanSource.Element se,Stmt block,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) {
		super(se);
		this.block = block;
		this.stackSize = stackSize;
		this.numArgs = numArgs;
		this.isVarArg = isVarArg;
		this.upValueGetters = upValueGetters;
		fixReturns(block);
	}

	private static void fixReturns(Stmt stmt) {
		if( stmt instanceof ReturnStmt ) {
			ReturnStmt rs = (ReturnStmt)stmt;
			rs.throwReturnException = false;
		} else if( stmt instanceof Block ) {
			Block b = (Block)stmt;
			fixReturns( b.stmts[b.stmts.length-1] );
		} else if( stmt instanceof IfStmt ) {
			IfStmt is = (IfStmt)stmt;
			fixReturns( is.thenStmt );
			fixReturns( is.elseStmt );
		}
	}

	@Override public Object eval(LuanStateImpl luan) throws LuanException {
		return new Closure(luan,this);
	}

}