comparison core/src/luan/LuanState.java @ 171:3dcb0f9bee82

add core component git-svn-id: https://luan-java.googlecode.com/svn/trunk@172 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sun, 22 Jun 2014 05:41:22 +0000
parents src/luan/LuanState.java@ebe9db183eb7
children 4edbf3204ca6
comparison
equal deleted inserted replaced
170:7c792a328a83 171:3dcb0f9bee82
1 package luan;
2
3 import java.io.InputStream;
4 import java.io.PrintStream;
5 import java.util.List;
6 import java.util.ArrayList;
7 import java.util.Map;
8 import java.util.LinkedHashMap;
9 import luan.impl.LuanCompiler;
10 import luan.modules.BasicLuan;
11 import luan.modules.PackageLuan;
12
13
14 public abstract class LuanState implements DeepCloneable<LuanState> {
15 private final LuanBit JAVA = bit(LuanElement.JAVA);
16
17 public LuanException exception(Object msg) {
18 return JAVA.exception(msg);
19 }
20
21 public Object call(LuanFunction fn) throws LuanException {
22 return call(fn,null,LuanFunction.NOTHING);
23 }
24
25 public Object call(LuanFunction fn,String fnName) throws LuanException {
26 return call(fn,fnName,LuanFunction.NOTHING);
27 }
28
29 public Object call(LuanFunction fn,Object[] args) throws LuanException {
30 return call(fn,null,args);
31 }
32
33 public Object call(LuanFunction fn,String fnName,Object[] args) throws LuanException {
34 return JAVA.call(fn,fnName,args);
35 }
36
37 public LuanFunction checkFunction(Object obj) throws LuanException {
38 return JAVA.checkFunction(obj);
39 }
40
41 public String toString(Object obj) throws LuanException {
42 return JAVA.toString(obj);
43 }
44
45 public String repr(Object obj) throws LuanException {
46 return JAVA.repr(obj);
47 }
48
49 public boolean isLessThan(Object o1,Object o2) throws LuanException {
50 return JAVA.isLessThan(o1,o2);
51 }
52
53
54
55 private LuanTable global;
56 private LuanTable loaded;
57 private LuanTable preload;
58 private LuanTable searchers;
59
60 private final List<MetatableGetter> mtGetters;
61 final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>();
62
63 protected LuanState() {
64 global = new LuanTable();
65 global.put("_G",global);
66 global.put( "_VERSION", Luan.version );
67 loaded = new LuanTable();
68 preload = new LuanTable();
69 searchers = new LuanTable();
70 mtGetters = new ArrayList<MetatableGetter>();
71 }
72
73 protected LuanState(LuanState luan) {
74 mtGetters = new ArrayList<MetatableGetter>(luan.mtGetters);
75 }
76
77 @Override public void deepenClone(LuanState clone,DeepCloner cloner) {
78 clone.global = cloner.deepClone(global);
79 clone.loaded = cloner.deepClone(loaded);
80 clone.preload = cloner.deepClone(preload);
81 clone.searchers = cloner.deepClone(searchers);
82 }
83
84 public abstract LuanTable currentEnvironment();
85
86 public final LuanTable global() {
87 return global;
88 }
89
90 public final LuanTable loaded() {
91 return loaded;
92 }
93
94 public final LuanTable preload() {
95 return preload;
96 }
97
98 public final LuanTable searchers() {
99 return searchers;
100 }
101
102 public final Object get(String name) {
103 String[] a = name.split("\\.");
104 LuanTable t = loaded;
105 for( int i=0; i<a.length-1; i++ ) {
106 Object obj = t.get(a[i]);
107 if( !(obj instanceof LuanTable) )
108 return null;
109 t = (LuanTable)obj;
110 }
111 return t.get(a[a.length-1]);
112 }
113
114 public final Object set(String name,Object value) {
115 String[] a = name.split("\\.");
116 LuanTable t = loaded;
117 for( int i=0; i<a.length-1; i++ ) {
118 Object obj = t.get(a[i]);
119 if( !(obj instanceof LuanTable) )
120 return null;
121 t = (LuanTable)obj;
122 }
123 return t.put(a[a.length-1],value);
124 }
125
126 public final void globalImport(String modName) throws LuanException {
127 Object mod = PackageLuan.require(this,modName);
128 global.put(modName,mod);
129 }
130
131 public static LuanState newStandard() {
132 try {
133 LuanState luan = LuanCompiler.newLuanState();
134 luan.globalImport("Package");
135 BasicLuan.do_file(luan,"java:luan/init.luan");
136 return luan;
137 } catch(LuanException e) {
138 throw new RuntimeException(e);
139 }
140 }
141
142 public final Object eval(String cmd) {
143 return eval(cmd,new LuanTable());
144 }
145
146 public final Object eval(String cmd,LuanTable env) {
147 try {
148 LuanFunction fn = BasicLuan.load(this,cmd,"eval",env,true);
149 return call(fn);
150 } catch(LuanException e) {
151 throw new RuntimeException(e);
152 }
153 }
154
155 public final LuanTable getMetatable(Object obj) {
156 if( obj instanceof LuanTable ) {
157 LuanTable table = (LuanTable)obj;
158 return table.getMetatable();
159 }
160 for( MetatableGetter mg : mtGetters ) {
161 LuanTable table = mg.getMetatable(obj);
162 if( table != null )
163 return table;
164 }
165 return null;
166 }
167
168 public final void addMetatableGetter(MetatableGetter mg) {
169 mtGetters.add(mg);
170 }
171
172 public final LuanBit bit(LuanElement el) {
173 return new LuanBit(this,el);
174 }
175
176 public final Object getHandler(String op,Object obj) {
177 LuanTable t = getMetatable(obj);
178 return t==null ? null : t.get(op);
179 }
180
181 }