[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