Mercurial Hosting > luan
diff src/luan/LuanFunction.java @ 1335:e0cf0d108a77
major cleanup
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Feb 2019 03:10:45 -0700 |
parents | 25746915a241 |
children | e1a13e707bf3 |
line wrap: on
line diff
--- a/src/luan/LuanFunction.java Tue Feb 12 22:53:57 2019 -0700 +++ b/src/luan/LuanFunction.java Thu Feb 14 03:10:45 2019 -0700 @@ -1,16 +1,72 @@ package luan; -public abstract class LuanFunction { +public abstract class LuanFunction implements LuanCloneable, Cloneable { + private Luan luan; + private LuanCloner cloner; + private boolean clone; + + public LuanFunction(Luan luan) { + if( luan==null ) throw new NullPointerException(); + this.luan = luan; + this.clone = true; + } + + public LuanFunction(boolean clone) { + this.clone = clone; + } + + // for LuanJavaFunction + void dontClone() { + luan = null; + clone = false; + } + + @Override public LuanFunction shallowClone() { + if( !clone ) + return this; + check(); + try { + return (LuanFunction)clone(); + } catch(CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } - public abstract Object call(Luan luan,Object[] args) throws LuanException; + private void check() { + if( cloner != null ) { + completeClone(this,cloner); + cloner = null; + } + } + + @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { + if( !clone ) + return; + LuanFunction clone = (LuanFunction)dc; + switch( cloner.type ) { + case COMPLETE: + completeClone(clone,cloner); + return; + case INCREMENTAL: + clone.cloner = cloner; + return; + } + } + + protected void completeClone(LuanFunction clone,LuanCloner cloner) { + clone.luan = (Luan)cloner.clone(luan); + } + + public Luan luan() { + check(); + return luan; + } + + public abstract Object call(Object... args) throws LuanException; public static final Object[] NOTHING = new Object[0]; - public final Object call(Luan luan) throws LuanException { - return call(luan,NOTHING); - } - @Override public String toString() { return "function: " + Integer.toHexString(hashCode()); }