view src/luan/LuanClosure.java @ 1400:221eedb0f54e

fix inner class gc bug
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 13 Sep 2019 05:05:51 -0600
parents 643cf1c37723
children e1a13e707bf3
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,Pointer[] upValues,boolean javaOk,String sourceName) throws LuanException {
		super(luan);
		this.upValues = upValues;
		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;
}