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
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;
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
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
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
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
21 LuanJavaOk javaOk;
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 670
diff changeset
22 if( env == null ) {
1133
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
23 javaOk = new LuanJavaOk();
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 670
diff changeset
24 } else {
1133
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
25 javaOk = env.javaOk;
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
26 if( javaOk == null ) {
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
27 javaOk = new LuanJavaOk();
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
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
ba4daf107e07 fix security bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
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
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 111
diff changeset
47 }
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
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
77 parser.addVar( "java" );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
78 parser.addVar( "require" );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
79 try {
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
80 return parser.RequiredModuleSource();
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
81 } catch(ParseException e) {
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
82 throw new LuanException( e.getFancyMessage() );
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
83 }
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
84 }
49f3d290bebd add luan_to_java
Franklin Schmidt <fschmidt@gmail.com>
parents: 675
diff changeset
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 }