comparison core/src/luan/impl/Closure.java @ 670:58ebfec6178b

all luan now compiles
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 12 Apr 2016 01:05:57 -0600
parents 7780cafca27f
children d3e5414bdf4c
comparison
equal deleted inserted replaced
669:e320488819b6 670:58ebfec6178b
7 import luan.DeepCloner; 7 import luan.DeepCloner;
8 import luan.DeepCloneable; 8 import luan.DeepCloneable;
9 9
10 10
11 public abstract class Closure extends LuanFunction implements DeepCloneable, Cloneable { 11 public abstract class Closure extends LuanFunction implements DeepCloneable, Cloneable {
12 private final int stackSize; 12 public Pointer[] upValues;
13 private final int numArgs;
14 private final boolean isVarArg;
15 private UpValue[] upValues;
16 13
17 public Closure(LuanStateImpl luan,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) throws LuanException { 14 public Closure(int nUpValues) throws LuanException {
18 this.stackSize = stackSize; 15 this.upValues = new Pointer[nUpValues];
19 this.numArgs = numArgs;
20 this.isVarArg = isVarArg;
21 this.upValues = new UpValue[upValueGetters.length];
22 for( int i=0; i<upValues.length; i++ ) {
23 upValues[i] = upValueGetters[i].get(luan);
24 }
25 } 16 }
26 17
27 @Override public Closure shallowClone() { 18 @Override public Closure shallowClone() {
28 try { 19 try {
29 return (Closure)clone(); 20 return (Closure)clone();
31 throw new RuntimeException(e); 22 throw new RuntimeException(e);
32 } 23 }
33 } 24 }
34 25
35 @Override public void deepenClone(DeepCloneable clone,DeepCloner cloner) { 26 @Override public void deepenClone(DeepCloneable clone,DeepCloner cloner) {
36 ((Closure)clone).upValues = (UpValue[])cloner.deepClone(upValues); 27 ((Closure)clone).upValues = (Pointer[])cloner.deepClone(upValues);
37 } 28 }
38 29
39 UpValue[] upValues() { 30 @Override public final Object call(LuanState ls,Object[] args) throws LuanException {
40 return upValues; 31 LuanStateImpl luan = (LuanStateImpl)ls;
32 Closure old = luan.closure;
33 luan.closure = this;
34 try {
35 return doCall(luan,args);
36 } finally {
37 luan.closure = old;
38 }
41 } 39 }
42 40
43 @Override public Object call(LuanState ls,Object[] args) throws LuanException { 41 public abstract Object doCall(LuanState luan,Object[] args) throws LuanException;
44 LuanStateImpl luan = (LuanStateImpl)ls;
45 Object[] varArgs = null;
46 if( isVarArg ) {
47 if( args.length > numArgs ) {
48 varArgs = new Object[ args.length - numArgs ];
49 for( int i=0; i<varArgs.length; i++ ) {
50 varArgs[i] = args[numArgs+i];
51 }
52 } else {
53 varArgs = LuanFunction.NOTHING;
54 }
55 }
56 Object[] stack = luan.newFrame(this,stackSize,varArgs);
57 final int n = Math.min(args.length,numArgs);
58 for( int i=0; i<n; i++ ) {
59 stack[i] = args[i];
60 }
61 try {
62 return run(luan);
63 } catch(StackOverflowError e) {
64 throw new LuanException( "stack overflow", e );
65 } finally {
66 luan.popFrame();
67 }
68 }
69
70 public abstract Object run(LuanStateImpl luan) throws LuanException;
71 } 42 }