Mercurial Hosting > luan
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 |