annotate src/luan/impl/LuanCompiler.java @ 1335:e0cf0d108a77

major cleanup
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 14 Feb 2019 03:10:45 -0700
parents 25746915a241
children 8d95711f6615
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
166
4eaee12f6c65 move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 165
diff changeset
1 package luan.impl;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
3 import java.lang.ref.WeakReference;
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
4 import java.lang.reflect.InvocationTargetException;
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
5 import java.util.Map;
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
6 import java.util.HashMap;
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
7 import luan.Luan;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
8 import luan.LuanFunction;
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9 import luan.LuanException;
86
6db8f286fa6c _ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 80
diff changeset
10 import luan.LuanTable;
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
11 import luan.LuanClosure;
321
7f7708e8fdd4 remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 320
diff changeset
12 import luan.modules.JavaLuan;
7f7708e8fdd4 remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 320
diff changeset
13 import luan.modules.PackageLuan;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
14
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16 public final class LuanCompiler {
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
17 private static final Map<String,WeakReference<Class>> map = new HashMap<String,WeakReference<Class>>();
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
19 public static LuanFunction compile(Luan luan,String sourceText,String sourceName,LuanTable env) throws LuanException {
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
20 Class fnClass = env==null ? getClass(sourceText,sourceName) : getClass(sourceText,sourceName,env);
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
21 boolean javaOk = false;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
22 if( env != null && env.closure != null )
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
23 javaOk = env.closure.javaOk;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
24 LuanClosure closure;
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
25 try {
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
26 closure = (LuanClosure)fnClass.getConstructor(Luan.class,Boolean.TYPE,String.class).newInstance(luan,javaOk,sourceName);
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
27 } catch(NoSuchMethodException e) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
28 throw new RuntimeException(e);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
29 } catch(InstantiationException e) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
30 throw new RuntimeException(e);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
31 } catch(IllegalAccessException e) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
32 throw new RuntimeException(e);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
33 } catch(InvocationTargetException e) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
34 throw new RuntimeException(e);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 649
diff changeset
35 }
1335
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
36 closure.upValues[0].o = JavaLuan.javaFn(luan);
e0cf0d108a77 major cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1333
diff changeset
37 closure.upValues[1].o = PackageLuan.requireFn(luan);
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
38 if( env != null ) {
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
39 closure.upValues[2].o = env;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
40 env.closure = closure;
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
41 }
670
58ebfec6178b all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents: 667
diff changeset
42 return closure;
128
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
43 }
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
44
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
45 private static synchronized Class getClass(String sourceText,String sourceName) throws LuanException {
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
46 String key = sourceName + "~~~" + sourceText;
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
47 WeakReference<Class> ref = map.get(key);
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
48 if( ref != null ) {
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
49 Class cls = ref.get();
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
50 if( cls != null )
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
51 return cls;
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
52 }
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
53 Class cls = getClass(sourceText,sourceName,null);
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
54 map.put(key,new WeakReference<Class>(cls));
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
55 return cls;
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
56 }
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
57
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
58 private static Class getClass(String sourceText,String sourceName,LuanTable env) throws LuanException {
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
59 LuanParser parser = new LuanParser(sourceText,sourceName);
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
60 parser.addVar( "java" );
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
61 parser.addVar( "require" );
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
62 if( env != null ) parser.addVar( "_ENV" );
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
63 try {
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
64 return parser.RequiredModule();
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
65 } catch(ParseException e) {
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
66 //e.printStackTrace();
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
67 throw new LuanException( e.getFancyMessage() );
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
68 }
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
69 }
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
70
708
77e0c859c8a3 fix luan_to_java and fix line numbers
Franklin Schmidt <fschmidt@gmail.com>
parents: 703
diff changeset
71 public static String toJava(String sourceText,String sourceName) throws LuanException {
77e0c859c8a3 fix luan_to_java and fix line numbers
Franklin Schmidt <fschmidt@gmail.com>
parents: 703
diff changeset
72 LuanParser parser = new LuanParser(sourceText,sourceName);
678
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
73 parser.addVar( "java" );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
74 parser.addVar( "require" );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
75 try {
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
76 return parser.RequiredModuleSource();
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
77 } catch(ParseException e) {
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
78 throw new LuanException( e.getFancyMessage() );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
79 }
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
80 }
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
81
703
6e6e9e73abaa cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents: 694
diff changeset
82 private LuanCompiler() {} // never
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
83 }