Mercurial Hosting > luan
annotate src/luan/LuanTable.java @ 782:655280eab1e2
start limited cloning
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 30 Aug 2016 01:29:33 -0600 |
parents | fbbdd369a13a |
children | 6a7c6879158d |
rev | line source |
---|---|
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1 package luan; |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
27
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
3 import java.util.Iterator; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
4 import java.util.ListIterator; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.util.Map; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
6 import java.util.AbstractMap; |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
7 import java.util.LinkedHashMap; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
8 import java.util.List; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
9 import java.util.ArrayList; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
10 import java.util.Collections; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
11 import java.util.Comparator; |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
12 import java.util.Set; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
13 import java.util.HashSet; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
16 public final class LuanTable implements LuanCloneable { |
434 | 17 private Map map = null; |
18 private List list = null; | |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
19 private LuanTable metatable = null; |
672
d3e5414bdf4c
better java permission handling
Franklin Schmidt <fschmidt@gmail.com>
parents:
647
diff
changeset
|
20 public LuanJava java; |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
21 private LuanCloner cloner; |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
22 |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
23 private LuanTable(LuanCloner cloner) { |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
24 this.cloner = cloner; |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
25 } |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
26 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
27 public LuanTable() {} |
364 | 28 |
434 | 29 public LuanTable(List list) { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
30 int n = list.size(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
31 for( int i=0; i<n; i++ ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
32 Object val = list.get(i); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
33 if( val != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
34 rawPut(i+1,val); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
35 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
36 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
37 |
434 | 38 public LuanTable(Map map) { |
39 for( Object stupid : map.entrySet() ) { | |
40 Map.Entry entry = (Map.Entry)stupid; | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
41 Object key = entry.getKey(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
42 Object value = entry.getValue(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
43 if( key != null && value != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
44 rawPut(key,value); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
45 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
46 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
47 |
434 | 48 public LuanTable(Set set) { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
49 for( Object el : set ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
50 if( el != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
51 rawPut(el,Boolean.TRUE); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
52 } |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
53 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
54 |
425
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
55 public LuanTable(LuanTable tbl) { |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
56 if( tbl.map != null && !tbl.map.isEmpty() ) |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
57 this.map = new LinkedHashMap<Object,Object>(tbl.map); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
58 if( tbl.rawLength() > 0 ) |
425
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
59 this.list = new ArrayList<Object>(tbl.list); |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
60 this.metatable = tbl.metatable; |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
61 } |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
62 |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
63 @Override public LuanTable shallowClone(LuanCloner cloner) { |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
64 return new LuanTable(cloner.deep ? null : cloner); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
65 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
66 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
67 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
68 LuanTable clone = (LuanTable)dc; |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
69 if( map != null ) { |
284
8870840251ea
use LinkedHashMap in LuanTable to preserve order
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
233
diff
changeset
|
70 clone.map = newMap(); |
434 | 71 for( Object stupid : map.entrySet() ) { |
72 Map.Entry entry = (Map.Entry)stupid; | |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
73 Object val = entry.getValue(); |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
74 if( cloner.deep || !(val instanceof LuanTable) ) |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
75 val = cloner.get(val); |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
76 clone.map.put( cloner.get(entry.getKey()), val ); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
77 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
78 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
79 if( list != null ) { |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
80 clone.list = new ArrayList<Object>(); |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
81 for( Object obj : list ) { |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
82 if( cloner.deep || !(obj instanceof LuanTable) ) |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
83 obj = cloner.get(obj); |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
84 clone.list.add(obj); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
85 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
86 } |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
87 clone.metatable = (LuanTable)cloner.clone(metatable); |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
88 clone.java = (LuanJava)cloner.clone(java); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
89 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
90 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
91 public boolean isList() { |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
92 return map==null || map.isEmpty(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
93 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
94 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
95 public List<Object> asList() { |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
96 return list!=null ? list : Collections.emptyList(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
97 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
98 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
99 public String toString(LuanState luan) throws LuanException { |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
100 Object h = getHandler("__to_string"); |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
101 if( h == null ) |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
102 return rawToString(); |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
103 if( h instanceof LuanMeta ) { |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
104 LuanMeta meta = (LuanMeta)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
105 return meta.__to_string(luan,this); |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
106 } |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
107 LuanFunction fn = Luan.checkFunction(h); |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
108 return Luan.checkString( Luan.first( fn.call(luan,new Object[]{this}) ) ); |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
109 } |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
110 |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
111 public String rawToString() { |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
112 return "table: " + Integer.toHexString(hashCode()); |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
113 } |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
114 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
115 public Object get(LuanState luan,Object key) throws LuanException { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
116 Object value = rawGet(key); |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
117 if( value != null ) |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
118 return value; |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
119 Object h = getHandler("__index"); |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
120 if( h==null ) |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
121 return null; |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
122 if( h instanceof LuanFunction ) { |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
123 LuanFunction fn = (LuanFunction)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
124 return Luan.first(fn.call(luan,new Object[]{this,key})); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
125 } |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
126 if( h instanceof LuanMeta ) { |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
127 LuanMeta meta = (LuanMeta)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
128 return meta.__index(luan,this,key); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
129 } |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
130 return luan.index(h,key); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
131 } |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
132 |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
133 public Object rawGet(Object key) { |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
134 if( list != null ) { |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
135 Integer iT = Luan.asInteger(key); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
136 if( iT != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
137 int i = iT - 1; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
138 if( i>=0 && i<list.size() ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
139 return list.get(i); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
140 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
141 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
142 if( map==null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
143 return null; |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
144 if( key instanceof Number && !(key instanceof Double) ) { |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
145 Number n = (Number)key; |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
146 key = Double.valueOf(n.doubleValue()); |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
147 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
148 return map.get(key); |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
149 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
150 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
151 public void put(LuanState luan,Object key,Object value) throws LuanException { |
428
df95199ca4c0
rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents:
427
diff
changeset
|
152 Object h = getHandler("__new_index"); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
153 if( h==null || rawGet(key)!=null ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
154 rawPut(key,value); |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
155 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
156 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
157 if( h instanceof LuanFunction ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
158 LuanFunction fn = (LuanFunction)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
159 fn.call(luan,new Object[]{this,key,value}); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
160 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
161 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
162 if( h instanceof LuanMeta ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
163 LuanMeta meta = (LuanMeta)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
164 meta.__new_index(luan,this,key,value); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
165 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
166 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
167 if( h instanceof LuanTable ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
168 LuanTable tbl = (LuanTable)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
169 tbl.put(luan,key,value); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
170 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
171 } |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
172 throw new LuanException("invalid type "+Luan.type(h)+" for metamethod __new_index"); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
173 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
174 |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
175 public void rawPut(Object key,Object val) { |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
176 Integer iT = Luan.asInteger(key); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
177 if( iT != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
178 int i = iT - 1; |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
179 if( list != null || i == 0 ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
180 if( i == list().size() ) { |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
181 if( val != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
182 list.add(val); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
183 mapToList(); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
184 } |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
185 return; |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
186 } else if( i>=0 && i<list.size() ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
187 list.set(i,val); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
188 if( val == null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
189 listToMap(i); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
190 } |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
191 return; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
192 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
193 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
194 } |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
195 if( map==null ) |
284
8870840251ea
use LinkedHashMap in LuanTable to preserve order
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
233
diff
changeset
|
196 map = newMap(); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
197 if( key instanceof Number && !(key instanceof Double) ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
198 Number n = (Number)key; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
199 key = Double.valueOf(n.doubleValue()); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
200 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
201 if( val == null ) { |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
202 map.remove(key); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
203 } else { |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
204 map.put(key,val); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
205 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
206 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
207 |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
208 private void mapToList() { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
209 if( map != null ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
210 while(true) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
211 Object v = map.remove(Double.valueOf(list.size()+1)); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
212 if( v == null ) |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
213 break; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
214 list.add(v); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
215 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
216 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
217 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
218 |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
219 private void listToMap(int from) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
220 if( list != null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
221 while( list.size() > from ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
222 int i = list.size() - 1; |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
223 Object v = list.remove(i); |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
224 if( v != null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
225 if( map==null ) |
284
8870840251ea
use LinkedHashMap in LuanTable to preserve order
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
233
diff
changeset
|
226 map = newMap(); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
227 map.put(i+1,v); |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
228 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
229 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
230 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
231 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
232 |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
233 private List<Object> list() { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
234 if( list == null ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
235 list = new ArrayList<Object>(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
236 mapToList(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
237 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
238 return list; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
239 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
240 |
431 | 241 public void rawInsert(int pos,Object value) { |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
242 if( value==null ) |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
243 throw new IllegalArgumentException("can't insert a nil value"); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
244 list().add(pos-1,value); |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
245 mapToList(); |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
246 } |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
247 |
431 | 248 public Object rawRemove(int pos) { |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
249 return list().remove(pos-1); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
250 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
251 |
431 | 252 public void rawSort(Comparator<Object> cmp) { |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
253 Collections.sort(list(),cmp); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
254 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
255 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
256 public int length(LuanState luan) throws LuanException { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
257 Object h = getHandler("__len"); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
258 if( h != null ) { |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
259 LuanFunction fn = Luan.checkFunction(h); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
260 return (Integer)Luan.first(fn.call(luan,new Object[]{this})); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
261 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
262 return rawLength(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
263 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
264 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
265 public int rawLength() { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
266 return list==null ? 0 : list.size(); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
267 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
268 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
269 public Iterable<Map.Entry<Object,Object>> iterable(LuanState luan) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
270 final Iterator<Map.Entry<Object,Object>> iter = iterator(luan); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
271 return new Iterable<Map.Entry<Object,Object>>() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
272 public Iterator<Map.Entry<Object,Object>> iterator() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
273 return iter; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
274 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
275 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
276 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
277 |
498
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
278 public Iterable<Map.Entry<Object,Object>> rawIterable() throws LuanException { |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
279 final Iterator<Map.Entry<Object,Object>> iter = rawIterator(); |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
280 return new Iterable<Map.Entry<Object,Object>>() { |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
281 public Iterator<Map.Entry<Object,Object>> iterator() { |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
282 return iter; |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
283 } |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
284 }; |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
285 } |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
286 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
287 public Iterator<Map.Entry<Object,Object>> iterator(final LuanState luan) throws LuanException { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
288 if( getHandler("__pairs") == null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
289 return rawIterator(); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
290 final LuanFunction fn = pairs(luan); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
291 return new Iterator<Map.Entry<Object,Object>>() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
292 private Map.Entry<Object,Object> next = getNext(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
293 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
294 private Map.Entry<Object,Object> getNext() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
295 try { |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
296 Object obj = fn.call(luan); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
297 if( obj==null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
298 return null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
299 Object[] a = (Object[])obj; |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
300 if( a.length == 0 || a[0]==null ) |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
301 return null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
302 return new AbstractMap.SimpleEntry<Object,Object>(a[0],a[1]); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
303 } catch(LuanException e) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
304 throw new LuanRuntimeException(e); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
305 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
306 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
307 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
308 public boolean hasNext() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
309 return next != null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
310 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
311 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
312 public Map.Entry<Object,Object> next() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
313 Map.Entry<Object,Object> rtn = next; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
314 next = getNext(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
315 return rtn; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
316 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
317 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
318 public void remove() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
319 throw new UnsupportedOperationException(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
320 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
321 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
322 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
323 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
324 public LuanFunction pairs(LuanState luan) throws LuanException { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
325 Object h = getHandler("__pairs"); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
326 if( h != null ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
327 if( h instanceof LuanFunction ) { |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
328 LuanFunction fn = (LuanFunction)h; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
329 Object obj = Luan.first(fn.call(luan,new Object[]{this})); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
330 if( !(obj instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
331 throw new LuanException( "metamethod __pairs should return function but returned " + Luan.type(obj) ); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
332 return (LuanFunction)obj; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
333 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
334 if( h instanceof LuanMeta ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
335 LuanMeta meta = (LuanMeta)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
336 return meta.__pairs(luan,this); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
337 } |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
338 throw new LuanException( "invalid type of metamethod __pairs: " + Luan.type(h) ); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
339 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
340 return rawPairs(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
341 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
342 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
343 private LuanFunction rawPairs() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
344 return new LuanFunction() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
345 final Iterator<Map.Entry<Object,Object>> iter = rawIterator(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
346 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
347 @Override public Object[] call(LuanState luan,Object[] args) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
348 if( !iter.hasNext() ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
349 return LuanFunction.NOTHING; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
350 Map.Entry<Object,Object> entry = iter.next(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
351 return new Object[]{entry.getKey(),entry.getValue()}; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
352 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
353 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
354 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
355 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
356 public Iterator<Map.Entry<Object,Object>> rawIterator() { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
357 if( list == null ) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
358 if( map == null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
359 return Collections.<Map.Entry<Object,Object>>emptyList().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
360 return map.entrySet().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
361 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
362 if( map == null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
363 return listIterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
364 return new Iterator<Map.Entry<Object,Object>>() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
365 Iterator<Map.Entry<Object,Object>> iter = listIterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
366 boolean isList = true; |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
367 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
368 public boolean hasNext() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
369 boolean b = iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
370 if( !b && isList ) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
371 iter = map.entrySet().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
372 isList = false; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
373 b = iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
374 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
375 return b; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
376 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
377 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
378 public Map.Entry<Object,Object> next() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
379 return iter.next(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
380 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
381 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
382 public void remove() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
383 throw new UnsupportedOperationException(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
384 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
385 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
386 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
387 |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
388 private Iterator<Map.Entry<Object,Object>> listIterator() { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
389 if( list == null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
390 return Collections.<Map.Entry<Object,Object>>emptyList().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
391 final ListIterator iter = list.listIterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
392 return new Iterator<Map.Entry<Object,Object>>() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
393 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
394 public boolean hasNext() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
395 return iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
396 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
397 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
398 public Map.Entry<Object,Object> next() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
399 Integer key = iter.nextIndex()+1; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
400 return new AbstractMap.SimpleEntry<Object,Object>(key,iter.next()); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
401 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
402 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
403 public void remove() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
404 throw new UnsupportedOperationException(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
405 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
406 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
407 } |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
408 |
431 | 409 public LuanTable rawSubList(int from,int to) { |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
410 LuanTable tbl = new LuanTable(cloner); |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
411 tbl.list = new ArrayList<Object>(list().subList(from-1,to-1)); |
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
412 return tbl; |
27
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
413 } |
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
414 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
415 public LuanTable getMetatable() { |
35
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
416 return metatable; |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
417 } |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
418 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
419 public void setMetatable(LuanTable metatable) { |
35
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
420 this.metatable = metatable; |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
421 } |
300
9fb523472035
add java() to control java access
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
284
diff
changeset
|
422 |
419
8fbb961aabd5
improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents:
414
diff
changeset
|
423 public Object getHandler(String op) { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
424 return metatable==null ? null : metatable.rawGet(op); |
419
8fbb961aabd5
improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents:
414
diff
changeset
|
425 } |
8fbb961aabd5
improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents:
414
diff
changeset
|
426 |
431 | 427 private Map<Object,Object> newMap() { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
428 return new LinkedHashMap<Object,Object>(); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
429 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
430 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
431 public boolean isSet(LuanState luan) throws LuanException { |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
432 for( Map.Entry<Object,Object> entry : iterable(luan) ) { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
433 if( !entry.getValue().equals(Boolean.TRUE) ) |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
434 return false; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
435 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
436 return true; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
437 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
438 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
439 public Set<Object> asSet(LuanState luan) throws LuanException { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
440 Set<Object> set = new HashSet<Object>(); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
441 for( Map.Entry<Object,Object> entry : iterable(luan) ) { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
442 set.add(entry.getKey()); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
443 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
444 return set; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
445 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
446 |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
447 public Map<Object,Object> asMap(LuanState luan) throws LuanException { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
448 Map<Object,Object> map = newMap(); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
449 for( Map.Entry<Object,Object> entry : iterable(luan) ) { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
450 map.put(entry.getKey(),entry.getValue()); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
451 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
452 return map; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
453 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
454 |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
455 public void rawClear() { |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
456 map = null; |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
457 list = null; |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
458 } |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
459 |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
460 } |