Mercurial Hosting > luan
diff src/luan/LuanClosure.java @ 1335:e0cf0d108a77
major cleanup
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Feb 2019 03:10:45 -0700 |
parents | 25746915a241 |
children | 643cf1c37723 |
line wrap: on
line diff
--- a/src/luan/LuanClosure.java Tue Feb 12 22:53:57 2019 -0700 +++ b/src/luan/LuanClosure.java Thu Feb 14 03:10:45 2019 -0700 @@ -3,51 +3,26 @@ import luan.impl.Pointer; -public abstract class LuanClosure extends LuanFunction implements LuanCloneable, Cloneable { +public abstract class LuanClosure extends LuanFunction { public Pointer[] upValues; public boolean javaOk; public final String sourceName; - private LuanCloner cloner; - public LuanClosure(int nUpValues,boolean javaOk,String sourceName) throws LuanException { + public LuanClosure(Luan luan,int nUpValues,boolean javaOk,String sourceName) throws LuanException { + super(luan); this.upValues = new Pointer[nUpValues]; this.javaOk = javaOk; this.sourceName = sourceName; } - @Override public LuanClosure shallowClone() { - check(); - try { - return (LuanClosure)clone(); - } catch(CloneNotSupportedException e) { - throw new RuntimeException(e); - } + @Override protected void completeClone(LuanFunction dc,LuanCloner cloner) { + LuanClosure clone = (LuanClosure)dc; + clone.upValues = (Pointer[])cloner.clone(upValues); + super.completeClone(dc,cloner); } - @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { - LuanClosure clone = (LuanClosure)dc; - switch( cloner.type ) { - case COMPLETE: - clone.upValues = (Pointer[])cloner.clone(upValues); - return; - case INCREMENTAL: - clone.cloner = cloner; - clone.upValues = upValues; - return; - } - } - - private void check() { - if( cloner != null ) { - upValues = (Pointer[])cloner.clone(upValues); - cloner = null; - } - } - - @Override public final Object call(Luan luan,Object[] args) throws LuanException { - if( luan.isLocked ) - throw new RuntimeException("luan is locked"); - check(); + @Override public final Object call(Object[] args) throws LuanException { + Luan luan = luan(); luan.push(this); try { return doCall(luan,args); @@ -58,5 +33,9 @@ } } + @Override public String toString() { + return super.toString()+"="+sourceName; + } + public abstract Object doCall(Luan luan,Object[] args) throws LuanException; }