Mercurial Hosting > luan
annotate core/src/luan/LuanState.java @ 575:7c3ad6db8ac3
make LuanState.JAVA private
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 13 Jul 2015 18:34:31 -0600 |
parents | 6cc2f047019b |
children | 4723d22062ce |
rev | line source |
---|---|
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1 package luan; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
527 | 3 import java.io.Closeable; |
4 import java.io.IOException; | |
521
8a217fe5b4f3
cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents:
517
diff
changeset
|
5 import java.lang.ref.Reference; |
8a217fe5b4f3
cleaner LuanState.onClose()
Franklin Schmidt <fschmidt@gmail.com>
parents:
517
diff
changeset
|
6 import java.lang.ref.WeakReference; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 import java.util.List; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 import java.util.ArrayList; |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
9 import java.util.Map; |
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
10 import java.util.HashMap; |
166
4eaee12f6c65
move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
163
diff
changeset
|
11 import luan.impl.LuanCompiler; |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
12 import luan.modules.BasicLuan; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
13 import luan.modules.JavaLuan; |
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 |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
16 public abstract class LuanState implements DeepCloneable { |
130
0594c132888b
cleanup
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
128
diff
changeset
|
17 |
199
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
18 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); |
88
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
86
diff
changeset
|
19 |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
20 private Map registry; |
527 | 21 private final List<Reference<Closeable>> onClose = new ArrayList<Reference<Closeable>>(); |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
66
diff
changeset
|
22 |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
23 protected LuanState() { |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
24 registry = new HashMap(); |
200
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
199
diff
changeset
|
25 } |
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
199
diff
changeset
|
26 |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
27 protected LuanState(LuanState luan) {} |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
28 |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
29 @Override public void deepenClone(DeepCloneable clone,DeepCloner cloner) { |
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
30 ((LuanState)clone).registry = cloner.deepClone(registry); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
31 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
32 |
503 | 33 public abstract boolean hasJava(); |
34 public abstract void setJava(); | |
301
a6bf8ff720f8
add java security
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
300
diff
changeset
|
35 public abstract LuanSource currentSource(); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
36 |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
37 public final Map registry() { |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
38 return registry; |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
91
diff
changeset
|
39 } |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
91
diff
changeset
|
40 |
527 | 41 public void onClose(Closeable c) { |
42 onClose.add(new WeakReference<Closeable>(c)); | |
517
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
43 } |
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
44 |
527 | 45 public void close() throws IOException { |
46 for( Reference<Closeable> ref : onClose ) { | |
47 Closeable c = ref.get(); | |
48 if( c != null ) | |
49 c.close(); | |
517
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
50 } |
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
51 onClose.clear(); |
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
52 } |
8dcf9e12446b
add Luan.on_luan_close()
Franklin Schmidt <fschmidt@gmail.com>
parents:
509
diff
changeset
|
53 |
400
8f1be9704726
change LuanState.newStandard() to newInstance() which doesn't preload anything
Franklin Schmidt <fschmidt@gmail.com>
parents:
398
diff
changeset
|
54 public static LuanState newInstance() { |
8f1be9704726
change LuanState.newStandard() to newInstance() which doesn't preload anything
Franklin Schmidt <fschmidt@gmail.com>
parents:
398
diff
changeset
|
55 return LuanCompiler.newLuanState(); |
59
5c9cadd0acce
move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
56 } |
5c9cadd0acce
move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
57 |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
58 public final Object eval(String cmd) throws LuanException { |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
404
diff
changeset
|
59 return eval(cmd,new LuanTable()); |
157
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
150
diff
changeset
|
60 } |
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
150
diff
changeset
|
61 |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
62 public final Object eval(String cmd,LuanTable env) throws LuanException { |
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
63 LuanFunction fn = BasicLuan.load(this,cmd,"eval",env,true); |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
64 return fn.call(this); |
59
5c9cadd0acce
move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
65 } |
5c9cadd0acce
move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
49
diff
changeset
|
66 |
88
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
86
diff
changeset
|
67 public final LuanBit bit(LuanElement el) { |
6ca02b188dba
add LuanBit to clean up code;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
86
diff
changeset
|
68 return new LuanBit(this,el); |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
69 } |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
70 |
199
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
71 // convenience methods |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
72 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
73 private final LuanBit JAVA = bit(null); |
199
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
74 |
481
5d4a78c93383
luan errors are now tables
Franklin Schmidt <fschmidt@gmail.com>
parents:
460
diff
changeset
|
75 public LuanException exception(Object msg) throws LuanException { |
199
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
76 return JAVA.exception(msg); |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
77 } |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
78 |
443
bf5e62a9090c
remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
79 public Boolean checkBoolean(Object obj) throws LuanException { |
bf5e62a9090c
remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
80 return JAVA.checkBoolean(obj); |
bf5e62a9090c
remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
81 } |
bf5e62a9090c
remove toBoolean() and to_boolean()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
82 |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
83 public String checkString(Object obj) throws LuanException { |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
84 return JAVA.checkString(obj); |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
85 } |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
86 |
199
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
87 public LuanFunction checkFunction(Object obj) throws LuanException { |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
88 return JAVA.checkFunction(obj); |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
89 } |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
90 |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
91 public boolean isLessThan(Object o1,Object o2) throws LuanException { |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
92 return JAVA.isLessThan(o1,o2); |
8960c81eb4bc
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
195
diff
changeset
|
93 } |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
94 |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
95 public String toString(Object obj) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
96 if( obj instanceof LuanTable ) { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
97 LuanTable tbl = (LuanTable)obj; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
98 return tbl.toString(this); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
99 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
100 if( obj == null ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
101 return "nil"; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
102 if( obj instanceof Number ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
103 return Luan.toString((Number)obj); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
104 if( obj instanceof byte[] ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
105 return "binary: " + Integer.toHexString(obj.hashCode()); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
106 return obj.toString(); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
107 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
108 |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
109 public Object index(Object obj,Object key) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
110 if( obj instanceof LuanTable ) { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
111 LuanTable tbl = (LuanTable)obj; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
112 return tbl.get(this,key); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
113 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
114 if( obj != null && hasJava() ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
115 return JavaLuan.__index(this,obj,key,false); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
116 throw exception( "attempt to index a " + Luan.type(obj) + " value in '"+context()+"'" ); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
117 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
118 |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
119 public String context() { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
120 return stackTrace.get(stackTrace.size()-1).call.text(); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
121 } |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
122 } |