view src/luan/LuanClosure.java @ 1347:643cf1c37723

move webserver to lib and bug fixes
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 25 Feb 2019 13:02:33 -0700
parents e0cf0d108a77
children 221eedb0f54e
line wrap: on
line source

package luan;

import luan.impl.Pointer;


public abstract class LuanClosure extends LuanFunction {
	public Pointer[] upValues;
	public boolean javaOk;
	public final String sourceName;

	public LuanClosure(Luan luan,int nUpValues,boolean javaOk,String sourceName) throws LuanException {
		super(luan);
		this.upValues = new Pointer[nUpValues];
		this.javaOk = javaOk;
		this.sourceName = sourceName;
	}

	@Override protected void completeClone(LuanFunction dc,LuanCloner cloner) {
		LuanClosure clone = (LuanClosure)dc;
		clone.upValues = (Pointer[])cloner.clone(upValues);
		super.completeClone(dc,cloner);
	}

	@Override public final Object call(Object[] args) throws LuanException {
		Luan luan = luan();
		luan.push(this);
		try {
			return doCall(luan,args);
		} catch(StackOverflowError e) {
			throw new LuanException( "stack overflow", e );
		} finally {
			luan.pop();
		}	
	}

	@Override public String toString() {
		return super.toString()+"="+sourceName;
	}

	public abstract Object doCall(Luan luan,Object[] args) throws LuanException;
}