[pypy-svn] r31367 - in pypy/dist/pypy: objspace/cpy/test rpython

ac at codespeak.net ac at codespeak.net
Thu Aug 17 15:39:21 CEST 2006


Author: ac
Date: Thu Aug 17 15:39:20 2006
New Revision: 31367

Modified:
   pypy/dist/pypy/objspace/cpy/test/test_typedef.py
   pypy/dist/pypy/rpython/rcpy.py
Log:
Enable special methods for the CPython abstract protocols.


Modified: pypy/dist/pypy/objspace/cpy/test/test_typedef.py
==============================================================================
--- pypy/dist/pypy/objspace/cpy/test/test_typedef.py	(original)
+++ pypy/dist/pypy/objspace/cpy/test/test_typedef.py	Thu Aug 17 15:39:20 2006
@@ -27,7 +27,6 @@
     def fset_x(space, self, w_value):
         self.x = space.int_w(w_value)
 
-
 def test_direct():
     W_MyType.typedef = TypeDef("MyType")
     space = CPyObjSpace()
@@ -148,6 +147,21 @@
     assert type(res).__name__ == 'MyType'
     assert res.multiply(3) == 369
 
+def test_special_method():
+    W_MyType.typedef = TypeDef("MyType",
+                               __mul__ = interp2app(W_MyType.multiply))
+    space = CPyObjSpace()
+    assert space.int_w(W_MyType(space, 6).multiply(space.wrap(7))) == 42
+
+    def make_mytype():
+        return space.wrap(W_MyType(space, 123))
+    fn = compile(make_mytype, [],
+                 annotatorpolicy = CPyAnnotatorPolicy(space))
+
+    res = fn(expected_extra_mallocs=1)
+    assert type(res).__name__ == 'MyType'
+    assert res * 3 == 369
+
 
 def test_interp_attrproperty():
     W_MyType.typedef = TypeDef("MyType",

Modified: pypy/dist/pypy/rpython/rcpy.py
==============================================================================
--- pypy/dist/pypy/rpython/rcpy.py	(original)
+++ pypy/dist/pypy/rpython/rcpy.py	Thu Aug 17 15:39:20 2006
@@ -127,7 +127,15 @@
 
 
 PyObjPtr = lltype.Ptr(lltype.PyObject)
-
+PyNumberMethods = lltype.Struct('PyNumberMethods',
+    ('data', lltype.FixedSizeArray(lltype.Signed, 38))
+)
+PyMappingMethods = lltype.Struct('PyMappingMethods',
+    ('data', lltype.FixedSizeArray(lltype.Signed, 3))
+)
+PySequenceMethods = lltype.Struct('PySequenceMethods',
+    ('data', lltype.FixedSizeArray(lltype.Signed, 10))
+)
 PY_TYPE_OBJECT = lltype.PyForwardReference()
 PY_TYPE_OBJECT.become(lltype.PyStruct(
     'PyTypeObject',
@@ -143,9 +151,9 @@
     ('c_tp_setattr',   lltype.Signed),   # in
     ('c_tp_compare',   lltype.Signed),
     ('c_tp_repr',      lltype.Signed),   # progress
-    ('c_tp_as_number', lltype.Signed),
-    ('c_tp_as_sequence',lltype.Signed),
-    ('c_tp_as_mapping',lltype.Signed),
+    ('c_tp_as_number', lltype.Ptr(PyNumberMethods)),
+    ('c_tp_as_sequence',lltype.Ptr(PySequenceMethods)),
+    ('c_tp_as_mapping',lltype.Ptr(PyMappingMethods)),
     ('c_tp_hash',      lltype.Signed),
     ('c_tp_call',      lltype.Signed),
     ('c_tp_str',       lltype.Signed),
@@ -234,10 +242,14 @@
         p[len(name)] = '\x00'
         pytypeobj.c_tp_name = lltype.direct_arrayitems(p)
         pytypeobj.c_tp_basicsize = llmemory.sizeof(r_inst.lowleveltype.TO)
-        pytypeobj.c_tp_flags = CDefinedIntSymbolic('Py_TPFLAGS_DEFAULT')
+        pytypeobj.c_tp_flags = CDefinedIntSymbolic('''(Py_TPFLAGS_DEFAULT |
+            Py_TPFLAGS_CHECKTYPES)''')
         pytypeobj.c_tp_new = rtyper.type_system.getcallable(tp_new_graph)
         pytypeobj.c_tp_dealloc = rtyper.annotate_helper_fn(ll_tp_dealloc,
                                                            [PyObjPtr])
+        pytypeobj.c_tp_as_number = lltype.malloc(PyNumberMethods, immortal=True)
+        pytypeobj.c_tp_as_sequence = lltype.malloc(PySequenceMethods, immortal=True)
+        pytypeobj.c_tp_as_mapping = lltype.malloc(PyMappingMethods, immortal=True)
         result =  lltype.cast_pointer(PyObjPtr, pytypeobj)
 
         # the llsetup function that will store the 'objects' into the



More information about the Pypy-commit mailing list