Mercurial Hosting > luan
annotate src/luan/LuanState.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 02:10:41 -0700 |
parents | d41997776788 |
children | 503bde9a7c80 |
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 |
1267 | 3 import java.lang.reflect.Array; |
527 | 4 import java.io.Closeable; |
5 import java.io.IOException; | |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
6 import java.util.Map; |
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
7 import java.util.HashMap; |
1267 | 8 import java.util.List; |
9 import java.util.ArrayList; | |
10 import java.util.Set; | |
11 import java.util.Arrays; | |
1222 | 12 import org.slf4j.Logger; |
13 import org.slf4j.LoggerFactory; | |
166
4eaee12f6c65
move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
163
diff
changeset
|
14 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
|
15 import luan.modules.BasicLuan; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
16 import luan.modules.JavaLuan; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
18 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
19 public final class LuanState implements LuanCloneable { |
1222 | 20 private static final Logger logger = LoggerFactory.getLogger(LuanState.class); |
21 | |
1133 | 22 public LuanJavaOk javaOk; |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
23 private Map registry; |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
24 public boolean isLocked = false; |
73
f86e4f77ef32
add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
66
diff
changeset
|
25 |
1264 | 26 public interface OnClose extends Closeable { |
27 public void onClose(Closeable c); | |
28 } | |
29 public OnClose onClose; | |
30 | |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
31 public LuanState() { |
1133 | 32 javaOk = new LuanJavaOk(); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
33 registry = new HashMap(); |
200
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
199
diff
changeset
|
34 } |
9fb218211763
add Package.block();
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
199
diff
changeset
|
35 |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
36 private LuanState(LuanState luan) {} |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
37 |
784
6a7c6879158d
revert shallowClone()
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
38 @Override public LuanState shallowClone() { |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
39 return new LuanState(this); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
40 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
41 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
42 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
43 LuanState clone = (LuanState)dc; |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
44 clone.registry = cloner.clone(registry); |
1133 | 45 clone.javaOk = (LuanJavaOk)cloner.clone(javaOk); |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
46 if( cloner.type == LuanCloner.Type.INCREMENTAL ) |
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
47 isLocked = true; |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
48 } |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
75
diff
changeset
|
49 |
787
c49980cdece6
use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents:
786
diff
changeset
|
50 public Map registry() { |
202
75750ceb45ee
add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
200
diff
changeset
|
51 return registry; |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
91
diff
changeset
|
52 } |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
91
diff
changeset
|
53 |
527 | 54 public void onClose(Closeable c) { |
1264 | 55 if( onClose != null ) |
56 onClose.onClose(c); | |
1202 | 57 } |
58 | |
786
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
59 public final Object eval(String cmd,Object... args) throws LuanException { |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
60 return Luan.load(cmd,"eval").call(this,args); |
fe63c508a177
add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
61 } |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
672
diff
changeset
|
62 /* |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
63 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
|
64 LuanFunction fn = BasicLuan.load(this,cmd,"eval",env,true); |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
65 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
|
66 } |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
672
diff
changeset
|
67 */ |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
68 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
69 public String toString(Object obj) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
70 if( obj instanceof LuanTable ) { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
71 LuanTable tbl = (LuanTable)obj; |
1267 | 72 return tbl.toStringLuan(); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
73 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
74 if( obj == null ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
75 return "nil"; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
76 if( obj instanceof Number ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
77 return Luan.toString((Number)obj); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
78 if( obj instanceof byte[] ) |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
79 return "binary: " + Integer.toHexString(obj.hashCode()); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
80 return obj.toString(); |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
81 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
82 |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
83 public Object index(Object obj,Object key) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
84 if( obj instanceof LuanTable ) { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
85 LuanTable tbl = (LuanTable)obj; |
1267 | 86 return tbl.get(key); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
87 } |
1133 | 88 if( obj != null && javaOk.ok ) |
795 | 89 return JavaLuan.__index(this,obj,key); |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
90 throw new LuanException("attempt to index a " + Luan.type(obj) + " value" ); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
91 } |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
92 |
576 | 93 /* |
94 public Number checkNumber(Object obj) throws LuanException { | |
95 if( obj instanceof Number ) | |
96 return (Number)obj; | |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
97 throw new LuanException( "attempt to perform arithmetic on '"+context()+"' (a " + Luan.type(obj) + " value)" ); |
576 | 98 } |
99 */ | |
1166
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
100 |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
101 |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
102 public boolean isLessThan(Object o1,Object o2) throws LuanException { |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
103 if( o1 instanceof Number && o2 instanceof Number ) { |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
104 Number n1 = (Number)o1; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
105 Number n2 = (Number)o2; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
106 return n1.doubleValue() < n2.doubleValue(); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
107 } |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
108 if( o1 instanceof String && o2 instanceof String ) { |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
109 String s1 = (String)o1; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
110 String s2 = (String)o2; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
111 return s1.compareTo(s2) < 0; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
112 } |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
113 LuanFunction fn = getBinHandler("__lt",o1,o2); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
114 if( fn != null ) |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
115 return Luan.checkBoolean( Luan.first(fn.call(this,new Object[]{o1,o2})) ); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
116 throw new LuanException( "attempt to compare " + Luan.type(o1) + " with " + Luan.type(o2) ); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
117 } |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
118 |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
119 public LuanFunction getBinHandler(String op,Object o1,Object o2) throws LuanException { |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
120 if( o1 instanceof LuanTable ) { |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
121 LuanFunction f1 = getHandlerFunction(op,(LuanTable)o1); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
122 if( f1 != null ) |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
123 return f1; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
124 } |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
125 return o2 instanceof LuanTable ? getHandlerFunction(op,(LuanTable)o2) : null; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
126 } |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
127 |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
128 public LuanFunction getHandlerFunction(String op,LuanTable t) throws LuanException { |
1267 | 129 Object f = t.getHandler(op); |
1166
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
130 if( f == null ) |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
131 return null; |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
132 return Luan.checkFunction(f); |
7ef40e1923b7
add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents:
1133
diff
changeset
|
133 } |
1267 | 134 |
135 public LuanTable toTable(Object obj) { | |
136 if( obj == null ) | |
137 return null; | |
138 if( obj instanceof LuanTable ) | |
139 return (LuanTable)obj; | |
140 if( obj instanceof List ) { | |
141 return new LuanTable(this,(List)obj); | |
142 } | |
143 if( obj instanceof Map ) { | |
144 return new LuanTable(this,(Map)obj); | |
145 } | |
146 if( obj instanceof Set ) { | |
147 return new LuanTable(this,(Set)obj); | |
148 } | |
149 Class cls = obj.getClass(); | |
150 if( cls.isArray() ) { | |
151 if( cls.getComponentType().isPrimitive() ) { | |
152 int len = Array.getLength(obj); | |
153 List list = new ArrayList(); | |
154 for( int i=0; i<len; i++ ) { | |
155 list.add(Array.get(obj,i)); | |
156 } | |
157 return new LuanTable(this,list); | |
158 } else { | |
159 Object[] a = (Object[])obj; | |
160 return new LuanTable(this,Arrays.asList(a)); | |
161 } | |
162 } | |
163 return null; | |
164 } | |
165 | |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
166 } |