Mercurial Hosting > luan
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 { |