[Python-checkins] r51944 - in python/branches/bcannon-objcap: Lib/test/test_interpreter.py Modules/interpretermodule.c

brett.cannon python-checkins at python.org
Thu Sep 21 01:56:57 CEST 2006


Author: brett.cannon
Date: Thu Sep 21 01:56:57 2006
New Revision: 51944

Modified:
   python/branches/bcannon-objcap/Lib/test/test_interpreter.py
   python/branches/bcannon-objcap/Modules/interpretermodule.c
Log:
Make sys_dict a function since the data dict seems to get cached somewhere.


Modified: python/branches/bcannon-objcap/Lib/test/test_interpreter.py
==============================================================================
--- python/branches/bcannon-objcap/Lib/test/test_interpreter.py	(original)
+++ python/branches/bcannon-objcap/Lib/test/test_interpreter.py	Thu Sep 21 01:56:57 2006
@@ -134,7 +134,6 @@
         self.failUnless('token' not in self.interp.modules)
         self.interp.execute('import token')
         del self.interp.modules['token']
-        # XXX should really check that ImportError not raised.
         self.interp.execute('import token')
         
     def test_replacing(self):
@@ -155,7 +154,18 @@
         self.interp.execute("import token;"
                             "_return.append(hasattr(token, 'test'))")
         self.failUnless(not _return[-1])
-
+        
+    def test_not_cached(self):
+        # Make sure that 'modules' dict is not cached.
+        builtin = self.interp.modules['__builtin__']
+        main = self.interp.modules['__main__']
+        self.interp.execute("import token")
+        self.interp.modules = {}
+        self.interp.modules['__builtin__'] = builtin
+        self.interp.modules['__main__'] = main
+        self.interp.execute("import token")
+        self.failUnless('token' in self.interp.modules)
+        
 
 class SysDictTests(BaseInterpTests):
 
@@ -163,20 +173,13 @@
 
     def test_get(self):
         # Make sure a dict is returned.
-        sys_dict = self.interp.sys_dict
+        sys_dict = self.interp.sys_dict()
         self.failUnless(isinstance(sys_dict, dict))
         self.failUnless('version' in sys_dict)
 
-    def test_set(self):
-        # Make sure sys_dict can be set to a new dict and that it has desired
-        # effect.
-        self.failUnlessRaises(TypeError, setattr, self.interp, 'sys_dict', [])
-        # XXX requires exceptions
-        # set to new dict, make sure exceptions raised when trying to get attribute from sys
-
     def test_mutating(self):
         # Changes to the dict should be reflected in the interpreter.
-        sys_dict = self.interp.sys_dict
+        sys_dict = self.interp.sys_dict()
         sys_dict['version'] = 'test'
         interp_return = []
         self.interp.builtins()['to_return'] = interp_return
@@ -186,7 +189,7 @@
     def test_deletion(self):
         # Make sure removing a value raises the proper exception when accessing
         # through the 'sys' module.
-        del self.interp.sys_dict['version']
+        del self.interp.sys_dict()['version']
         # XXX requires exceptions
         # XXX self.failUnlessRaises(XXX, self.interp.execute,
         #                           'import sys; sys.version')
@@ -194,14 +197,14 @@
     def test_copied(self):
         # sys_dict should be unique per interpreter (including mutable data
         # structures).
-        sys_dict = self.interp.sys_dict
-        sys_dict['version'] = 'test'
-        self.failUnless(sys.version != 'test')
-        # XXX check mutable data structures
-        sys_dict.setdefault('argv', []).append('test')
-        self.failUnless(sys.argv[-1] != 'test')
-        sys_dict['path'].append('test')
-        self.failUnless(sys.path[-1] != 'test')
+        sys_version = sys.version
+        self.interp.sys_dict()['version'] = 'test'
+        reload(sys)
+        self.failUnlessEqual(sys.version, sys_version)
+        _return = []
+        self.interp.builtins()['_return'] = _return
+        self.interp.execute("import sys; _return.append(sys.version)")
+        self.failUnlessEqual(_return[-1], 'test')
         
 
 class InputOutputTests(BaseInterpTests):

