annotate core/src/luan/LuanPropertyMeta.java @ 574:6cc2f047019b

remove LuanState.call()
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 13 Jul 2015 12:31:53 -0600
parents d62c35a5cd6b
children 60c549d43988
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
3 import java.util.Map;
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
4 import java.util.Iterator;
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
6
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
7 public final class LuanPropertyMeta extends LuanMeta {
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
8 public static final LuanPropertyMeta INSTANCE = new LuanPropertyMeta();
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 private LuanPropertyMeta() {}
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
12 public LuanTable getters(LuanTable tbl) {
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
13 return (LuanTable)tbl.getMetatable().rawGet("get");
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
16 public LuanTable setters(LuanTable tbl) {
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
17 return (LuanTable)tbl.getMetatable().rawGet("set");
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
20 protected String type(LuanTable tbl) {
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
21 return (String)tbl.getMetatable().rawGet("type");
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
22 }
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
23
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 @Override public Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException {
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
25 Object obj = getters(tbl).rawGet(key);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 if( obj == null )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 return null;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 throw luan.exception("get for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 LuanFunction fn = (LuanFunction)obj;
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 451
diff changeset
31 return fn.call(luan);
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
34 @Override protected Iterator keys(final LuanTable tbl) {
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
35 return new Iterator() {
432
d9df6d6cb927 finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 428
diff changeset
36 final Iterator<Map.Entry<Object,Object>> iter = getters(tbl).rawIterator();
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
37
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
38 @Override public boolean hasNext() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
39 return iter.hasNext();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
40 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
41 @Override public Object next() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
42 return iter.next().getKey();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
43 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
44 @Override public void remove() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
45 throw new UnsupportedOperationException();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
46 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
47 };
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
48 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
49
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
50
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 @Override public boolean canNewindex() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 return true;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54
428
df95199ca4c0 rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
55 @Override public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
426
23a93c118042 fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
56 Object obj = setters(tbl).rawGet(key);
451
d62c35a5cd6b allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents: 432
diff changeset
57 if( obj == null ) {
d62c35a5cd6b allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents: 432
diff changeset
58 tbl.rawPut(key,value);
d62c35a5cd6b allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents: 432
diff changeset
59 return;
d62c35a5cd6b allow setting non-properties in property table
Franklin Schmidt <fschmidt@gmail.com>
parents: 432
diff changeset
60 }
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 if( !(obj instanceof LuanFunction) )
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 throw luan.exception("set for '"+key+"' isn't a function");
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 LuanFunction fn = (LuanFunction)obj;
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 451
diff changeset
64 fn.call(luan,new Object[]{value});
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 @Override public LuanTable newMetatable() {
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 LuanTable mt = super.newMetatable();
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
69 mt.rawPut( "get", new LuanTable() );
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
70 mt.rawPut( "set", new LuanTable() );
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 426
diff changeset
71 mt.rawPut( "type", "property" );
407
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 return mt;
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 }
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74
7fd9f1b7b878 replace LuanPropertyTable with LuanPropertyMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 }