Issue1681
Created on 2010-12-05.10:09:13 by otmarhumbel, last changed 2010-12-24.01:37:07 by pjenvey.
msg6267 (view) |
Author: Oti Humbel (otmarhumbel) |
Date: 2010-12-05.10:09:13 |
|
[submitted on behalf of Christian Blichmann]
Calling methods from an embedded Jython script does nothing when
using JSR-223 and Jython 2.5.2rc2, while Jython 2.2.1 just works fine.
- ------------- myscript/ScriptingTest.java -------------
package myscript;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class ScriptingTest {
public static void main(String[] args) {
try {
final ScriptEngineManager manager =
new ScriptEngineManager();
final ScriptEngine engine =
manager.getEngineByName("python");
final InputStream is =
ScriptingTest.class.getResourceAsStream(
"/myscript/myscript.py");
engine.eval(new InputStreamReader(is));
} catch (final Exception e) {
e.printStackTrace();
}
}
}
- ------------- myscript/PythonCallable.java -------------
package myscript;
public interface PythonCallable {
String getAString();
void callAVoid();
}
- ------------- myscript/myscript.py -------------
from myscript import PythonCallable as PythonCallable
class MyPythonCallable(PythonCallable):
def getAString(self):
return 'A string'
def callAVoid(self):
print 'Called a void method'
print 'getAString() returns: %s' % \
MyPythonCallable().getAString()
print 'callAVoid():'
MyPythonCallable().callAVoid()
- ------------------------------------------------
Using Jython 2.2.1, I get:
$ java -cp .:jython.jar:jython-engine.jar myscript.ScriptingTest
getAString() returns: A string
callAVoid():
Called a void method
|
msg6292 (view) |
Author: Philip Jenvey (pjenvey) |
Date: 2010-12-22.20:55:27 |
|
The problem here lies in PyScriptEngineScope.__setitem__. All values that pass through it are first converted via value.__tojava__(Object.class)
In this case, the __tojava__ call is made on the user defined MyPythonCallable class. Its __tojava__ returns its Proxy object here, which is the cause of the havoc we're seeing
I'm not sure who's at fault -- Nick, what's the point of the __tojava__(Object.class) call here? Is it necessary in all cases?
We either need to add special cases to the scope__setitem__, or fix the __tojava__ result for user defined classes that have an underlying proxy. Might the latter break anything else?
|
msg6293 (view) |
Author: Nicholas Riley (nriley) |
Date: 2010-12-22.23:53:00 |
|
I never really understood the full implications of __tojava__ so I think I was probably just copying something else (perhaps the previous JSR 223 implementation). Please feel free to change it as you wish.
|
msg6295 (view) |
Author: Philip Jenvey (pjenvey) |
Date: 2010-12-24.00:22:33 |
|
It seems the original jsr223 impl had a similar issue to this one:
https://scripting.dev.java.net/issues/show_bug.cgi?id=5
Its fix (which was really for Jython 2.2) basically added this line to __setitem__
if (!(obj instanceof PyClass)) {
obj = JythonScriptEngine.py2java(value);
}
This isn't the most efficient fix in the world (adding an instanceof check for any kind of assignment). But whatever -- I propose the attached patch with a similar fix
|
msg6296 (view) |
Author: Philip Jenvey (pjenvey) |
Date: 2010-12-24.00:23:12 |
|
Their JythonScope class with their fix is here:
https://scripting.dev.java.net/source/browse/scripting/engines/jython/src/com/sun/script/jython/JythonScope.java?rev=1.2&view=markup
|
msg6297 (view) |
Author: Philip Jenvey (pjenvey) |
Date: 2010-12-24.00:26:11 |
|
I mean, we're already doing a __tojava__(Object.class) for every assignment so an additional instanceof check shouldn't matter
|
msg6301 (view) |
Author: Philip Jenvey (pjenvey) |
Date: 2010-12-24.01:37:07 |
|
fix+test applied in r7175
|
|
Date |
User |
Action |
Args |
2010-12-24 01:37:07 | pjenvey | set | status: open -> closed resolution: fixed messages:
+ msg6301 |
2010-12-24 00:26:11 | pjenvey | set | messages:
+ msg6297 |
2010-12-24 00:23:12 | pjenvey | set | messages:
+ msg6296 |
2010-12-24 00:22:34 | pjenvey | set | files:
+ 1681-type-check.diff keywords:
+ patch messages:
+ msg6295 |
2010-12-22 23:53:00 | nriley | set | messages:
+ msg6293 |
2010-12-22 20:55:27 | pjenvey | set | nosy:
+ pjenvey, zyasoft, nriley messages:
+ msg6292 |
2010-12-13 08:21:44 | cblichmann | set | severity: normal -> major versions:
+ 2.5b0, 2.5.1, 2.5b1, 2.5.0, 2.5.2rc |
2010-12-05 10:09:13 | otmarhumbel | create | |
|