Modified: python/branches/bcannon-objcap/Modules/interpretermodule.c
==============================================================================
--- python/branches/bcannon-objcap/Modules/interpretermodule.c	(original)
+++ python/branches/bcannon-objcap/Modules/interpretermodule.c	Thu Sep 21 01:56:57 2006
@@ -64,6 +64,34 @@
     return (PyObject *)self;
 }
 
+/*
+ Getter for 'builtins'.
+ 
+ There is not setter because the creation of a new interpreter automatically
+ creates the initial execution frame which caches the built-in namespace.
+ */
+static PyObject *
+interpreter_builtins(PyObject *self)
+{
+    PyObject *builtins = PyInterpreter_GET_INTERP(self)->builtins;
+    
+    Py_INCREF(builtins);
+    return builtins;
+}
+
+/*
+ Getter for 'sys_dict'.
+ 
+ There is no setter because the dict gets cached somewhere.
+ */
+static PyObject *
+interpreter_sys_dict(PyObject *self)
+{
+    PyObject *sys_dict = PyInterpreter_GET_INTERP(self)->sysdict;
+    
+    Py_INCREF(sys_dict);
+    return sys_dict;
+}
 
 /*
    Execute Python source code in the interpreter.
@@ -103,21 +131,6 @@
     Py_RETURN_NONE;
 }
 
-/*
- Getter for 'builtins'.
- 
- There is not setter because the creation of a new interpreter automatically
- creates the initial execution frame which caches the built-in namespace.
- */
-static PyObject *
-interpreter_builtins(PyObject *self)
-{
-    PyObject *builtins = PyInterpreter_GET_INTERP(self)->builtins;
-    
-    Py_INCREF(builtins);
-    return builtins;
-}
-
 static PyObject *
 redirect_output(PyObject *self, PyObject *args)
 {
@@ -164,6 +177,8 @@
 static PyMethodDef interpreter_methods[] = {
     {"builtins", (PyCFunction)interpreter_builtins, METH_NOARGS,
         "Return the built-in namespace dict."},
+    {"sys_dict", (PyCFunction)interpreter_sys_dict, METH_NOARGS,
+        "Return the 'sys' module's data dictionary."},
     {"execute", interpreter_exec, METH_O,
 	"Execute the passed-in string in the interpreter."},
     {"redirect_output", (PyCFunction)redirect_output, METH_VARARGS,
@@ -217,43 +232,8 @@
 	return 0;
 }
 
-/*
-   Getter for 'sys_dict'.
-*/
-static PyObject *
-interpreter_get_sys_dict(PyObject *self, void *optional)
-{
-	PyObject *sys_dict = PyInterpreter_GET_INTERP(self)->sysdict;
-
-	Py_INCREF(sys_dict);
-	return sys_dict;
-}
-
-/*
-   Setter for 'sys_dict'.
-*/
-static int
-interpreter_set_sys_dict(PyObject *self, PyObject *arg, void *optional)
-{
-	PyObject *old_sys_dict = PyInterpreter_GET_INTERP(self)->sysdict;
-
-	if (!PyDict_Check(arg)) {
-		PyErr_SetString(PyExc_TypeError,
-				"'sys_dict' must be set to a dict");
-		return -1;
-	}
-
-	Py_INCREF(arg);
-	Py_DECREF(old_sys_dict);
-	PyInterpreter_GET_INTERP(self)->sysdict = arg;
-
-	return 0;
-}
-
 
 static PyGetSetDef interpreter_getset[] = {
-	{"sys_dict", interpreter_get_sys_dict, interpreter_set_sys_dict,
-		"The modules dict for 'sys'.", NULL},
 	{"modules", interpreter_get_modules, interpreter_set_modules,
 		"The dict used for sys.modules.", NULL},
 	{NULL}


More information about the Python-checkins mailing list