comparison core/src/luan/impl/LuanCompiler.java @ 703:6e6e9e73abaa

cache classes in compiler
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 13 May 2016 14:51:05 -0600
parents b620b8e1010f
children 77e0c859c8a3
comparison
equal deleted inserted replaced
702:87970832a3c3 703:6e6e9e73abaa
1 package luan.impl; 1 package luan.impl;
2 2
3 import java.lang.ref.WeakReference;
4 import java.lang.reflect.InvocationTargetException;
3 import java.util.Map; 5 import java.util.Map;
4 import java.lang.reflect.InvocationTargetException; 6 import java.util.HashMap;
5 import luan.LuanFunction; 7 import luan.LuanFunction;
6 import luan.LuanState; 8 import luan.LuanState;
7 import luan.LuanException; 9 import luan.LuanException;
8 import luan.LuanTable; 10 import luan.LuanTable;
9 import luan.LuanJava; 11 import luan.LuanJava;
10 import luan.modules.JavaLuan; 12 import luan.modules.JavaLuan;
11 import luan.modules.PackageLuan; 13 import luan.modules.PackageLuan;
12 14
13 15
14 public final class LuanCompiler { 16 public final class LuanCompiler {
15 private LuanCompiler() {} // never 17 private static final Map<String,WeakReference<Class>> map = new HashMap<String,WeakReference<Class>>();
16 18
17 public static LuanFunction compile(String sourceText,String sourceName,LuanTable env) throws LuanException { 19 public static LuanFunction compile(String sourceText,String sourceName,LuanTable env) throws LuanException {
18 LuanParser parser = new LuanParser(sourceText,sourceName); 20 Class fnClass = env==null ? getClass(sourceText,sourceName) : getClass(sourceText,sourceName,env);
19 parser.addVar( "java" );
20 parser.addVar( "require" );
21 if( env != null ) parser.addVar( "_ENV" );
22 Class fnClass;
23 try {
24 fnClass = parser.RequiredModule();
25 } catch(ParseException e) {
26 //e.printStackTrace();
27 throw new LuanException( e.getFancyMessage() );
28 }
29 LuanJava java; 21 LuanJava java;
30 if( env == null ) { 22 if( env == null ) {
31 java = new LuanJava(); 23 java = new LuanJava();
32 } else { 24 } else {
33 java = env.java; 25 java = env.java;
52 closure.upValues[1].o = PackageLuan.requireFn; 44 closure.upValues[1].o = PackageLuan.requireFn;
53 if( env != null ) closure.upValues[2].o = env; 45 if( env != null ) closure.upValues[2].o = env;
54 return closure; 46 return closure;
55 } 47 }
56 48
49 private static synchronized Class getClass(String sourceText,String sourceName) throws LuanException {
50 String key = sourceName + "~~~" + sourceText;
51 WeakReference<Class> ref = map.get(key);
52 if( ref != null ) {
53 Class cls = ref.get();
54 if( cls != null )
55 return cls;
56 }
57 Class cls = getClass(sourceText,sourceName,null);
58 map.put(key,new WeakReference<Class>(cls));
59 return cls;
60 }
61
62 private static Class getClass(String sourceText,String sourceName,LuanTable env) throws LuanException {
63 LuanParser parser = new LuanParser(sourceText,sourceName);
64 parser.addVar( "java" );
65 parser.addVar( "require" );
66 if( env != null ) parser.addVar( "_ENV" );
67 try {
68 return parser.RequiredModule();
69 } catch(ParseException e) {
70 //e.printStackTrace();
71 throw new LuanException( e.getFancyMessage() );
72 }
73 }
74
57 public static String toJava(String sourceName,String sourceText) throws LuanException { 75 public static String toJava(String sourceName,String sourceText) throws LuanException {
58 LuanParser parser = new LuanParser(sourceName,sourceText); 76 LuanParser parser = new LuanParser(sourceName,sourceText);
59 parser.addVar( "java" ); 77 parser.addVar( "java" );
60 parser.addVar( "require" ); 78 parser.addVar( "require" );
61 try { 79 try {
63 } catch(ParseException e) { 81 } catch(ParseException e) {
64 throw new LuanException( e.getFancyMessage() ); 82 throw new LuanException( e.getFancyMessage() );
65 } 83 }
66 } 84 }
67 85
86 private LuanCompiler() {} // never
68 } 87 }