[Python-checkins] r51392 - in python/branches/bcannon-objcap: Lib/test/test_descr.py Lib/test/test_objcap.py Modules/objcapmodule.c Objects/typeobject.c setup.py

brett.cannon python-checkins at python.org
Sat Aug 19 01:55:42 CEST 2006


Author: brett.cannon
Date: Sat Aug 19 01:55:41 2006
New Revision: 51392

Added:
   python/branches/bcannon-objcap/Lib/test/test_objcap.py   (contents, props changed)
   python/branches/bcannon-objcap/Modules/objcapmodule.c   (contents, props changed)
Modified:
   python/branches/bcannon-objcap/Lib/test/test_descr.py
   python/branches/bcannon-objcap/Objects/typeobject.c
   python/branches/bcannon-objcap/setup.py
Log:
Introduce objcap module to store removed abilities.  Begin with moving
object.__subclasses__().


Modified: python/branches/bcannon-objcap/Lib/test/test_descr.py
==============================================================================
--- python/branches/bcannon-objcap/Lib/test/test_descr.py	(original)
+++ python/branches/bcannon-objcap/Lib/test/test_descr.py	Sat Aug 19 01:55:41 2006
@@ -3595,7 +3595,6 @@
     vereq(e.meth(), 1)
     vereq(d.a, 2)
     vereq(e.a, 2)
-    vereq(C2.__subclasses__(), [D])
 
     # stuff that shouldn't:
     class L(list):

Added: python/branches/bcannon-objcap/Lib/test/test_objcap.py
==============================================================================
--- (empty file)
+++ python/branches/bcannon-objcap/Lib/test/test_objcap.py	Sat Aug 19 01:55:41 2006
@@ -0,0 +1,33 @@
+import objcap
+import unittest
+from test import test_support
+
+class TestClass(object):
+    pass
+
+class ObjectSubclasses(unittest.TestCase):
+
+    """Test object.__subclasses__() move."""
+
+    def test_removal(self):
+        # Make sure __subclasses__ is no longer on 'object'.
+        self.failUnless(not hasattr(object, '__subclasses__'))
+
+    def test_argument(self):
+        # Make sure only proper arguments are accepted.
+        self.failUnlessRaises(TypeError, objcap.subclasses, object())
+
+    def test_result(self):
+        # Check return values.
+        self.failUnlessEqual(objcap.subclasses(TestClass), [])
+        self.failUnless(objcap.subclasses(object))
+
+
+def test_main():
+    test_support.run_unittest(
+        ObjectSubclasses
+    )
+
+
+if __name__ == '__main__':
+    test_main()

Added: python/branches/bcannon-objcap/Modules/objcapmodule.c
==============================================================================
--- (empty file)
+++ python/branches/bcannon-objcap/Modules/objcapmodule.c	Sat Aug 19 01:55:41 2006
@@ -0,0 +1,70 @@
+/*
+    Store changes done to implement object-capabilities.
+*/
+
+#include "Python.h"
+
+PyDoc_STRVAR(module_doc,
+"XXX Placeholder for code removed for object-capabilities reasons.\n\
+");
+
+
+/*
+   Return the subclasses of a class.
+
+   Moved so that object does not expose *all* new-style classes to *every*
+   interpreter.  Otherwise would invert direction of knowledge about
+   inheritance tree.
+*/
+static PyObject *
+object_subclasses(PyObject* self, PyTypeObject *type)
+{
+    PyObject *list, *raw, *ref;
+    Py_ssize_t i, n;
+
+    if (!PyType_Check(type)) {
+	PyErr_SetString(PyExc_TypeError,
+			    "argument must be a type or subclass thereof");
+	return NULL;
+    }
+    list = PyList_New(0);
+    if (list == NULL)
+	return NULL;
+    raw = type->tp_subclasses;
+    if (raw == NULL)
+	return list;
+    assert(PyList_Check(raw));
+    n = PyList_GET_SIZE(raw);
+    for (i = 0; i < n; i++) {
+	ref = PyList_GET_ITEM(raw, i);
+	assert(PyWeakref_CheckRef(ref));
+	ref = PyWeakref_GET_OBJECT(ref);
+	if (ref != Py_None) {
+	    if (PyList_Append(list, ref) < 0) {
+		Py_DECREF(list);
+		return NULL;
+	    }
+	}
+    }
+    return list;
+}
+
+PyDoc_STRVAR(object_subclass_doc,
+"subclasses(object) -> return a list of subclasses.\n\
+Originally object.__subclasses__().");
+
+
+static PyMethodDef module_methods[] = {
+    {"subclasses", (PyCFunction)object_subclasses, METH_O, "XXX"},
+    {NULL, NULL}
+};
+
+PyMODINIT_FUNC
+initobjcap(void)
+{
+    PyObject *module;
+
+    module = Py_InitModule3("objcap", module_methods, module_doc);
+    if (!module)
+	return;
+}

Modified: python/branches/bcannon-objcap/Objects/typeobject.c
==============================================================================
--- python/branches/bcannon-objcap/Objects/typeobject.c	(original)
+++ python/branches/bcannon-objcap/Objects/typeobject.c	Sat Aug 19 01:55:41 2006
@@ -2151,39 +2151,10 @@
 	type->ob_type->tp_free((PyObject *)type);
 }
 
-static PyObject *
-type_subclasses(PyTypeObject *type, PyObject *args_ignored)
-{
-	PyObject *list, *raw, *ref;
-	Py_ssize_t i, n;
-
-	list = PyList_New(0);
-	if (list == NULL)
-		return NULL;
-	raw = type->tp_subclasses;
-	if (raw == NULL)
-		return list;
-	assert(PyList_Check(raw));
-	n = PyList_GET_SIZE(raw);
-	for (i = 0; i < n; i++) {
-		ref = PyList_GET_ITEM(raw, i);
-		assert(PyWeakref_CheckRef(ref));
-		ref = PyWeakref_GET_OBJECT(ref);
-		if (ref != Py_None) {
-			if (PyList_Append(list, ref) < 0) {
-				Py_DECREF(list);
-				return NULL;
-			}
-		}
-	}
-	return list;
-}
 
 static PyMethodDef type_methods[] = {
 	{"mro", (PyCFunction)mro_external, METH_NOARGS,
 	 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
-	{"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
-	 PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
 	{0}
 };
 

Modified: python/branches/bcannon-objcap/setup.py
==============================================================================
--- python/branches/bcannon-objcap/setup.py	(original)
+++ python/branches/bcannon-objcap/setup.py	Sat Aug 19 01:55:41 2006
@@ -349,6 +349,8 @@
         # Some modules that are normally always on:
         exts.append( Extension('_weakref', ['_weakref.c']) )
 
+        exts.append(Extension('objcap', ['objcapmodule.c']))
+
         # array objects
         exts.append( Extension('array', ['arraymodule.c']) )
         # complex math library functions


More information about the Python-checkins mailing list