From: <zy...@us...> - 2008-08-16 05:35:51
|
Revision: 5184 http://jython.svn.sourceforge.net/jython/?rev=5184&view=rev Author: zyasoft Date: 2008-08-16 05:35:48 +0000 (Sat, 16 Aug 2008) Log Message: ----------- Fixes for and in test_builtin: * test_builtin.test_cmp because we let Jython compare objects with cycles in them, unlike CPython * test_builtin.test_general_eval - Jython can use arbitrary maps for globals; this was discussed for CPython. Not in current 2.6, perhaps because it touched a lot of code or issues with performance (see http://bugs.python.org/issue1402289) * __builtin__#eval/compile - Now validate that locals or globals are in fact mapping objects, as well as ensure that locals().keys() is a PyList (to avoid throwing a CheckCastException) * Py#compile_flags - if passed in a String to compile, ensure it does not contain a null byte Modified Paths: -------------- branches/asm/Lib/test/test_builtin.py branches/asm/src/org/python/core/Py.java branches/asm/src/org/python/core/__builtin__.java Modified: branches/asm/Lib/test/test_builtin.py =================================================================== --- branches/asm/Lib/test/test_builtin.py 2008-08-15 23:03:17 UTC (rev 5183) +++ branches/asm/Lib/test/test_builtin.py 2008-08-16 05:35:48 UTC (rev 5184) @@ -209,15 +209,15 @@ self.assertEqual(cmp(-1, 1), -1) self.assertEqual(cmp(1, -1), 1) self.assertEqual(cmp(1, 1), 0) - # verify that circular objects are not handled + # verify that circular objects are handled for Jython a = []; a.append(a) b = []; b.append(b) from UserList import UserList c = UserList(); c.append(c) - self.assertRaises(RuntimeError, cmp, a, b) - self.assertRaises(RuntimeError, cmp, b, c) - self.assertRaises(RuntimeError, cmp, c, a) - self.assertRaises(RuntimeError, cmp, a, c) + self.assertEqual(cmp(a, b), 0) + self.assertEqual(cmp(b, c), 0) + self.assertEqual(cmp(c, a), 0) + self.assertEqual(cmp(a, c), 0) # okay, now break the cycles a.pop(); b.pop(); c.pop() self.assertRaises(TypeError, cmp) @@ -330,7 +330,9 @@ self.assertEqual(eval('dir()', g, m), list('xyz')) self.assertEqual(eval('globals()', g, m), g) self.assertEqual(eval('locals()', g, m), m) - self.assertRaises(TypeError, eval, 'a', m) + + # Jython allows arbitrary mappings for globals + self.assertEqual(eval('a', m), 12) class A: "Non-mapping" pass Modified: branches/asm/src/org/python/core/Py.java =================================================================== --- branches/asm/src/org/python/core/Py.java 2008-08-15 23:03:17 UTC (rev 5183) +++ branches/asm/src/org/python/core/Py.java 2008-08-16 05:35:48 UTC (rev 5184) @@ -1682,6 +1682,11 @@ String filename, String type, CompilerFlags cflags) { + + if (data.contains("\0")) { + throw Py.TypeError("compile() expected string without null bytes"); + } + byte[] bytes; if (cflags.dont_imply_dedent) { bytes = StringUtil.toBytes(data + "\n"); Modified: branches/asm/src/org/python/core/__builtin__.java =================================================================== --- branches/asm/src/org/python/core/__builtin__.java 2008-08-15 23:03:17 UTC (rev 5183) +++ branches/asm/src/org/python/core/__builtin__.java 2008-08-16 05:35:48 UTC (rev 5184) @@ -479,14 +479,12 @@ public static PyObject dir() { PyObject l = locals(); PyList ret; - - if (l instanceof PyStringMap) { - ret = ((PyStringMap) l).keys(); - } else if (l instanceof PyDictionary) { - ret = ((PyDictionary) l).keys(); + PyObject retObj = l.invoke("keys"); + try { + ret = (PyList) retObj; + } catch (ClassCastException e) { + throw Py.TypeError("Expected keys() to be a list, not '" + retObj.getType().fastGetName() + "'"); } - - ret = (PyList) l.invoke("keys"); ret.sort(); return ret; } @@ -499,7 +497,25 @@ return new PyEnumerate(seq); } + private static boolean PyMapping_check(PyObject o, boolean rw) { + return o == null || + o == Py.None || + (o instanceof PyDictionary) || + (o.__findattr__("__getitem__") != null && + (!rw || o.__findattr__("__setitem__") != null)); + } + + private static void verify_mappings(PyObject globals, PyObject locals, boolean rw) { + if (!PyMapping_check(globals, rw)) { + throw Py.TypeError("globals must be a mapping"); + } + if (!PyMapping_check(locals, rw)) { + throw Py.TypeError("locals must be a mapping"); + } + } + public static PyObject eval(PyObject o, PyObject globals, PyObject locals) { + verify_mappings(globals, locals, false); PyCode code; if (o instanceof PyCode) { code = (PyCode) o; @@ -529,6 +545,7 @@ } public static void execfile_flags(String name, PyObject globals, PyObject locals, CompilerFlags cflags) { + verify_mappings(globals, locals, true); java.io.FileInputStream file; try { file = new java.io.FileInputStream(new RelativeFile(name)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |