Mercurial Hosting > luan
view src/luan/impl/LuanCompiler.java @ 1133:ba4daf107e07
fix security bug
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 17 Jan 2018 20:59:42 -0700 |
parents | 1a68fc55a80c |
children | f41919741100 |
line wrap: on
line source
package luan.impl; import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.HashMap; import luan.LuanFunction; import luan.LuanState; import luan.LuanException; import luan.LuanTable; import luan.LuanJavaOk; import luan.modules.JavaLuan; import luan.modules.PackageLuan; public final class LuanCompiler { private static final Map<String,WeakReference<Class>> map = new HashMap<String,WeakReference<Class>>(); public static LuanFunction compile(String sourceText,String sourceName,LuanTable env) throws LuanException { Class fnClass = env==null ? getClass(sourceText,sourceName) : getClass(sourceText,sourceName,env); LuanJavaOk javaOk; if( env == null ) { javaOk = new LuanJavaOk(); } else { javaOk = env.javaOk; if( javaOk == null ) { javaOk = new LuanJavaOk(); env.javaOk = javaOk; } } Closure closure; try { closure = (Closure)fnClass.getConstructor(LuanJavaOk.class).newInstance(javaOk); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } catch(InstantiationException e) { throw new RuntimeException(e); } catch(IllegalAccessException e) { throw new RuntimeException(e); } catch(InvocationTargetException e) { throw new RuntimeException(e); } closure.upValues[0].o = JavaLuan.javaFn; closure.upValues[1].o = PackageLuan.requireFn; if( env != null ) closure.upValues[2].o = env; return closure; } private static synchronized Class getClass(String sourceText,String sourceName) throws LuanException { String key = sourceName + "~~~" + sourceText; WeakReference<Class> ref = map.get(key); if( ref != null ) { Class cls = ref.get(); if( cls != null ) return cls; } Class cls = getClass(sourceText,sourceName,null); map.put(key,new WeakReference<Class>(cls)); return cls; } private static Class getClass(String sourceText,String sourceName,LuanTable env) throws LuanException { LuanParser parser = new LuanParser(sourceText,sourceName); parser.addVar( "java" ); parser.addVar( "require" ); if( env != null ) parser.addVar( "_ENV" ); try { return parser.RequiredModule(); } catch(ParseException e) { //e.printStackTrace(); throw new LuanException( e.getFancyMessage() ); } } public static String toJava(String sourceText,String sourceName) throws LuanException { LuanParser parser = new LuanParser(sourceText,sourceName); parser.addVar( "java" ); parser.addVar( "require" ); try { return parser.RequiredModuleSource(); } catch(ParseException e) { throw new LuanException( e.getFancyMessage() ); } } private LuanCompiler() {} // never }