comparison core/src/luan/LuanState.java @ 208:5ba136769034

remove MetatableGetter and use a generic metatable instead git-svn-id: https://luan-java.googlecode.com/svn/trunk@209 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 08 Jul 2014 07:04:47 +0000
parents 75750ceb45ee
children ec016471c6eb
comparison
equal deleted inserted replaced
207:5aafb5b9f70f 208:5ba136769034
9 import java.util.Set; 9 import java.util.Set;
10 import java.util.HashSet; 10 import java.util.HashSet;
11 import luan.impl.LuanCompiler; 11 import luan.impl.LuanCompiler;
12 import luan.modules.BasicLuan; 12 import luan.modules.BasicLuan;
13 import luan.modules.PackageLuan; 13 import luan.modules.PackageLuan;
14 import luan.modules.JavaLuan;
15 import luan.modules.StringLuan;
14 16
15 17
16 public abstract class LuanState implements DeepCloneable<LuanState> { 18 public abstract class LuanState implements DeepCloneable<LuanState> {
17 19
18 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); 20 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>();
19 21
20 private LuanTable registry; 22 private LuanTable registry;
21 private LuanTable global; 23 private LuanTable global;
24 private LuanTable metatable; // generic metatable
22 25
23 protected LuanState() { 26 protected LuanState() {
24 registry = new LuanTable(); 27 registry = new LuanTable();
25 global = new LuanTable(); 28 global = new LuanTable();
26 global.put("_G",global); 29 global.put("_G",global);
30 metatable = newMetatable();
27 } 31 }
28 32
29 protected LuanState(LuanState luan) {} 33 protected LuanState(LuanState luan) {}
30 34
31 @Override public void deepenClone(LuanState clone,DeepCloner cloner) { 35 @Override public void deepenClone(LuanState clone,DeepCloner cloner) {
32 clone.registry = cloner.deepClone(registry); 36 clone.registry = cloner.deepClone(registry);
33 clone.global = cloner.deepClone(global); 37 clone.global = cloner.deepClone(global);
38 clone.metatable = cloner.deepClone(metatable);
34 } 39 }
35 40
36 public abstract LuanTable currentEnvironment(); 41 public abstract LuanTable currentEnvironment();
37 42
38 public final LuanTable registry() { 43 public final LuanTable registry() {
74 throw new RuntimeException(e); 79 throw new RuntimeException(e);
75 } 80 }
76 } 81 }
77 82
78 public final LuanTable getMetatable(Object obj) { 83 public final LuanTable getMetatable(Object obj) {
79 return getMetatable(obj,null); 84 if( obj==null )
85 return null;
86 if( obj instanceof LuanTable ) {
87 LuanTable table = (LuanTable)obj;
88 return table.getMetatable();
89 }
90 return metatable;
80 } 91 }
81
82 public abstract LuanTable getMetatable(Object obj,MetatableGetter beforeThis);
83
84 public abstract void addMetatableGetter(MetatableGetter mg);
85 92
86 public final LuanBit bit(LuanElement el) { 93 public final LuanBit bit(LuanElement el) {
87 return new LuanBit(this,el); 94 return new LuanBit(this,el);
88 } 95 }
89 96
90 public final Object getHandler(String op,Object obj) { 97 public final Object getHandler(String op,Object obj) {
91 LuanTable t = getMetatable(obj); 98 LuanTable t = getMetatable(obj);
92 return t==null ? null : t.get(op); 99 return t==null ? null : t.get(op);
93 } 100 }
94 101
102 private static LuanTable newMetatable() {
103 LuanTable metatable = new LuanTable();
104 try {
105 metatable.put( "__index", new LuanJavaFunction(
106 LuanState.class.getMethod("__index",LuanState.class,Object.class,Object.class), null
107 ) );
108 metatable.put( "__newindex", new LuanJavaFunction(
109 LuanState.class.getMethod("__newindex",LuanState.class,Object.class,Object.class,Object.class), null
110 ) );
111 } catch(NoSuchMethodException e) {
112 throw new RuntimeException(e);
113 }
114 return metatable;
115 }
116
117 public static Object __index(LuanState luan,Object obj,Object key) throws LuanException {
118 if( obj instanceof String ) {
119 Object rtn = StringLuan.__index(luan,(String)obj,key);
120 if( rtn != null )
121 return rtn;
122 }
123 return JavaLuan.__index(luan,obj,key);
124 }
125
126 public static void __newindex(LuanState luan,Object obj,Object key,Object value) throws LuanException {
127 JavaLuan.__newindex(luan,obj,key,value);
128 }
95 129
96 // convenience methods 130 // convenience methods
97 131
98 private final LuanBit JAVA = bit(LuanElement.JAVA); 132 private final LuanBit JAVA = bit(LuanElement.JAVA);
99 133