Mercurial Hosting > luan
comparison core/src/luan/modules/JavaLuan.java @ 300:9fb523472035
add java() to control java access
git-svn-id: https://luan-java.googlecode.com/svn/trunk@301 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Tue, 16 Dec 2014 13:13:33 +0000 |
parents | a74559240b4f |
children | a6bf8ff720f8 |
comparison
equal
deleted
inserted
replaced
299:a74559240b4f | 300:9fb523472035 |
---|---|
25 import luan.LuanElement; | 25 import luan.LuanElement; |
26 | 26 |
27 | 27 |
28 public final class JavaLuan { | 28 public final class JavaLuan { |
29 | 29 |
30 public static void java(LuanState luan) { | |
31 luan.currentEnvironment().setJava(); | |
32 } | |
33 | |
34 public static final LuanFunction javaFn; | |
35 static { | |
36 try { | |
37 javaFn = new LuanJavaFunction(JavaLuan.class.getMethod("java",LuanState.class),null); | |
38 } catch(NoSuchMethodException e) { | |
39 throw new RuntimeException(e); | |
40 } | |
41 } | |
42 | |
43 private static void checkJava(LuanState luan) throws LuanException { | |
44 if( !luan.currentEnvironment().hasJava() ) | |
45 throw luan.exception("Java isn't allowed"); | |
46 } | |
47 | |
30 private static boolean isLoaded(LuanState luan) { | 48 private static boolean isLoaded(LuanState luan) { |
31 // return PackageLuan.loaded(luan).get("luan:Java") != null; | 49 // return PackageLuan.loaded(luan).get("luan:Java") != null; |
32 return true; | 50 return true; |
33 } | 51 } |
34 | 52 |
35 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { | 53 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException { |
54 if( !luan.currentEnvironment().hasJava() ) | |
55 return null; | |
36 if( obj instanceof Static ) { | 56 if( obj instanceof Static ) { |
37 if( key instanceof String ) { | 57 if( key instanceof String ) { |
38 String name = (String)key; | 58 String name = (String)key; |
39 Static st = (Static)obj; | 59 Static st = (Static)obj; |
40 Class cls = st.cls; | 60 Class cls = st.cls; |
80 if( "instanceof".equals(name) ) { | 100 if( "instanceof".equals(name) ) { |
81 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); | 101 return new LuanJavaFunction(instanceOf,new InstanceOf(obj)); |
82 } else { | 102 } else { |
83 List<Member> members = getMembers(cls,name); | 103 List<Member> members = getMembers(cls,name); |
84 if( !members.isEmpty() ) { | 104 if( !members.isEmpty() ) { |
85 if( name.equals("getClass") && !isLoaded(luan) ) | |
86 return null; // security | |
87 return member(obj,members); | 105 return member(obj,members); |
88 } | 106 } |
89 } | 107 } |
90 } | 108 } |
91 // throw luan.exception("invalid member '"+key+"' for java object: "+obj); | 109 // throw luan.exception("invalid member '"+key+"' for java object: "+obj); |
119 throw new RuntimeException(e); | 137 throw new RuntimeException(e); |
120 } | 138 } |
121 } | 139 } |
122 | 140 |
123 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException { | 141 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException { |
142 checkJava(luan); | |
124 if( obj instanceof Static ) { | 143 if( obj instanceof Static ) { |
125 if( key instanceof String ) { | 144 if( key instanceof String ) { |
126 String name = (String)key; | 145 String name = (String)key; |
127 Static st = (Static)obj; | 146 Static st = (Static)obj; |
128 Class cls = st.cls; | 147 Class cls = st.cls; |
289 return cls.isSynthetic(); | 308 return cls.isSynthetic(); |
290 } | 309 } |
291 } | 310 } |
292 | 311 |
293 public static Static load(LuanState luan,String name) throws LuanException { | 312 public static Static load(LuanState luan,String name) throws LuanException { |
313 checkJava(luan); | |
294 @SuppressWarnings("unchecked") | 314 @SuppressWarnings("unchecked") |
295 Map<String,Static> loaded = (Map<String,Static>)luan.registry().get("Java.loaded"); | 315 Map<String,Static> loaded = (Map<String,Static>)luan.registry().get("Java.loaded"); |
296 if( loaded == null ) { | 316 if( loaded == null ) { |
297 loaded = new HashMap<String,Static>(); | 317 loaded = new HashMap<String,Static>(); |
298 luan.registry().put("Java.loaded",loaded); | 318 luan.registry().put("Java.loaded",loaded); |
316 return null; | 336 return null; |
317 } | 337 } |
318 } | 338 } |
319 return new Static(cls); | 339 return new Static(cls); |
320 } | 340 } |
321 /* | 341 |
322 public static void importClass(LuanState luan,String name) throws LuanException { | 342 private static class AmbiguousJavaFunction extends LuanFunction { |
323 luan.currentEnvironment().put( name.substring(name.lastIndexOf('.')+1), getClass(luan,name) ); | |
324 } | |
325 */ | |
326 static class AmbiguousJavaFunction extends LuanFunction { | |
327 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); | 343 private final Map<Integer,List<LuanJavaFunction>> fnMap = new HashMap<Integer,List<LuanJavaFunction>>(); |
328 | 344 |
329 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { | 345 AmbiguousJavaFunction(List<LuanJavaFunction> fns) { |
330 for( LuanJavaFunction fn : fns ) { | 346 for( LuanJavaFunction fn : fns ) { |
331 Integer n = fn.getParameterTypes().length; | 347 Integer n = fn.getParameterTypes().length; |