[pypy-svn] pypy default: cpyext: Fix call to the tp_getattro type slot.
amauryfa
commits-noreply at bitbucket.org
Fri Mar 25 19:27:54 CET 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r42945:f3bddf2a88e0
Date: 2011-03-25 17:23 +0100
http://bitbucket.org/pypy/pypy/changeset/f3bddf2a88e0/
Log: cpyext: Fix call to the tp_getattro type slot.
diff --git a/pypy/module/cpyext/test/test_bufferobject.py b/pypy/module/cpyext/test/test_bufferobject.py
--- a/pypy/module/cpyext/test/test_bufferobject.py
+++ b/pypy/module/cpyext/test/test_bufferobject.py
@@ -46,4 +46,5 @@
return PyBuffer_New(150);
"""),
])
- module.buffer_new()
+ b = module.buffer_new()
+ raises(AttributeError, getattr, b, 'x')
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -4,9 +4,9 @@
from pypy.module.cpyext.api import generic_cpy_call, cpython_api, PyObject
from pypy.module.cpyext.typeobjectdefs import (
unaryfunc, wrapperfunc, ternaryfunc, PyTypeObjectPtr, binaryfunc,
- getattrfunc, setattrofunc, lenfunc, ssizeargfunc, ssizessizeargfunc,
- ssizeobjargproc, iternextfunc, initproc, richcmpfunc, hashfunc,
- descrgetfunc, descrsetfunc, objobjproc)
+ getattrfunc, getattrofunc, setattrofunc, lenfunc, ssizeargfunc,
+ ssizessizeargfunc, ssizeobjargproc, iternextfunc, initproc, richcmpfunc,
+ hashfunc, descrgetfunc, descrsetfunc, objobjproc)
from pypy.module.cpyext.pyobject import from_ref
from pypy.module.cpyext.pyerrors import PyErr_Occurred
from pypy.module.cpyext.state import State
@@ -65,6 +65,12 @@
finally:
rffi.free_charp(name_ptr)
+def wrap_getattro(space, w_self, w_args, func):
+ func_target = rffi.cast(getattrofunc, func)
+ check_num_args(space, w_args, 1)
+ args_w = space.fixedview(w_args)
+ return generic_cpy_call(space, func_target, w_self, args_w[0])
+
def wrap_setattr(space, w_self, w_args, func):
func_target = rffi.cast(setattrofunc, func)
check_num_args(space, w_args, 2)
@@ -289,7 +295,12 @@
# irregular interface, because of tp_getattr/tp_getattro confusion
if NAME == "__getattr__":
- wrapper = wrap_getattr
+ if SLOT == "tp_getattro":
+ wrapper = wrap_getattro
+ elif SLOT == "tp_getattr":
+ wrapper = wrap_getattr
+ else:
+ assert False
function = globals().get(FUNCTION, None)
assert FLAGS == 0 or FLAGS == PyWrapperFlag_KEYWORDS
More information about the Pypy-commit
mailing list