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;
 }