Author: Brian Kearns <[email protected]>
Branch: refactor-buffer-api
Changeset: r70862:f46d701f1b28
Date: 2014-03-20 16:43 -0400
http://bitbucket.org/pypy/pypy/changeset/f46d701f1b28/

Log:    allow w_obj buffer methods to fail with rpython exception

diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -200,7 +200,7 @@
             w_result = space.get_and_call_function(w_impl, self)
             if space.isinstance_w(w_result, space.w_buffer):
                 return w_result.buffer_w(space, flags)
-        raise oefmt(space.w_TypeError, "'%T' does not have the buffer 
interface", self)
+        raise TypeError
 
     def readbuf_w(self, space):
         w_impl = space.lookup(self, '__buffer__')
@@ -208,7 +208,7 @@
             w_result = space.get_and_call_function(w_impl, self)
             if space.isinstance_w(w_result, space.w_buffer):
                 return w_result.readbuf_w(space)
-        self._typed_unwrap_error(space, "readable buffer")
+        raise TypeError
 
     def writebuf_w(self, space):
         w_impl = space.lookup(self, '__buffer__')
@@ -216,7 +216,7 @@
             w_result = space.get_and_call_function(w_impl, self)
             if space.isinstance_w(w_result, space.w_buffer):
                 return w_result.writebuf_w(space)
-        self._typed_unwrap_error(space, "writeable buffer")
+        raise TypeError
 
     def charbuf_w(self, space):
         w_impl = space.lookup(self, '__buffer__')
@@ -224,7 +224,7 @@
             w_result = space.get_and_call_function(w_impl, self)
             if space.isinstance_w(w_result, space.w_buffer):
                 return w_result.charbuf_w(space)
-        self._typed_unwrap_error(space, "character buffer")
+        raise TypeError
 
     def str_w(self, space):
         self._typed_unwrap_error(space, "string")
@@ -1352,19 +1352,35 @@
 
     def buffer_w(self, w_obj, flags):
         # New buffer interface, returns a buffer based on flags
-        return w_obj.buffer_w(self, flags)
+        try:
+            return w_obj.buffer_w(self, flags)
+        except TypeError:
+            raise oefmt(self.w_TypeError,
+                        "'%T' does not have the buffer interface", w_obj)
 
     def readbuf_w(self, w_obj):
         # Old buffer interface, returns a readonly buffer
-        return w_obj.readbuf_w(self)
+        try:
+            return w_obj.readbuf_w(self)
+        except TypeError:
+            raise oefmt(self.w_TypeError,
+                        "expected a readable buffer object")
 
     def writebuf_w(self, w_obj):
         # Old buffer interface, returns a writeable buffer
-        return w_obj.writebuf_w(self)
+        try:
+            return w_obj.writebuf_w(self)
+        except TypeError:
+            raise oefmt(self.w_TypeError,
+                        "expected a writeable buffer object")
 
     def charbuf_w(self, w_obj):
         # Old buffer interface, returns a character buffer
-        return w_obj.charbuf_w(self)
+        try:
+            return w_obj.charbuf_w(self)
+        except TypeError:
+            raise oefmt(self.w_TypeError,
+                        "expected a character buffer object")
 
     def bufferstr_w(self, w_obj):
         # Directly returns an interp-level str.  Note that if w_obj is a
diff --git a/pypy/objspace/std/test/test_bytesobject.py 
b/pypy/objspace/std/test/test_bytesobject.py
--- a/pypy/objspace/std/test/test_bytesobject.py
+++ b/pypy/objspace/std/test/test_bytesobject.py
@@ -635,7 +635,7 @@
         table = maketrans('abc', 'xyz')
         assert 'xyzxyz' == 'xyzabcdef'.translate(table, 'def')
         exc = raises(TypeError, "'xyzabcdef'.translate(memoryview(table), 
'def')")
-        assert 'character buffer' in str(exc.value)
+        assert str(exc.value) == 'expected a character buffer object'
 
         table = maketrans('a', 'A')
         assert 'Abc' == 'abc'.translate(table)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to