view src/luan/interp/LuanCompiler.java @ 111:2428ecfed375

change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection git-svn-id: https://luan-java.googlecode.com/svn/trunk@112 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 23 May 2014 20:40:05 +0000
parents 3c404a296995
children f0a4abe58593
line wrap: on
line source

package luan.interp;

import luan.LuanFunction;
import luan.LuanState;
import luan.LuanException;
import luan.LuanSource;
import luan.LuanElement;
import luan.LuanTable;
import luan.parser.ParseException;
import java.util.Map;


public final class LuanCompiler {
	private LuanCompiler() {}  // never

	public static LuanFunction compileModule(LuanState luan,LuanSource src) throws LuanException {
		UpValue.Getter envGetter = new UpValue.EnvGetter();
		LuanParser parser = new LuanParser(src,envGetter);
		for( Map.Entry<Object,Object> entry : luan.global() ) {
			Object key = entry.getKey();
			if( key instanceof String )
				parser.addVar( (String)key, entry.getValue() );
		}
		try {
			FnDef fnDef = parser.RequiredModule();
			final Closure c = new Closure((LuanStateImpl)luan,fnDef);
			return new LuanFunction() {
				@Override public Object call(LuanState luan,Object[] args) throws LuanException {
					Object rtn = c.call(luan,args);
					if( rtn instanceof Object[] && ((Object[])rtn).length==0 )
						rtn = c.upValues()[0].get();
					return rtn;
				}
			};
		} catch(ParseException e) {
//e.printStackTrace();
			LuanElement le = new LuanSource.CompilerElement(src);
			throw luan.bit(le).exception( e.getFancyMessage() );
		}
	}

	public static LuanFunction compileInteractive(LuanState luan,LuanSource src) throws LuanException {
		UpValue.Getter envGetter = UpValue.globalGetter;
		LuanParser parser = new LuanParser(src,envGetter);
		try {
			FnDef fnDef = parser.Expressions();
			if( fnDef == null )
				fnDef = parser.RequiredModule();
			return new Closure((LuanStateImpl)luan,fnDef);
		} catch(ParseException e) {
//e.printStackTrace();
			LuanElement le = new LuanSource.CompilerElement(src);
			throw luan.bit(le).exception( e.getFancyMessage() );
		}
	}

	public static LuanState newLuanState() {
		return new LuanStateImpl();
	}
}