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