[pypy-svn] r74315 - in pypy/trunk/pypy/module/cpyext: . test

afa at codespeak.net afa at codespeak.net
Sun May 2 00:04:21 CEST 2010


Author: afa
Date: Sun May  2 00:04:19 2010
New Revision: 74315

Modified:
   pypy/trunk/pypy/module/cpyext/methodobject.py
   pypy/trunk/pypy/module/cpyext/modsupport.py
   pypy/trunk/pypy/module/cpyext/test/test_methodobject.py
   pypy/trunk/pypy/module/cpyext/typeobject.py
Log:
Store the real pypy type in descriptors, instead of the PyTypeObject.
This feels more correct (cpyext is not comfortable with borrowed references)
and even simplifies some parts.


Modified: pypy/trunk/pypy/module/cpyext/methodobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/methodobject.py	(original)
+++ pypy/trunk/pypy/module/cpyext/methodobject.py	Sun May  2 00:04:19 2010
@@ -104,12 +104,11 @@
 
 class W_PyCMethodObject(W_PyCFunctionObject):
     w_self = None
-    def __init__(self, space, ml, pto):
+    def __init__(self, space, ml, w_type):
         self.space = space
         self.ml = ml
         self.name = rffi.charp2str(ml.c_ml_name)
-        pyo = rffi.cast(PyObject, pto)
-        self.w_objclass = from_ref(space, pyo)
+        self.w_objclass = w_type
 
     def __repr__(self):
         return self.space.unwrap(self.descr_method_repr())
@@ -226,8 +225,8 @@
     return space.wrap(W_PyCFunctionObject(space, ml, w_self))
 
 
-def PyDescr_NewMethod(space, pto, method):
-    return space.wrap(W_PyCMethodObject(space, method, pto))
+def PyDescr_NewMethod(space, w_type, method):
+    return space.wrap(W_PyCMethodObject(space, method, w_type))
 
 def PyDescr_NewWrapper(space, pto, method_name, wrapper_func, doc, flags, func):
     # not exactly the API sig

Modified: pypy/trunk/pypy/module/cpyext/modsupport.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/modsupport.py	(original)
+++ pypy/trunk/pypy/module/cpyext/modsupport.py	Sun May  2 00:04:19 2010
@@ -52,7 +52,7 @@
     w_mod = PyImport_AddModule(space, state.package_context)
 
     dict_w = {}
-    convert_method_defs(space, dict_w, methods, lltype.nullptr(PyTypeObjectPtr.TO), w_self)
+    convert_method_defs(space, dict_w, methods, None, w_self)
     for key, w_value in dict_w.items():
         space.setattr(w_mod, space.wrap(key), w_value)
     if doc:
@@ -61,7 +61,7 @@
     return w_mod
 
 
-def convert_method_defs(space, dict_w, methods, pto, w_self=None):
+def convert_method_defs(space, dict_w, methods, w_type, w_self=None):
     methods = rffi.cast(rffi.CArrayPtr(PyMethodDef), methods)
     if methods:
         i = -1
@@ -77,7 +77,7 @@
             else:
                 doc = None
 
-            if not pto:
+            if w_type is None:
                 if flags & METH_CLASS or flags & METH_STATIC:
                     raise OperationError(space.w_ValueError,
                             space.wrap("module functions cannot set METH_CLASS or METH_STATIC"))
@@ -89,14 +89,14 @@
                     if flags & METH_STATIC:
                         raise OperationError(space.w_ValueError,
                                 space.wrap("method cannot be both class and static"))
-                    #w_obj = PyDescr_NewClassMethod(pto, method)
+                    #w_obj = PyDescr_NewClassMethod(space, w_type, method)
                     w_obj = space.w_Ellipsis # XXX
                 elif flags & METH_STATIC:
                     w_func = PyCFunction_NewEx(space, method, None)
                     w_obj = space.w_Ellipsis # XXX
                     #w_obj = PyStaticMethod_New(space, w_func)
                 else:
-                    w_obj = PyDescr_NewMethod(space, pto, method)
+                    w_obj = PyDescr_NewMethod(space, w_type, method)
 
             dict_w[methodname] = w_obj
 

Modified: pypy/trunk/pypy/module/cpyext/test/test_methodobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/test/test_methodobject.py	(original)
+++ pypy/trunk/pypy/module/cpyext/test/test_methodobject.py	Sun May  2 00:04:19 2010
@@ -80,12 +80,9 @@
         ml.c_ml_name = namebuf
         ml.c_ml_meth = c_func.get_llhelper(space)
 
-        pto = make_ref(space, space.w_str)
-        method = PyDescr_NewMethod(space, pto, ml)
-
+        method = PyDescr_NewMethod(space, space.w_str, ml)
         assert repr(method).startswith(
             "<built-in method 'func' of 'str' object ")
 
-        Py_DecRef(space, pto)
         rffi.free_charp(namebuf)
         lltype.free(ml, flavor='raw')

