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) {