### Eclipse Workspace Patch 1.0 #P jython-trunk Index: src/org/python/jsr223/PyScriptEngineScope.java =================================================================== --- src/org/python/jsr223/PyScriptEngineScope.java (revision 7168) +++ src/org/python/jsr223/PyScriptEngineScope.java (working copy) @@ -1,10 +1,15 @@ package org.python.jsr223; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; import org.python.core.Py; +import org.python.core.PyDictionary; +import org.python.core.PyIterator; import org.python.core.PyList; import org.python.core.PyObject; import org.python.core.PyString; @@ -56,16 +61,31 @@ return members; } - // Not necessary for functionality; present to satisfy __builtin__.PyMapping_check + // satisfy mapping @ExposedMethod + @Override public PyObject __getitem__(PyObject key) { - return super.__getitem__(key); + return __finditem__(key); } + // satisfy iterable + @ExposedMethod + @Override + public PyObject __iter__() { + return new ScopeIterator(this); + } + + @Override + public String toString() { + return getDictionary().toString(); + } + + @Override public PyObject __finditem__(PyObject key) { return __finditem__(key.asString()); } + @Override public PyObject __finditem__(String key) { int scope = context.getAttributesScope(key); if (scope == -1) @@ -74,10 +94,12 @@ } @ExposedMethod + @Override public void __setitem__(PyObject key, PyObject value) { __setitem__(key.asString(), value); } + @Override public void __setitem__(String key, PyObject value) { int scope = context.getAttributesScope(key); if (scope == -1) @@ -86,14 +108,57 @@ } @ExposedMethod + @Override public void __delitem__(PyObject key) { __delitem__(key.asString()); } + @Override public void __delitem__(String key) { int scope = context.getAttributesScope(key); if (scope == -1) throw Py.KeyError(key); context.removeAttribute(key, scope); } + + private Map getMap() { + ScopeIterator iterator = new ScopeIterator(this); + Map map = new HashMap(iterator.size()); + PyObject key = iterator.__iternext__(); + while (key != null) { + map.put(key, __finditem__(key)); + key = iterator.__iternext__(); + } + return map; + } + + private PyDictionary getDictionary() { + return new PyDictionary(getMap()); + } + + public class ScopeIterator extends PyIterator { + private int _index; + private int _size; + private PyObject _keys; + + ScopeIterator(PyScriptEngineScope scope) { + _keys = scope.scope_keys(); + _size = _keys.__len__(); + _index = -1; + } + + public int size() { + return _size; + } + + @Override + public PyObject __iternext__() { + PyObject result = null; + _index++; + if (_index < size()) { + result = _keys.__getitem__(_index); + } + return result; + } + } } Index: tests/java/org/python/jsr223/ScriptEngineTest.java =================================================================== --- tests/java/org/python/jsr223/ScriptEngineTest.java (revision 7151) +++ tests/java/org/python/jsr223/ScriptEngineTest.java (working copy) @@ -206,4 +206,48 @@ Object newStringCapitalize = invocableEngine.invokeMethod("test", "capitalize"); assertEquals(newStringCapitalize, "Test"); } + + public void testPdb() { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + // String from issue 1674 + String pdbString = "from pdb import set_trace; set_trace()"; + try { + pythonEngine.eval(pdbString); + fail("bdb.BdbQuit expected"); + } catch (ScriptException e) { + assertTrue(e.getMessage().startsWith("bdb.BdbQuit")); + } + } + + public void testScope_repr() throws ScriptException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + pythonEngine.eval("a = 4"); + pythonEngine.eval("b = 'hi'"); + pythonEngine.eval("localrepr = `locals()`"); + assertEquals("{'b': u'hi', 'a': 4}", pythonEngine.get("localrepr")); + } + + public void testScope_iter() throws ScriptException { + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + pythonEngine.eval("a = 4"); + pythonEngine.eval("b = 'hi'"); + pythonEngine.eval("list = []"); + pythonEngine.eval("for loc in locals(): list.append(loc)"); + pythonEngine.eval("listrepr = `list`"); + assertEquals("[u'a', u'b', u'list']", pythonEngine.get("listrepr")); + } + + public void testScope_lookup() throws ScriptException{ + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine pythonEngine = manager.getEngineByName("python"); + pythonEngine.eval("a = 4"); + pythonEngine.eval("b = 'hi'"); + pythonEngine.eval("var_a = locals()['a']"); + pythonEngine.eval("arepr = `var_a`"); + assertEquals("4", pythonEngine.get("arepr")); + } + }