Mercurial Hosting > luan
annotate 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 |
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; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 import luan.LuanFunction; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import luan.LuanState; |
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; |
1133 | 11 import luan.LuanJavaOk; |
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 |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
691
diff
changeset
|
19 public static LuanFunction compile(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); |
1133 | 21 LuanJavaOk javaOk; |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
22 if( env == null ) { |
1133 | 23 javaOk = new LuanJavaOk(); |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
24 } else { |
1133 | 25 javaOk = env.javaOk; |
26 if( javaOk == null ) { | |
27 javaOk = new LuanJavaOk(); | |
28 env.javaOk = javaOk; | |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
29 } |
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
30 } |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
667
diff
changeset
|
31 Closure closure; |
667
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
32 try { |
1133 | 33 closure = (Closure)fnClass.getConstructor(LuanJavaOk.class).newInstance(javaOk); |
667
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
34 } catch(NoSuchMethodException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
35 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
36 } catch(InstantiationException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
37 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
38 } catch(IllegalAccessException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
39 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
40 } catch(InvocationTargetException e) { |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
41 throw new RuntimeException(e); |
08966099aa6d
implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
42 } |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
43 closure.upValues[0].o = JavaLuan.javaFn; |
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
44 closure.upValues[1].o = PackageLuan.requireFn; |
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
670
diff
changeset
|
45 if( env != null ) closure.upValues[2].o = env; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
667
diff
changeset
|
46 return closure; |
128
f0a4abe58593
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
111
diff
changeset
|
47 } |
f0a4abe58593
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
111
diff
changeset
|
48 |
703
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
49 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
|
50 String key = sourceName + "~~~" + sourceText; |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
51 WeakReference<Class> ref = map.get(key); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
52 if( ref != null ) { |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
53 Class cls = ref.get(); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
54 if( cls != null ) |
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 Class cls = getClass(sourceText,sourceName,null); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
58 map.put(key,new WeakReference<Class>(cls)); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
59 return cls; |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
60 } |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
61 |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
62 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
|
63 LuanParser parser = new LuanParser(sourceText,sourceName); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
64 parser.addVar( "java" ); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
65 parser.addVar( "require" ); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
66 if( env != null ) parser.addVar( "_ENV" ); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
67 try { |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
68 return parser.RequiredModule(); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
69 } catch(ParseException e) { |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
70 //e.printStackTrace(); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
71 throw new LuanException( e.getFancyMessage() ); |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
72 } |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
73 } |
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
74 |
708
77e0c859c8a3
fix luan_to_java and fix line numbers
Franklin Schmidt <fschmidt@gmail.com>
parents:
703
diff
changeset
|
75 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
|
76 LuanParser parser = new LuanParser(sourceText,sourceName); |
678 | 77 parser.addVar( "java" ); |
78 parser.addVar( "require" ); | |
79 try { | |
80 return parser.RequiredModuleSource(); | |
81 } catch(ParseException e) { | |
82 throw new LuanException( e.getFancyMessage() ); | |
83 } | |
84 } | |
85 | |
703
6e6e9e73abaa
cache classes in compiler
Franklin Schmidt <fschmidt@gmail.com>
parents:
694
diff
changeset
|
86 private LuanCompiler() {} // never |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
87 } |