[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