[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