[pypy-svn] r7243 - in pypy/trunk/src/pypy/translator: . test

mwh at codespeak.net mwh at codespeak.net
Mon Nov 15 16:22:16 CET 2004


Author: mwh
Date: Mon Nov 15 16:22:15 2004
New Revision: 7243

Modified:
   pypy/trunk/src/pypy/translator/genc.h
   pypy/trunk/src/pypy/translator/genc.py
   pypy/trunk/src/pypy/translator/test/test_ctrans.py
Log:
support for dumping instances (of old-style classes only (though they
are, of course, dumped as new-style classes)) and bound methods.


Modified: pypy/trunk/src/pypy/translator/genc.h
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.h	(original)
+++ pypy/trunk/src/pypy/translator/genc.h	Mon Nov 15 16:22:15 2004
@@ -110,6 +110,14 @@
 #define SETUP_CLASS_ATTR(t, attr, value)	\
 	(PyObject_SetAttrString(t, attr, value) >= 0)
 
+/*** instances ***/
+
+#define SETUP_INSTANCE_ATTR(t, attr, value)	\
+	(PyObject_SetAttrString(t, attr, value) >= 0)
+
+#define SETUP_INSTANCE(i, cls)                  \
+	(i = PyType_GenericAlloc(cls, 0))
+
 /* we need a subclass of 'builtin_function_or_method' which can be used
    as methods: builtin function objects that can be bound on instances */
 static PyObject *

Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py	(original)
+++ pypy/trunk/src/pypy/translator/genc.py	Mon Nov 15 16:22:15 2004
@@ -103,9 +103,35 @@
         return name
 
     def nameof_instancemethod(self, meth):
-        assert meth.im_self is None, "meth must be unbound (for now)"
-        # no error checking here
-        return self.nameof(meth.im_func)
+        if meth.im_self is None:
+            # no error checking here
+            return self.nameof(meth.im_func)
+        else:
+            ob = self.nameof(meth.im_self)
+            func = self.nameof(meth.im_func)
+            typ = self.nameof(meth.im_class)
+            us = self.uniquename('gmeth_'+meth.im_func.__name__)
+            self.globaldecl.append('static PyObject* %s;'%(us,))
+            self.initcode.append(
+                'INITCHK(%s = gencfunc_descr_get(%s, %s, %s))'%(
+                us, func, ob, typ))
+            return us
+                                   
+    def nameof_instance(self, instance):
+        name = self.uniquename('ginst_' + instance.__class__.__name__)
+        cls = self.nameof(instance.__class__)
+        content = instance.__dict__.items()
+        content.sort()
+        lines = []
+        for key, value in content:
+            lines.append('INITCHK(SETUP_INSTANCE_ATTR(%s, "%s", %s))' % (
+                name, key, self.nameof(value)))
+        self.globaldecl.append('static PyObject* %s;' % name)
+        self.initcode.append('INITCHK(SETUP_INSTANCE(%s, %s))' % (
+            name, cls))
+        self.initcode.extend(lines)
+        return name
+        
 
     def nameof_builtin_function_or_method(self, func):
         import __builtin__

Modified: pypy/trunk/src/pypy/translator/test/test_ctrans.py
==============================================================================
--- pypy/trunk/src/pypy/translator/test/test_ctrans.py	(original)
+++ pypy/trunk/src/pypy/translator/test/test_ctrans.py	Mon Nov 15 16:22:15 2004
@@ -99,6 +99,10 @@
         self.assertEquals(with_more_init(10, False), -10)
         self.assertEquals(with_more_init(20, True), 20)
 
+    def test_global_instance(self):
+        global_instance = self.build_cfunc(snippet.global_instance)
+        self.assertEquals(global_instance(), 42)
+
 class TypedTestCase(testit.IntTestCase):
 
     def getcompiled(self, func):



More information about the Pypy-commit mailing list