Mercurial Hosting > luan
diff src/luan/impl/Closure.java @ 785:d69d3c51c44e
more work on incremental cloning
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 01 Sep 2016 21:32:28 -0600 |
parents | 6a7c6879158d |
children | c49980cdece6 |
line wrap: on
line diff
--- a/src/luan/impl/Closure.java Tue Aug 30 12:08:49 2016 -0600 +++ b/src/luan/impl/Closure.java Thu Sep 01 21:32:28 2016 -0600 @@ -11,11 +11,12 @@ public abstract class Closure extends LuanFunction implements LuanCloneable, Cloneable { public Pointer[] upValues; - public LuanJava java; + public LuanJava ljava; + private LuanCloner cloner; public Closure(int nUpValues,LuanJava java) throws LuanException { this.upValues = new Pointer[nUpValues]; - this.java = java; + this.ljava = java; } @Override public Closure shallowClone() { @@ -27,14 +28,33 @@ } @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { + check(); Closure clone = (Closure)dc; - clone.upValues = (Pointer[])cloner.clone(upValues); - clone.java = (LuanJava)cloner.clone(java); + switch( cloner.type ) { + case COMPLETE: + clone.upValues = (Pointer[])cloner.clone(upValues); + clone.ljava = (LuanJava)cloner.clone(ljava); + return; + case INCREMENTAL: + clone.cloner = cloner; + clone.upValues = upValues; + clone.ljava = ljava; + return; + } + } + + private void check() { + if( cloner != null ) { + upValues = (Pointer[])cloner.clone(upValues); + ljava = (LuanJava)cloner.clone(ljava); + cloner = null; + } } @Override public final Object call(LuanState luan,Object[] args) throws LuanException { + check(); LuanJava old = luan.java; - luan.java = java; + luan.java = ljava; try { return doCall(luan,args); } catch(StackOverflowError e) {