Author: Matti Picus <[email protected]>
Branch: call-via-pyobj
Changeset: r85488:02ab445bf7f9
Date: 2016-07-01 16:01 +0300
http://bitbucket.org/pypy/pypy/changeset/02ab445bf7f9/
Log: use a list to make the offset lookup work (test passes)
diff --git a/pypy/module/cpyext/methodobject.py
b/pypy/module/cpyext/methodobject.py
--- a/pypy/module/cpyext/methodobject.py
+++ b/pypy/module/cpyext/methodobject.py
@@ -152,7 +152,7 @@
class W_PyCWrapperObject(W_Root):
def __init__(self, space, pto, method_name, wrapper_func,
- wrapper_func_kwds, doc, func, offset=-1):
+ wrapper_func_kwds, doc, func, offset=None):
self.space = space
self.method_name = method_name
self.wrapper_func = wrapper_func
@@ -174,15 +174,15 @@
raise oefmt(space.w_TypeError,
"wrapper %s doesn't take any keyword arguments",
self.method_name)
- if self.offset >= 0:
- pto = rffi.cast(PyTypeObjectPtr, as_pyobj(space, self.w_objclass))
- pto_func_as_int = lltype.cast_ptr_to_int(pto) + self.offset
- # XXX make pto_func the equivalent of this line
- #lltype.cast_int_to_ptr(pto_func_as_int)
- func_to_call = rffi.cast(rffi.VOIDP,
pto.c_tp_as_number.c_nb_multiply)
- # print '\ncalling', func_to_call, 'not', self.func
+ if self.offset:
+ ptr = pto = rffi.cast(PyTypeObjectPtr, as_pyobj(space,
self.w_objclass))
+ # make ptr the equivalent of this, using the offsets
+ #func_to_call = rffi.cast(rffi.VOIDP,
pto.c_tp_as_number.c_nb_multiply)
+ for o in self.offset:
+ ptr_as_int = lltype.cast_ptr_to_int(ptr)
+ ptr = rffi.cast(rffi.VOIDPP, ptr_as_int + o)[0]
+ func_to_call = ptr
else:
- # print 'calling', self.method_name,'with no offset'
func_to_call = self.func
return self.wrapper_func(space, w_self, w_args, func_to_call)
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -296,7 +296,7 @@
for method_name, slot_names, wrapper_func, wrapper_func_kwds, doc in
slotdefs_for_wrappers:
if method_name in dict_w:
continue
- offset = rffi.offsetof(pto._T, slot_names[0])
+ offset = [rffi.offsetof(pto._T, slot_names[0])]
if len(slot_names) == 1:
func = getattr(pto, slot_names[0])
else:
@@ -304,21 +304,13 @@
struct = getattr(pto, slot_names[0])
if not struct:
continue
- offset += rffi.offsetof(struct._T, slot_names[1])
+ offset.append(rffi.offsetof(struct._T, slot_names[1]))
func = getattr(struct, slot_names[1])
func_voidp = rffi.cast(rffi.VOIDP, func)
if not func:
continue
if wrapper_func is None and wrapper_func_kwds is None:
continue
- name = rffi.charp2str(pto.c_tp_name)
- if method_name in ('__mul__', '__rmul__') and 'array' in name:
- # print '\nsetting', name, method_name, 'from', slot_names
- # print ' pto is', pto
- # print ' func_voidp is', func_voidp
- pass
- else:
- offset = -1
w_obj = W_PyCWrapperObject(space, pto, method_name, wrapper_func,
wrapper_func_kwds, doc, func_voidp, offset=offset)
dict_w[method_name] = space.wrap(w_obj)
@@ -744,7 +736,6 @@
w_obj = _type_realize(space, py_obj)
finally:
name = rffi.charp2str(pto.c_tp_name)
- print '_type_realize done', name
pto.c_tp_flags &= ~Py_TPFLAGS_READYING
pto.c_tp_flags |= Py_TPFLAGS_READY
return w_obj
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit