1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.millscript.millscript.functions;
23
24 import org.millscript.millscript.alert.Alerts;
25 import org.millscript.millscript.vm.Machine;
26
27 import java.lang.reflect.Method;
28
29 /**
30 * This class implements a function which invokes one of several Java methods.
31 * The exact Java method that is invoked depends on the number of arguments
32 * supplied when this function is called.
33 */
34 public class JOMethod extends Function {
35
36 /**
37 * The array of methods to choose from, linking the number of arguments
38 * (position in the array) to the Java method to be called.
39 */
40 private final JMethod[] jmethods;
41
42 /**
43 * Constructs a new <code>JOMethod</code> function to invoke one of the
44 * specified Java methods.
45 *
46 * @param meths the array of Java methods to choose from
47 */
48 public JOMethod( final Method[] meths ) {
49 jmethods = new JMethod[ meths.length ];
50 for ( int i = 0; i < meths.length; i++ ) {
51 Method m = meths[ i ];
52 if ( m != null ) {
53 jmethods[ i ] = JMethod.make( m );
54 }
55 }
56 }
57
58 /**
59 * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
60 */
61 @Override
62 public void apply( final Machine mc, final int nargs ) {
63 JMethod j = null;
64 try {
65 j = jmethods[ nargs ];
66 } catch ( IndexOutOfBoundsException ex ) {
67 throw(
68 Alerts.eval(
69 "No method with this arity",
70 null
71 ).culprit( "arity", new Integer( nargs ) ).mishap()
72 );
73 }
74 j.apply( mc, nargs );
75 }
76
77 }