comparison 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
comparison
equal deleted inserted replaced
784:6a7c6879158d 785:d69d3c51c44e
9 import luan.LuanJava; 9 import luan.LuanJava;
10 10
11 11
12 public abstract class Closure extends LuanFunction implements LuanCloneable, Cloneable { 12 public abstract class Closure extends LuanFunction implements LuanCloneable, Cloneable {
13 public Pointer[] upValues; 13 public Pointer[] upValues;
14 public LuanJava java; 14 public LuanJava ljava;
15 private LuanCloner cloner;
15 16
16 public Closure(int nUpValues,LuanJava java) throws LuanException { 17 public Closure(int nUpValues,LuanJava java) throws LuanException {
17 this.upValues = new Pointer[nUpValues]; 18 this.upValues = new Pointer[nUpValues];
18 this.java = java; 19 this.ljava = java;
19 } 20 }
20 21
21 @Override public Closure shallowClone() { 22 @Override public Closure shallowClone() {
22 try { 23 try {
23 return (Closure)clone(); 24 return (Closure)clone();
25 throw new RuntimeException(e); 26 throw new RuntimeException(e);
26 } 27 }
27 } 28 }
28 29
29 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { 30 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
31 check();
30 Closure clone = (Closure)dc; 32 Closure clone = (Closure)dc;
31 clone.upValues = (Pointer[])cloner.clone(upValues); 33 switch( cloner.type ) {
32 clone.java = (LuanJava)cloner.clone(java); 34 case COMPLETE:
35 clone.upValues = (Pointer[])cloner.clone(upValues);
36 clone.ljava = (LuanJava)cloner.clone(ljava);
37 return;
38 case INCREMENTAL:
39 clone.cloner = cloner;
40 clone.upValues = upValues;
41 clone.ljava = ljava;
42 return;
43 }
44 }
45
46 private void check() {
47 if( cloner != null ) {
48 upValues = (Pointer[])cloner.clone(upValues);
49 ljava = (LuanJava)cloner.clone(ljava);
50 cloner = null;
51 }
33 } 52 }
34 53
35 @Override public final Object call(LuanState luan,Object[] args) throws LuanException { 54 @Override public final Object call(LuanState luan,Object[] args) throws LuanException {
55 check();
36 LuanJava old = luan.java; 56 LuanJava old = luan.java;
37 luan.java = java; 57 luan.java = ljava;
38 try { 58 try {
39 return doCall(luan,args); 59 return doCall(luan,args);
40 } catch(StackOverflowError e) { 60 } catch(StackOverflowError e) {
41 throw new LuanException( "stack overflow" ); 61 throw new LuanException( "stack overflow" );
42 } finally { 62 } finally {