[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