summaryrefslogtreecommitdiffstats
path: root/external/beanshell/beanshell-invoke.patch
blob: b78f1db6164207e75372e3811fdfb5db08203744 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
--- old/beanshell/engine/src/bsh/engine/BshScriptEngine.java
+++ new/beanshell/engine/src/bsh/engine/BshScriptEngine.java
@@ -229,6 +229,12 @@
 		}
 	}
 
+	public Object invoke( Object thiz, String name, Object... args )
+	throws ScriptException, NoSuchMethodException
+	{
+		return invokeMethod( thiz, name, args );
+	}
+
 	/**
 	 * Same as invoke(Object, String, Object...) with <code>null</code> as the
 	 * first argument.  Used to call top-level procedures defined in scripts.
@@ -249,6 +255,12 @@
 		return invokeMethod( getGlobal(), name, args );
 	}
 
+	public Object invoke( String name, Object... args )
+		throws ScriptException, NoSuchMethodException
+	{
+		return invokeFunction( name, args );
+	}
+
     /**
 	 * Returns an implementation of an interface using procedures compiled in the
 	 * interpreter. The methods of the interface may be implemented using the
--- old/beanshell/engine/src/TestBshScriptEngine.java
+++ new/beanshell/engine/src/TestBshScriptEngine.java
@@ -2,11 +2,12 @@
 import java.io.*;
 import javax.script.*;
 import static javax.script.ScriptContext.*;
+import java.lang.reflect.*;
 
 public class TestBshScriptEngine
 {
 	public static void main( String [] args )
-		throws ScriptException, NoSuchMethodException, IOException
+		throws ScriptException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException
 	{
 		ScriptEngineManager manager =
 			new ScriptEngineManager( bsh.Interpreter.class.getClassLoader() );
@@ -39,11 +40,23 @@
 		assertTrue( engine.get("bar").equals("gee") );
 		assertTrue( engine.eval("bar").equals("gee") );
 
+		// use reflection to pick available method
+		Method invokeMe = null;
+		try {
+			invokeMe = Invocable.class.getMethod( "invokeFunction", String.class, Object[].class );
+		} catch ( Exception e ) { }
+		if (invokeMe == null)
+		{
+			try {
+				invokeMe = Invocable.class.getMethod( "invoke", String.class, Object[].class );
+			} catch ( Exception e ) { }
+		}
+
 		// install and invoke a method
 		engine.eval("foo() { return foo+1; }");
 		// invoke a method
 		Invocable invocable = (Invocable) engine;
-		int foo = (Integer)invocable.invokeFunction( "foo" );
+		int foo = (Integer)invokeMe.invoke( invocable, "foo", (Object) new Object[]{} );
 		assertTrue( foo == 43 );
 
 		// get interface
@@ -58,7 +71,7 @@
 		engine.eval(
 			"flag2=false; myObj() { run() { flag2=true; } return this; }");
 		assertTrue( (Boolean)engine.get("flag2") == false );
-		Object scriptedObject = invocable.invokeFunction("myObj");
+		Object scriptedObject = invokeMe.invoke( invocable, "myObj", (Object) new Object[]{} );
 		assertTrue( scriptedObject instanceof bsh.This );
 		runnable =
 			(Runnable)invocable.getInterface( scriptedObject, Runnable.class );