comparison core/src/luan/impl/Closure.java @ 195:24ede40ee0aa

make MetatableGetter DeepCloneable, scoped, and secure git-svn-id: https://luan-java.googlecode.com/svn/trunk@196 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Thu, 03 Jul 2014 08:19:48 +0000
parents 3dcb0f9bee82
children 5ba136769034
comparison
equal deleted inserted replaced
194:08df375e2e5f 195:24ede40ee0aa
9 import luan.DeepCloneable; 9 import luan.DeepCloneable;
10 10
11 11
12 final class Closure extends LuanFunction implements DeepCloneable<Closure> { 12 final class Closure extends LuanFunction implements DeepCloneable<Closure> {
13 private final FnDef fnDef; 13 private final FnDef fnDef;
14 private MtGetterLink mtGetterLink;
14 private UpValue[] upValues; 15 private UpValue[] upValues;
15 16
16 Closure(LuanStateImpl luan,FnDef fnDef) throws LuanException { 17 Closure(LuanStateImpl luan,FnDef fnDef,MtGetterLink mtGetterLink) throws LuanException {
17 this.fnDef = fnDef; 18 this.fnDef = fnDef;
19 this.mtGetterLink = mtGetterLink;
18 UpValue.Getter[] upValueGetters = fnDef.upValueGetters; 20 UpValue.Getter[] upValueGetters = fnDef.upValueGetters;
19 upValues = new UpValue[upValueGetters.length]; 21 this.upValues = new UpValue[upValueGetters.length];
20 for( int i=0; i<upValues.length; i++ ) { 22 for( int i=0; i<upValues.length; i++ ) {
21 upValues[i] = upValueGetters[i].get(luan); 23 upValues[i] = upValueGetters[i].get(luan);
22 } 24 }
23 } 25 }
24 26
29 @Override public Closure shallowClone() { 31 @Override public Closure shallowClone() {
30 return new Closure(this); 32 return new Closure(this);
31 } 33 }
32 34
33 @Override public void deepenClone(Closure clone,DeepCloner cloner) { 35 @Override public void deepenClone(Closure clone,DeepCloner cloner) {
36 clone.mtGetterLink = cloner.deepClone(mtGetterLink);
34 clone.upValues = cloner.deepClone(upValues); 37 clone.upValues = cloner.deepClone(upValues);
38 }
39
40 MtGetterLink mtGetterLink() {
41 return mtGetterLink;
35 } 42 }
36 43
37 UpValue[] upValues() { 44 UpValue[] upValues() {
38 return upValues; 45 return upValues;
39 } 46 }