1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.functions;
22
23 import org.millscript.millscript.expr.LocalIdent;
24 import org.millscript.millscript.vm.Machine;
25 import org.millscript.millscript.vm.Ref;
26
27
28 public final class ClosureFunction extends Function {
29 private final Ref[] outerRefs;
30 private final LocalIdent[] outerIds;
31 private final Object[] outerVals;
32 private final LambdaFunction lambda;
33
34 public ClosureFunction(
35 final Object[] oVals,
36 final Ref[] oRefs,
37 final LocalIdent[] oIds,
38 final LambdaFunction lam
39 ) {
40 this.outerVals = oVals;
41 this.outerRefs = oRefs;
42 this.outerIds = oIds;
43 this.lambda = lam;
44 }
45
46 /**
47 * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
48 */
49 @Override
50 public void apply( final Machine mc, final int nargs ) {
51 mc.startSaving();
52 int numArgs = outerRefs.length;
53 for ( int i = 0; i < numArgs; i++ ) {
54 Ref r = outerRefs[ i ];
55 mc.saveRef( r );
56 r.value = outerVals[ i ];
57 }
58 lambda.apply( mc, nargs );
59 mc.restoreSaved();
60 }
61
62 /**
63 * @see java.lang.Object#toString()
64 */
65 @Override
66 public String toString() {
67 StringBuffer name = new StringBuffer( "<closure {" );
68 String gap = "";
69 for ( int i = 0; i < outerIds.length; i++ ) {
70 LocalIdent id = outerIds[ i ];
71 name.append( gap );
72 gap = ",";
73 name.append( id.getName() );
74 name.append( "=" );
75 name.append( outerVals[ i ] );
76 }
77 name.append( "} " );
78 name.append( lambda );
79 name.append( ">" );
80 return name.toString();
81 }
82
83 }