Modified: pypy/trunk/pypy/module/cpyext/typeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/typeobject.py	(original)
+++ pypy/trunk/pypy/module/cpyext/typeobject.py	Sun May  2 00:04:19 2010
@@ -41,10 +41,10 @@
 PyType_Check, PyType_CheckExact = build_type_checkers("Type", "w_type")
 
 class W_GetSetPropertyEx(GetSetProperty):
-    def __init__(self, getset, pto):
+    def __init__(self, getset, w_type):
         self.getset = getset
         self.name = rffi.charp2str(getset.c_name)
-        self.pto = pto
+        self.w_type = w_type
         doc = set = get = None
         if doc:
             doc = rffi.charp2str(getset.c_doc)
@@ -56,14 +56,14 @@
                                 cls=None, use_closure=True,
                                 tag="cpyext_1")
 
-def PyDescr_NewGetSet(space, getset, pto):
-    return space.wrap(W_GetSetPropertyEx(getset, pto))
+def PyDescr_NewGetSet(space, getset, w_type):
+    return space.wrap(W_GetSetPropertyEx(getset, w_type))
 
 class W_MemberDescr(GetSetProperty):
-    def __init__(self, member, pto):
+    def __init__(self, member, w_type):
         self.member = member
         self.name = rffi.charp2str(member.c_name)
-        self.pto = pto
+        self.w_type = w_type
         flags = rffi.cast(lltype.Signed, member.c_flags)
         doc = set = None
         if member.c_doc:
@@ -76,7 +76,7 @@
                                 cls=None, use_closure=True,
                                 tag="cpyext_2")
 
-def convert_getset_defs(space, dict_w, getsets, pto):
+def convert_getset_defs(space, dict_w, getsets, w_type):
     getsets = rffi.cast(rffi.CArrayPtr(PyGetSetDef), getsets)
     if getsets:
         i = -1
@@ -87,10 +87,10 @@
             if not name:
                 break
             name = rffi.charp2str(name)
-            w_descr = PyDescr_NewGetSet(space, getset, pto)
+            w_descr = PyDescr_NewGetSet(space, getset, w_type)
             dict_w[name] = w_descr
 
-def convert_member_defs(space, dict_w, members, pto):
+def convert_member_defs(space, dict_w, members, w_type):
     members = rffi.cast(rffi.CArrayPtr(PyMemberDef), members)
     if members:
         i = 0
@@ -100,7 +100,7 @@
             if not name:
                 break
             name = rffi.charp2str(name)
-            w_descr = space.wrap(W_MemberDescr(member, pto))
+            w_descr = space.wrap(W_MemberDescr(member, w_type))
             dict_w[name] = w_descr
             i += 1
 
@@ -213,20 +213,19 @@
 
 lifeline_dict = RWeakKeyDictionary(W_Root, PyOLifeline)
 
-def check_descr(space, w_self, pto):
-    w_type = from_ref(space, (rffi.cast(PyObject, pto)))
+def check_descr(space, w_self, w_type):
     if not space.is_true(space.isinstance(w_self, w_type)):
         raise DescrMismatch()
 
 class GettersAndSetters:
     def getter(self, space, w_self):
-        check_descr(space, w_self, self.pto)
+        check_descr(space, w_self, self.w_type)
         return generic_cpy_call(
             space, self.getset.c_get, w_self,
             self.getset.c_closure)
 
     def setter(self, space, w_self, w_value):
-        check_descr(space, w_self, self.pto)
+        check_descr(space, w_self, self.w_type)
         res = generic_cpy_call(
             space, self.getset.c_set, w_self, w_value,
             self.getset.c_closure)
@@ -235,15 +234,15 @@
             state.check_and_raise_exception()
 
     def member_getter(self, space, w_self):
-        check_descr(space, w_self, self.pto)
+        check_descr(space, w_self, self.w_type)
         return PyMember_GetOne(space, w_self, self.member)
 
     def member_delete(self, space, w_self):
-        check_descr(space, w_self, self.pto)
+        check_descr(space, w_self, self.w_type)
         PyMember_SetOne(space, w_self, self.member, None)
 
     def member_setter(self, space, w_self, w_value):
-        check_descr(space, w_self, self.pto)
+        check_descr(space, w_self, self.w_type)
         PyMember_SetOne(space, w_self, self.member, w_value)
 
 def c_type_descr__call__(space, w_type, __args__):
@@ -291,9 +290,9 @@
         dict_w = {}
 
         add_operators(space, dict_w, pto)
-        convert_method_defs(space, dict_w, pto.c_tp_methods, pto)
-        convert_getset_defs(space, dict_w, pto.c_tp_getset, pto)
-        convert_member_defs(space, dict_w, pto.c_tp_members, pto)
+        convert_method_defs(space, dict_w, pto.c_tp_methods, self)
+        convert_getset_defs(space, dict_w, pto.c_tp_getset, self)
+        convert_member_defs(space, dict_w, pto.c_tp_members, self)
 
         full_name = rffi.charp2str(pto.c_tp_name)
         if '.' in full_name:



More information about the Pypy-commit mailing list