View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   // MillScript: an Open Spice interpreter and batch website creation tool
3   // Copyright (C) 2001-2004 Open World Ltd
4   //
5   // This file is part of MillScript.
6   //
7   // MillScript is free software; you can redistribute it and/or modify it under
8   // the terms of the GNU General Public License as published by the Free
9   // Software Foundation; either version 2 of the License, or (at your option)
10  // any later version.
11  //
12  // MillScript is distributed in the hope that it will be useful, but WITHOUT
13  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  // more details.
16  //
17  // You should have received a copy of the GNU General Public License along with
18  // MillScript; if not, write to the Free Software Foundation, Inc., 59 Temple
19  // Place, Suite 330, Boston, MA  02111-1307  USA
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;       //  supplied for debugger (future)
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  }