annotate src/luan/LuanState.java @ 1330:f41919741100

fix security
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 Feb 2019 01:38:55 -0700
parents 503bde9a7c80
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
3 import java.lang.reflect.Array;
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
4 import java.io.Closeable;
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
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
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
8 import java.util.List;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
9 import java.util.ArrayList;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
10 import java.util.Set;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
11 import java.util.Arrays;
1222
cb422386f6b5 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
12 import org.slf4j.Logger;
cb422386f6b5 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
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;
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
17 import luan.modules.PackageLuan;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
18
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
19
781
fbbdd369a13a rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
20 public final class LuanState implements LuanCloneable {
1222
cb422386f6b5 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
21 private static final Logger logger = LoggerFactory.getLogger(LuanState.class);
cb422386f6b5 logging
Franklin Schmidt <fschmidt@gmail.com>
parents: 1202
diff changeset
22
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
23 private final List<LuanClosure> stack = new ArrayList<LuanClosure>();
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 430
diff changeset
24 private Map registry;
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 786
diff changeset
25 public boolean isLocked = false;
73
f86e4f77ef32 add package module
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 66
diff changeset
26
1264
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
27 public interface OnClose extends Closeable {
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
28 public void onClose(Closeable c);
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
29 }
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
30 public OnClose onClose;
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
31
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
32 public LuanState() {
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);
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 786
diff changeset
45 if( cloner.type == LuanCloner.Type.INCREMENTAL )
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 786
diff changeset
46 isLocked = true;
672
d3e5414bdf4c better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 647
diff changeset
47 }
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 75
diff changeset
48
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
49 public LuanClosure peek() {
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
50 return peek(1);
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
51 }
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
52
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
53 public LuanClosure peek(int i) {
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
54 int n = stack.size();
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
55 return n < i ? null : stack.get(n-i);
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
56 }
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
57
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
58 void push(LuanClosure closure) {
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
59 stack.add(closure);
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
60 }
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
61
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
62 void pop() {
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
63 stack.remove(stack.size()-1);
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
64 }
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
65
787
c49980cdece6 use incremental cloning to serve web pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 786
diff changeset
66 public Map registry() {
202
75750ceb45ee add LuanState.registry
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 200
diff changeset
67 return registry;
108
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 91
diff changeset
68 }
3c404a296995 make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 91
diff changeset
69
527
Franklin Schmidt <fschmidt@gmail.com>
parents: 521
diff changeset
70 public void onClose(Closeable c) {
1264
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
71 if( onClose != null )
d41997776788 fix onClose issues
Franklin Schmidt <fschmidt@gmail.com>
parents: 1222
diff changeset
72 onClose.onClose(c);
1202
d3a3ca116e42 gc site instances
Franklin Schmidt <fschmidt@gmail.com>
parents: 1166
diff changeset
73 }
d3a3ca116e42 gc site instances
Franklin Schmidt <fschmidt@gmail.com>
parents: 1166
diff changeset
74
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
75 public Object eval(String cmd,Object... args) throws LuanException {
786
fe63c508a177 add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents: 785
diff changeset
76 return Luan.load(cmd,"eval").call(this,args);
fe63c508a177 add Http.reset_luan()
Franklin Schmidt <fschmidt@gmail.com>
parents: 785
diff changeset
77 }
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
78
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
79 public Object require(String modName) throws LuanException {
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1267
diff changeset
80 return PackageLuan.require(this,modName);
59
5c9cadd0acce move standard calls from CmdLine to LuanState
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
81 }
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
82
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
83 public String toString(Object obj) 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
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
86 return tbl.toStringLuan();
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
87 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
88 if( obj == null )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
89 return "nil";
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
90 if( obj instanceof Number )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
91 return Luan.toString((Number)obj);
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
92 if( obj instanceof byte[] )
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
93 return "binary: " + Integer.toHexString(obj.hashCode());
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
94 return obj.toString();
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
95 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
96
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
97 public Object index(Object obj,Object key) throws LuanException {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
98 if( obj instanceof LuanTable ) {
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
99 LuanTable tbl = (LuanTable)obj;
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
100 return tbl.get(key);
575
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
101 }
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
102 if( obj != null && peek().javaOk )
795
Franklin Schmidt <fschmidt@gmail.com>
parents: 787
diff changeset
103 return JavaLuan.__index(this,obj,key);
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
104 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
105 }
7c3ad6db8ac3 make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents: 574
diff changeset
106
576
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
107 /*
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
108 public Number checkNumber(Object obj) throws LuanException {
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
109 if( obj instanceof Number )
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
110 return (Number)obj;
647
8e8c30b72e9b move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
111 throw new LuanException( "attempt to perform arithmetic on '"+context()+"' (a " + Luan.type(obj) + " value)" );
576
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
112 }
4723d22062ce remove LuanBit
Franklin Schmidt <fschmidt@gmail.com>
parents: 575
diff changeset
113 */
1166
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
114
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
115
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
116 public boolean isLessThan(Object o1,Object o2) throws LuanException {
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
117 if( o1 instanceof Number && o2 instanceof Number ) {
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
118 Number n1 = (Number)o1;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
119 Number n2 = (Number)o2;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
120 return n1.doubleValue() < n2.doubleValue();
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
121 }
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
122 if( o1 instanceof String && o2 instanceof String ) {
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
123 String s1 = (String)o1;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
124 String s2 = (String)o2;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
125 return s1.compareTo(s2) < 0;
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 LuanFunction fn = getBinHandler("__lt",o1,o2);
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
128 if( fn != null )
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
129 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
130 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
131 }
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
132
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
133 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
134 if( o1 instanceof LuanTable ) {
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
135 LuanFunction f1 = getHandlerFunction(op,(LuanTable)o1);
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
136 if( f1 != null )
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
137 return f1;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
138 }
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
139 return o2 instanceof LuanTable ? getHandlerFunction(op,(LuanTable)o2) : null;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
140 }
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
141
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
142 public LuanFunction getHandlerFunction(String op,LuanTable t) throws LuanException {
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
143 Object f = t.getHandler(op);
1166
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
144 if( f == null )
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
145 return null;
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
146 return Luan.checkFunction(f);
7ef40e1923b7 add back Thread.global
Franklin Schmidt <fschmidt@gmail.com>
parents: 1133
diff changeset
147 }
1267
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
148
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
149 public LuanTable toTable(Object obj) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
150 if( obj == null )
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
151 return null;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
152 if( obj instanceof LuanTable )
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
153 return (LuanTable)obj;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
154 if( obj instanceof List ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
155 return new LuanTable(this,(List)obj);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
156 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
157 if( obj instanceof Map ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
158 return new LuanTable(this,(Map)obj);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
159 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
160 if( obj instanceof Set ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
161 return new LuanTable(this,(Set)obj);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
162 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
163 Class cls = obj.getClass();
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
164 if( cls.isArray() ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
165 if( cls.getComponentType().isPrimitive() ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
166 int len = Array.getLength(obj);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
167 List list = new ArrayList();
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
168 for( int i=0; i<len; i++ ) {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
169 list.add(Array.get(obj,i));
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
170 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
171 return new LuanTable(this,list);
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
172 } else {
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
173 Object[] a = (Object[])obj;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
174 return new LuanTable(this,Arrays.asList(a));
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
175 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
176 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
177 return null;
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
178 }
9fa8b8389578 add LuanTable.luan;
Franklin Schmidt <fschmidt@gmail.com>
parents: 1264
diff changeset
179
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
180 }