Author: Ronan Lamy <[email protected]>
Branch: PyBuffer
Changeset: r90805:3d091950a819
Date: 2017-03-24 17:24 +0000
http://bitbucket.org/pypy/pypy/changeset/3d091950a819/
Log: copy rpython.rlib.buffer to pypy.interpreter.buffer
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -3,7 +3,6 @@
from rpython.rlib.cache import Cache
from rpython.tool.uid import HUGEVAL_BYTES
from rpython.rlib import jit, types
-from rpython.rlib.buffer import StringBuffer
from rpython.rlib.debug import make_sure_not_resized
from rpython.rlib.objectmodel import (we_are_translated, newlist_hint,
compute_unique_id, specialize, not_rpython)
@@ -11,6 +10,7 @@
from rpython.rlib.rarithmetic import r_uint, SHRT_MIN, SHRT_MAX, \
INT_MIN, INT_MAX, UINT_MAX, USHRT_MAX
+from pypy.interpreter.buffer import StringBuffer
from pypy.interpreter.executioncontext import (ExecutionContext, ActionFlag,
make_finalizer_queue)
from pypy.interpreter.error import OperationError, new_exception_class, oefmt
diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -1,4 +1,170 @@
-from rpython.rlib.buffer import Buffer
-class PyBuffer(Buffer):
+class Buffer(object):
+ """Abstract base class for buffers."""
+ _attrs_ = ['readonly']
_immutable_ = True
+
+ def getlength(self):
+ """Returns the size in bytes (even if getitemsize() > 1)."""
+ raise NotImplementedError
+
+ def __len__(self):
+ res = self.getlength()
+ assert res >= 0
+ return res
+
+ def as_str(self):
+ "Returns an interp-level string with the whole content of the buffer."
+ # May be overridden.
+ return self.getslice(0, self.getlength(), 1, self.getlength())
+
+ def as_str_and_offset_maybe(self):
+ """
+ If the buffer is backed by a string, return a pair (string, offset),
+ where offset is the offset inside the string where the buffer start.
+ Else, return (None, 0).
+ """
+ return None, 0
+
+ def getitem(self, index):
+ "Returns the index'th character in the buffer."
+ raise NotImplementedError # Must be overriden. No bounds checks.
+
+ def __getitem__(self, i):
+ return self.getitem(i)
+
+ def getslice(self, start, stop, step, size):
+ # May be overridden. No bounds checks.
+ return ''.join([self.getitem(i) for i in range(start, stop, step)])
+
+ def __getslice__(self, start, stop):
+ return self.getslice(start, stop, 1, stop - start)
+
+ def setitem(self, index, char):
+ "Write a character into the buffer."
+ raise NotImplementedError # Must be overriden. No bounds checks.
+
+ def __setitem__(self, i, char):
+ return self.setitem(i, char)
+
+ def setslice(self, start, string):
+ # May be overridden. No bounds checks.
+ for i in range(len(string)):
+ self.setitem(start + i, string[i])
+
+ def get_raw_address(self):
+ raise ValueError("no raw buffer")
+
+ def getformat(self):
+ return 'B'
+
+ def getitemsize(self):
+ return 1
+
+ def getndim(self):
+ return 1
+
+ def getshape(self):
+ return [self.getlength()]
+
+ def getstrides(self):
+ return [1]
+
+ def releasebuffer(self):
+ pass
+
+class StringBuffer(Buffer):
+ _attrs_ = ['readonly', 'value']
+ _immutable_ = True
+
+ def __init__(self, value):
+ self.value = value
+ self.readonly = 1
+
+ def getlength(self):
+ return len(self.value)
+
+ def as_str(self):
+ return self.value
+
+ def as_str_and_offset_maybe(self):
+ return self.value, 0
+
+ def getitem(self, index):
+ return self.value[index]
+
+ def getslice(self, start, stop, step, size):
+ if size == 0:
+ return ""
+ if step == 1:
+ assert 0 <= start <= stop
+ if start == 0 and stop == len(self.value):
+ return self.value
+ return self.value[start:stop]
+ return Buffer.getslice(self, start, stop, step, size)
+
+ def get_raw_address(self):
+ from rpython.rtyper.lltypesystem import rffi
+ # may still raise ValueError on some GCs
+ return rffi.get_raw_address_of_string(self.value)
+
+class SubBuffer(Buffer):
+ _attrs_ = ['buffer', 'offset', 'size', 'readonly']
+ _immutable_ = True
+
+ def __init__(self, buffer, offset, size):
+ self.readonly = buffer.readonly
+ if isinstance(buffer, SubBuffer): # don't nest them
+ # we want a view (offset, size) over a view
+ # (buffer.offset, buffer.size) over buffer.buffer.
+ # Note that either '.size' can be -1 to mean 'up to the end'.
+ at_most = buffer.getlength() - offset
+ if size > at_most or size < 0:
+ if at_most < 0:
+ at_most = 0
+ size = at_most
+ offset += buffer.offset
+ buffer = buffer.buffer
+ #
+ self.buffer = buffer
+ self.offset = offset
+ self.size = size
+
+ def getlength(self):
+ at_most = self.buffer.getlength() - self.offset
+ if 0 <= self.size <= at_most:
+ return self.size
+ elif at_most >= 0:
+ return at_most
+ else:
+ return 0
+
+ def as_str_and_offset_maybe(self):
+ string, offset = self.buffer.as_str_and_offset_maybe()
+ if string is not None:
+ return string, offset + self.offset
+ return None, 0
+
+ def getitem(self, index):
+ return self.buffer.getitem(self.offset + index)
+
+ def getslice(self, start, stop, step, size):
+ if start == stop:
+ return '' # otherwise, adding self.offset might make them
+ # out of bounds
+ return self.buffer.getslice(self.offset + start, self.offset + stop,
+ step, size)
+
+ def setitem(self, index, char):
+ self.buffer.setitem(self.offset + index, char)
+
+ def setslice(self, start, string):
+ if len(string) == 0:
+ return # otherwise, adding self.offset might make 'start'
+ # out of bounds
+ self.buffer.setslice(self.offset + start, string)
+
+ def get_raw_address(self):
+ from rpython.rtyper.lltypesystem import rffi
+ ptr = self.buffer.get_raw_address()
+ return rffi.ptradd(ptr, self.offset)
diff --git a/pypy/module/__pypy__/bytebuffer.py
b/pypy/module/__pypy__/bytebuffer.py
--- a/pypy/module/__pypy__/bytebuffer.py
+++ b/pypy/module/__pypy__/bytebuffer.py
@@ -2,12 +2,12 @@
# A convenient read-write buffer. Located here for want of a better place.
#
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from pypy.interpreter.gateway import unwrap_spec
from rpython.rlib.rgc import nonmoving_raw_ptr_for_resizable_list
-class ByteBuffer(PyBuffer):
+class ByteBuffer(Buffer):
_immutable_ = True
def __init__(self, len):
diff --git a/pypy/module/_cffi_backend/cbuffer.py
b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -5,13 +5,13 @@
from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray
from pypy.module._cffi_backend import ctypestruct
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from rpython.rtyper.annlowlevel import llstr
from rpython.rtyper.lltypesystem import rffi
from rpython.rtyper.lltypesystem.rstr import copy_string_to_raw
-class LLBuffer(PyBuffer):
+class LLBuffer(Buffer):
_immutable_ = True
def __init__(self, raw_cdata, size):
diff --git a/pypy/module/_io/interp_bufferedio.py
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -4,7 +4,7 @@
from pypy.interpreter.typedef import (
TypeDef, GetSetProperty, generic_new_descr, interp_attrproperty_w)
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
-from rpython.rlib.buffer import Buffer, SubBuffer
+from pypy.interpreter.buffer import Buffer, SubBuffer
from rpython.rlib.rgc import (
nonmoving_raw_ptr_for_resizable_list, resizable_list_supporting_raw_ptr)
from rpython.rlib.rstring import StringBuilder
diff --git a/pypy/module/_io/interp_bytesio.py
b/pypy/module/_io/interp_bytesio.py
--- a/pypy/module/_io/interp_bytesio.py
+++ b/pypy/module/_io/interp_bytesio.py
@@ -2,7 +2,7 @@
from pypy.interpreter.typedef import (
TypeDef, generic_new_descr, GetSetProperty)
from pypy.interpreter.gateway import interp2app, unwrap_spec
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from rpython.rlib.rStringIO import RStringIO
from rpython.rlib.rarithmetic import r_longlong
from rpython.rlib.objectmodel import import_from_mixin
@@ -12,7 +12,7 @@
import sys
-class BytesIOBuffer(PyBuffer):
+class BytesIOBuffer(Buffer):
_immutable_ = True
def __init__(self, w_bytesio):
diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py
--- a/pypy/module/_rawffi/buffer.py
+++ b/pypy/module/_rawffi/buffer.py
@@ -1,11 +1,11 @@
from rpython.rtyper.lltypesystem import rffi
-from pypy.interpreter.bufffer import PyBuffer
+from pypy.interpreter.bufffer import Buffer
# XXX not the most efficient implementation
-class RawFFIBuffer(PyBuffer):
+class RawFFIBuffer(Buffer):
_immutable_ = True
def __init__(self, datainstance):
diff --git a/pypy/module/array/interp_array.py
b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -6,7 +6,7 @@
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.lltypesystem.rstr import copy_string_to_raw
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import (
@@ -848,7 +848,7 @@
v.typecode = k
unroll_typecodes = unrolling_iterable(types.keys())
-class ArrayBuffer(PyBuffer):
+class ArrayBuffer(Buffer):
_immutable_ = True
def __init__(self, array, readonly):
@@ -895,7 +895,7 @@
return rffi.charpsize2str(rffi.ptradd(data, start), size)
finally:
self.array._charbuf_stop()
- return PyBuffer.getslice(self, start, stop, step, size)
+ return Buffer.getslice(self, start, stop, step, size)
def get_raw_address(self):
return self.array._charbuf_start()
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
@@ -19,7 +19,7 @@
from pypy.module.cpyext.memoryobject import fill_Py_buffer
from pypy.module.cpyext.state import State
from pypy.module.cpyext import userslot
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.argument import Arguments
from rpython.rlib.unroll import unrolling_iterable
@@ -313,7 +313,7 @@
space.fromcache(State).check_and_raise_exception(always=True)
return space.newint(res)
-class CPyBuffer(PyBuffer):
+class CPyBuffer(Buffer):
# Similar to Py_buffer
_immutable_ = True
diff --git a/pypy/module/cpyext/test/test_memoryobject.py
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -3,7 +3,7 @@
from rpython.rtyper.lltypesystem import rffi
from pypy.module.cpyext.test.test_api import BaseApiTest
from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-from rpython.rlib.buffer import StringBuffer
+from pypy.interpreter.buffer import StringBuffer
from pypy.module.cpyext.pyobject import from_ref
from pypy.module.cpyext.memoryobject import PyMemoryViewObject
diff --git a/pypy/module/micronumpy/concrete.py
b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -702,7 +702,7 @@
free_raw_storage(self.storage)
-class ArrayBuffer(PyBuffer):
+class ArrayBuffer(Buffer):
_immutable_ = True
def __init__(self, impl, readonly):
diff --git a/pypy/module/micronumpy/ctors.py b/pypy/module/micronumpy/ctors.py
--- a/pypy/module/micronumpy/ctors.py
+++ b/pypy/module/micronumpy/ctors.py
@@ -1,7 +1,7 @@
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.baseobjspace import BufferInterfaceNotFound
from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
-from rpython.rlib.buffer import SubBuffer
+from pypy.interpreter.buffer import SubBuffer
from rpython.rlib.rstring import strip_spaces
from rpython.rlib.rawstorage import RAW_STORAGE_PTR
from rpython.rtyper.lltypesystem import lltype, rffi
@@ -91,7 +91,7 @@
w_base = w_object
if read_only:
w_base = None
- return W_NDimArray.from_shape_and_storage(space, shape, w_data,
+ return W_NDimArray.from_shape_and_storage(space, shape, w_data,
dtype, w_base=w_base, strides=strides,
start=offset), read_only
if w_data is None:
@@ -104,11 +104,11 @@
#print 'create view from shape',shape,'dtype',dtype,'data',data
if strides is not None:
raise oefmt(space.w_NotImplementedError,
- "__array_interface__ strides not fully supported yet")
+ "__array_interface__ strides not fully supported yet")
arr = frombuffer(space, w_data, dtype, support.product(shape), offset)
new_impl = arr.implementation.reshape(arr, shape)
return W_NDimArray(new_impl), False
-
+
except OperationError as e:
if e.match(space, space.w_AttributeError):
return None, False
@@ -120,7 +120,7 @@
return descr
msg = "invalid PEP 3118 format string: '%s'" % c_format
space.warn(space.newtext(msg), space.w_RuntimeWarning)
- return None
+ return None
def _array_from_buffer_3118(space, w_object, dtype):
try:
@@ -139,12 +139,12 @@
raise oefmt(space.w_NotImplementedError,
"creating an array from a memoryview while specifying dtype "
"not supported")
- if descr.elsize != space.int_w(space.getattr(w_buf,
space.newbytes('itemsize'))):
+ if descr.elsize != space.int_w(space.getattr(w_buf,
space.newbytes('itemsize'))):
msg = ("Item size computed from the PEP 3118 buffer format "
"string does not match the actual item size.")
space.warn(space.newtext(msg), space.w_RuntimeWarning)
return w_object
- dtype = descr
+ dtype = descr
elif not dtype:
dtype = descriptor.get_dtype_cache(space).w_stringdtype
dtype.elsize = space.int_w(space.getattr(w_buf,
space.newbytes('itemsize')))
@@ -181,7 +181,7 @@
raise e
writable = not space.bool_w(space.getattr(w_buf,
space.newbytes('readonly')))
w_ret = W_NDimArray.from_shape_and_storage(space, shape, w_data,
- storage_bytes=buflen, dtype=dtype, w_base=w_object,
+ storage_bytes=buflen, dtype=dtype, w_base=w_object,
writable=writable, strides=strides)
if w_ret:
return w_ret
@@ -212,7 +212,7 @@
if not isinstance(w_object, W_NDimArray):
w_array = try_array_method(space, w_object, w_dtype)
if w_array is None:
- if ( not space.isinstance_w(w_object, space.w_bytes) and
+ if ( not space.isinstance_w(w_object, space.w_bytes) and
not space.isinstance_w(w_object, space.w_unicode) and
not isinstance(w_object, W_GenericBox)):
# use buffer interface
@@ -551,7 +551,7 @@
except OperationError as e:
if not e.match(space, space.w_TypeError):
raise
- w_buffer = space.call_method(w_buffer, '__buffer__',
+ w_buffer = space.call_method(w_buffer, '__buffer__',
space.newint(space.BUF_FULL_RO))
buf = _getbuffer(space, w_buffer)
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -2,7 +2,7 @@
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.typedef import TypeDef, GetSetProperty,
make_weakref_descr
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from rpython.rlib import rmmap, rarithmetic, objectmodel
from rpython.rlib.rmmap import RValueError, RTypeError, RMMapError
from rpython.rlib.rstring import StringBuilder
@@ -311,7 +311,7 @@
return OperationError(space.w_SystemError, space.newtext('%s' % e))
-class MMapBuffer(PyBuffer):
+class MMapBuffer(Buffer):
_immutable_ = True
def __init__(self, space, mmap, readonly):
@@ -331,7 +331,7 @@
if step == 1:
return self.mmap.getslice(start, size)
else:
- return PyBuffer.getslice(self, start, stop, step, size)
+ return Buffer.getslice(self, start, stop, step, size)
def setitem(self, index, char):
self.check_valid_writeable()
diff --git a/pypy/module/struct/interp_struct.py
b/pypy/module/struct/interp_struct.py
--- a/pypy/module/struct/interp_struct.py
+++ b/pypy/module/struct/interp_struct.py
@@ -1,9 +1,9 @@
from rpython.rlib import jit
-from rpython.rlib.buffer import SubBuffer
from rpython.rlib.rstruct.error import StructError, StructOverflowError
from rpython.rlib.rstruct.formatiterator import CalcSizeFormatIterator
from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.buffer import SubBuffer
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.typedef import TypeDef, interp_attrproperty
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -1,19 +1,20 @@
from rpython.annotator.model import SomeInstance, s_None
-from pypy.interpreter import argument, gateway
-from pypy.interpreter.baseobjspace import W_Root, ObjSpace, SpaceCache
-from pypy.interpreter.typedef import TypeDef, GetSetProperty
-from pypy.objspace.std.sliceobject import W_SliceObject
-from rpython.rlib.buffer import StringBuffer
from rpython.rlib.objectmodel import (instantiate, we_are_translated,
specialize,
not_rpython)
from rpython.rlib.nonconst import NonConstant
from rpython.rlib.rarithmetic import r_uint, r_singlefloat
from rpython.rtyper.extregistry import ExtRegistryEntry
from rpython.rtyper.lltypesystem import lltype
-from pypy.tool.option import make_config
from rpython.tool.sourcetools import compile2, func_with_new_name
from rpython.translator.translator import TranslationContext
+from pypy.tool.option import make_config
+from pypy.interpreter import argument, gateway
+from pypy.interpreter.baseobjspace import W_Root, ObjSpace, SpaceCache
+from pypy.interpreter.buffer import StringBuffer
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
+from pypy.objspace.std.sliceobject import W_SliceObject
+
class W_MyObject(W_Root):
typedef = None
diff --git a/pypy/objspace/std/bytearrayobject.py
b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -17,7 +17,7 @@
getbytevalue, makebytesdata_w, newbytesdata_w)
from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from pypy.objspace.std.sliceobject import W_SliceObject, unwrap_start_stop
from pypy.objspace.std.stringmethods import StringMethods, _get_buffer
from pypy.objspace.std.stringmethods import _descr_getslice_slowpath
@@ -1276,7 +1276,7 @@
start += step
-class BytearrayBuffer(PyBuffer):
+class BytearrayBuffer(Buffer):
_immutable_ = True
readonly = False
@@ -1306,7 +1306,7 @@
if start != 0 or stop != len(data):
data = data[start:stop]
return "".join(data)
- return PyBuffer.getslice(self, start, stop, step, size)
+ return Buffer.getslice(self, start, stop, step, size)
def setslice(self, start, string):
# No bounds checks.
diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -4,10 +4,10 @@
from rpython.rlib.objectmodel import (
compute_hash, compute_unique_id, import_from_mixin, newlist_hint,
resizelist_hint)
-from rpython.rlib.buffer import StringBuffer
from rpython.rlib.rstring import StringBuilder
from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.buffer import StringBuffer
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import (
WrappedDefault, interp2app, interpindirect2app, unwrap_spec)
diff --git a/pypy/objspace/std/memoryobject.py
b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -3,10 +3,10 @@
"""
import operator
-from rpython.rlib.buffer import Buffer, SubBuffer, StringBuffer
from rpython.rlib.objectmodel import compute_hash
from rpython.rlib.rstruct.error import StructError
from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.buffer import Buffer, SubBuffer, StringBuffer
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import interp2app
from pypy.interpreter.typedef import TypeDef, GetSetProperty,
make_weakref_descr
diff --git a/pypy/objspace/std/test/test_memoryobject.py
b/pypy/objspace/std/test/test_memoryobject.py
--- a/pypy/objspace/std/test/test_memoryobject.py
+++ b/pypy/objspace/std/test/test_memoryobject.py
@@ -4,7 +4,7 @@
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.gateway import interp2app
from pypy.interpreter.typedef import TypeDef
-from pypy.interpreter.buffer import PyBuffer
+from pypy.interpreter.buffer import Buffer
from pypy.conftest import option
class AppTestMemoryView:
@@ -292,7 +292,7 @@
assert (m[0], m[1], m[2], m[3]) == expected
a.free()
-class MockBuffer(PyBuffer):
+class MockBuffer(Buffer):
def __init__(self, space, w_arr, w_dim, w_fmt, \
w_itemsize, w_strides, w_shape):
self.space = space
diff --git a/pypy/objspace/std/unicodeobject.py
b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -3,7 +3,6 @@
from rpython.rlib.objectmodel import (
compute_hash, compute_unique_id, import_from_mixin,
enforceargs)
-from rpython.rlib.buffer import StringBuffer
from rpython.rlib.rstring import StringBuilder, UnicodeBuilder
from rpython.rlib.runicode import (
make_unicode_escape_function, str_decode_ascii, str_decode_utf_8,
@@ -13,6 +12,7 @@
from pypy.interpreter import unicodehelper
from pypy.interpreter.baseobjspace import W_Root
+from pypy.interpreter.buffer import StringBuffer
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit