Mercurial Hosting > luan
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 } |