annotate core/src/luan/impl/Closure.java @ 668:7780cafca27f

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 Apr 2016 14:13:52 -0600
parents 08966099aa6d
children 58ebfec6178b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
166
4eaee12f6c65 move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 132
diff changeset
1 package luan.impl;
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
111
2428ecfed375 change LuanFunction.call() from returning Object[] to returning Object, to reduce garbage collection
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 86
diff changeset
3 import luan.Luan;
48
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 40
diff changeset
4 import luan.LuanFunction;
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 40
diff changeset
5 import luan.LuanState;
64ecb7a3aad7 rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 40
diff changeset
6 import luan.LuanException;
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
7 import luan.DeepCloner;
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
8 import luan.DeepCloneable;
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
9
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
10
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
11 public abstract class Closure extends LuanFunction implements DeepCloneable, Cloneable {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
12 private final int stackSize;
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
13 private final int numArgs;
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
14 private final boolean isVarArg;
78
7c08b611125d better deep cloning
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 77
diff changeset
15 private UpValue[] upValues;
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
17 public Closure(LuanStateImpl luan,int stackSize,int numArgs,boolean isVarArg,UpValue.Getter[] upValueGetters) throws LuanException {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
18 this.stackSize = stackSize;
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
19 this.numArgs = numArgs;
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
20 this.isVarArg = isVarArg;
195
24ede40ee0aa make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 171
diff changeset
21 this.upValues = new UpValue[upValueGetters.length];
86
6db8f286fa6c _ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 78
diff changeset
22 for( int i=0; i<upValues.length; i++ ) {
6db8f286fa6c _ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 78
diff changeset
23 upValues[i] = upValueGetters[i].get(luan);
32
c3eab5a3ce3c implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 31
diff changeset
24 }
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
25 }
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
26
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
27 @Override public Closure shallowClone() {
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
28 try {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
29 return (Closure)clone();
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
30 } catch(CloneNotSupportedException e) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
31 throw new RuntimeException(e);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
32 }
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
33 }
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
34
433
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 301
diff changeset
35 @Override public void deepenClone(DeepCloneable clone,DeepCloner cloner) {
c6bcb8859b93 make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents: 301
diff changeset
36 ((Closure)clone).upValues = (UpValue[])cloner.deepClone(upValues);
78
7c08b611125d better deep cloning
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 77
diff changeset
37 }
7c08b611125d better deep cloning
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 77
diff changeset
38
7c08b611125d better deep cloning
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 77
diff changeset
39 UpValue[] upValues() {
7c08b611125d better deep cloning
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 77
diff changeset
40 return upValues;
77
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
41 }
4bf3d0c0b6b9 make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 49
diff changeset
42
663
b438a47196bc finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents: 659
diff changeset
43 @Override public Object call(LuanState ls,Object[] args) throws LuanException {
b438a47196bc finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents: 659
diff changeset
44 LuanStateImpl luan = (LuanStateImpl)ls;
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
45 Object[] varArgs = null;
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
46 if( isVarArg ) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
47 if( args.length > numArgs ) {
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
48 varArgs = new Object[ args.length - numArgs ];
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
49 for( int i=0; i<varArgs.length; i++ ) {
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
50 varArgs[i] = args[numArgs+i];
24
7ee247560db5 add VarArgs
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 22
diff changeset
51 }
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
52 } else {
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
53 varArgs = LuanFunction.NOTHING;
24
7ee247560db5 add VarArgs
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 22
diff changeset
54 }
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
55 }
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
56 Object[] stack = luan.newFrame(this,stackSize,varArgs);
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
57 final int n = Math.min(args.length,numArgs);
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
58 for( int i=0; i<n; i++ ) {
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
59 stack[i] = args[i];
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
60 }
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
61 try {
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
62 return run(luan);
663
b438a47196bc finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents: 659
diff changeset
63 } catch(StackOverflowError e) {
b438a47196bc finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents: 659
diff changeset
64 throw new LuanException( "stack overflow", e );
659
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
65 } finally {
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
66 luan.popFrame();
f1150518c467 remove tail recursion
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
67 }
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
68 }
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
69
667
08966099aa6d implement Closure directly
Franklin Schmidt <fschmidt@gmail.com>
parents: 664
diff changeset
70 public abstract Object run(LuanStateImpl luan) throws LuanException;
21
c93d8c781853 add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
71 }