Mercurial Hosting > luan
diff src/luan/LuanState.java @ 77:4bf3d0c0b6b9
make LuanState cloneable
git-svn-id: https://luan-java.googlecode.com/svn/trunk@78 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 15 Feb 2013 09:55:17 +0000 |
parents | aa7538ae5fb6 |
children | cca4f8522893 |
line wrap: on
line diff
--- a/src/luan/LuanState.java Fri Feb 15 04:52:16 2013 +0000 +++ b/src/luan/LuanState.java Fri Feb 15 09:55:17 2013 +0000 @@ -14,21 +14,53 @@ import luan.lib.HtmlLib; -public abstract class LuanState { +public abstract class LuanState implements DeepCloneable<LuanState> { - public final LuanTable global = new LuanTable(); - public final LuanTable loaded = new LuanTable(); - public final LuanTable preload = new LuanTable(); + private LuanTable global; + private LuanTable loaded; + private LuanTable preload; public InputStream in = System.in; public PrintStream out = System.out; public PrintStream err = System.err; - private final List<MetatableGetter> mtGetters = new ArrayList<MetatableGetter>(); + private final List<MetatableGetter> mtGetters; final List<StackTraceElement> stackTrace = new ArrayList<StackTraceElement>(); + protected LuanState() { + global = new LuanTable(); + loaded = new LuanTable(); + preload = new LuanTable(); + mtGetters = new ArrayList<MetatableGetter>(); + } - public Object get(String name) { + protected LuanState(LuanState luan) { + mtGetters = new ArrayList<MetatableGetter>(luan.mtGetters); + } + + public final LuanState deepClone() { + return new DeepCloner().deepClone(this); + } + + @Override public void deepenClone(LuanState clone,DeepCloner cloner) { + clone.global = cloner.deepClone(global); + clone.loaded = cloner.deepClone(loaded); + clone.preload = cloner.deepClone(preload); + } + + public final LuanTable global() { + return global; + } + + public final LuanTable loaded() { + return loaded; + } + + public final LuanTable preload() { + return preload; + } + + public final Object get(String name) { String[] a = name.split("\\."); LuanTable t = global; for( int i=0; i<a.length-1; i++ ) { @@ -40,7 +72,7 @@ return t.get(a[a.length-1]); } - public Object set(String name,Object value) { + public final Object set(String name,Object value) { String[] a = name.split("\\."); LuanTable t = global; for( int i=0; i<a.length-1; i++ ) { @@ -52,7 +84,7 @@ return t.put(a[a.length-1],value); } - public void load(LuanFunction loader,String modName) throws LuanException { + public final void load(LuanFunction loader,String modName) throws LuanException { Object mod = Luan.first(call(loader,LuanElement.JAVA,"loader",modName)); if( mod == null ) mod = true; @@ -77,7 +109,7 @@ } } - public Object[] eval(String cmd,String sourceName) throws LuanException { + public final Object[] eval(String cmd,String sourceName) throws LuanException { LuanFunction fn = BasicLib.load(this,cmd,sourceName); return call(fn,null,null); } @@ -100,7 +132,7 @@ mtGetters.add(mg); } - public Object[] call(LuanFunction fn,LuanElement calledFrom,String fnName,Object... args) throws LuanException { + public final Object[] call(LuanFunction fn,LuanElement calledFrom,String fnName,Object... args) throws LuanException { stackTrace.add( new StackTraceElement(calledFrom,fnName) ); try { return fn.call(this,args);