Author: Armin Rigo <[email protected]>
Branch: ffi-backend
Changeset: r56572:2b97229b0b44
Date: 2012-08-04 16:08 +0200
http://bitbucket.org/pypy/pypy/changeset/2b97229b0b44/
Log: Update to the latest revision: str(), unicode() => ffi.string()
diff --git a/pypy/module/_cffi_backend/__init__.py
b/pypy/module/_cffi_backend/__init__.py
--- a/pypy/module/_cffi_backend/__init__.py
+++ b/pypy/module/_cffi_backend/__init__.py
@@ -29,6 +29,7 @@
'_getfields': 'func._getfields',
'getcname': 'func.getcname',
+ 'string': 'func.string',
'buffer': 'cbuffer.buffer',
'get_errno': 'cerrno.get_errno',
diff --git a/pypy/module/_cffi_backend/cdataobj.py
b/pypy/module/_cffi_backend/cdataobj.py
--- a/pypy/module/_cffi_backend/cdataobj.py
+++ b/pypy/module/_cffi_backend/cdataobj.py
@@ -71,12 +71,6 @@
"cdata of type '%s' has no len()",
self.ctype.name)
- def str(self):
- return self.ctype.str(self)
-
- def unicode(self):
- return self.ctype.unicode(self)
-
def _make_comparison(name):
op = getattr(operator, name)
requires_ordering = name not in ('eq', 'ne')
@@ -302,8 +296,6 @@
__long__ = interp2app(W_CData.long),
__float__ = interp2app(W_CData.float),
__len__ = interp2app(W_CData.len),
- __str__ = interp2app(W_CData.str),
- __unicode__ = interp2app(W_CData.unicode),
__lt__ = interp2app(W_CData.lt),
__le__ = interp2app(W_CData.le),
__eq__ = interp2app(W_CData.eq),
diff --git a/pypy/module/_cffi_backend/ctypearray.py
b/pypy/module/_cffi_backend/ctypearray.py
--- a/pypy/module/_cffi_backend/ctypearray.py
+++ b/pypy/module/_cffi_backend/ctypearray.py
@@ -26,21 +26,6 @@
self.length = length
self.ctptr = ctptr
- def str(self, cdataobj):
- if isinstance(self.ctitem, W_CTypePrimitiveChar):
- s = rffi.charp2strn(cdataobj._cdata, cdataobj.get_array_length())
- keepalive_until_here(cdataobj)
- return self.space.wrap(s)
- return W_CTypePtrOrArray.str(self, cdataobj)
-
- def unicode(self, cdataobj):
- if isinstance(self.ctitem, W_CTypePrimitiveUniChar):
- s = rffi.wcharp2unicoden(rffi.cast(rffi.CWCHARP, cdataobj._cdata),
- cdataobj.get_array_length())
- keepalive_until_here(cdataobj)
- return self.space.wrap(s)
- return W_CTypePtrOrArray.unicode(self, cdataobj)
-
def _alignof(self):
return self.ctitem.alignof()
diff --git a/pypy/module/_cffi_backend/ctypeenum.py
b/pypy/module/_cffi_backend/ctypeenum.py
--- a/pypy/module/_cffi_backend/ctypeenum.py
+++ b/pypy/module/_cffi_backend/ctypeenum.py
@@ -39,10 +39,10 @@
space.call_method(w_lst, 'sort')
return w_lst
- def str(self, cdataobj):
- w_res = self.convert_to_object(cdataobj._cdata)
+ def string(self, cdataobj, maxlen):
+ w_result = self.convert_to_object(cdataobj._cdata)
keepalive_until_here(cdataobj)
- return w_res
+ return w_result
def convert_to_object(self, cdata):
value = intmask(misc.read_raw_signed_data(cdata, self.size))
diff --git a/pypy/module/_cffi_backend/ctypeobj.py
b/pypy/module/_cffi_backend/ctypeobj.py
--- a/pypy/module/_cffi_backend/ctypeobj.py
+++ b/pypy/module/_cffi_backend/ctypeobj.py
@@ -97,11 +97,11 @@
"cdata of type '%s' cannot be indexed",
self.name)
- def str(self, cdataobj):
- return cdataobj.repr()
-
- def unicode(self, cdataobj):
- return cdataobj.repr()
+ def string(self, cdataobj, maxlen):
+ space = self.space
+ raise operationerrfmt(space.w_TypeError,
+ "string(): unexpected cdata '%s' argument",
+ self.name)
def add(self, cdata, i):
space = self.space
diff --git a/pypy/module/_cffi_backend/ctypeprim.py
b/pypy/module/_cffi_backend/ctypeprim.py
--- a/pypy/module/_cffi_backend/ctypeprim.py
+++ b/pypy/module/_cffi_backend/ctypeprim.py
@@ -71,6 +71,13 @@
raise operationerrfmt(space.w_OverflowError,
"integer %s does not fit '%s'", s, self.name)
+ def string(self, cdataobj, maxlen):
+ if self.size == 1:
+ s = cdataobj._cdata[0]
+ keepalive_until_here(cdataobj)
+ return self.space.wrap(s)
+ return W_CType.string(self, cdataobj, maxlen)
+
class W_CTypePrimitiveCharOrUniChar(W_CTypePrimitive):
_attrs_ = []
@@ -91,11 +98,6 @@
def convert_to_object(self, cdata):
return self.space.wrap(cdata[0])
- def str(self, cdataobj):
- w_res = self.convert_to_object(cdataobj._cdata)
- keepalive_until_here(cdataobj)
- return w_res
-
def _convert_to_char(self, w_ob):
space = self.space
if space.isinstance_w(w_ob, space.w_str):
@@ -125,7 +127,7 @@
s = rffi.wcharpsize2unicode(unichardata, 1)
return self.space.wrap(s)
- def unicode(self, cdataobj):
+ def string(self, cdataobj, maxlen):
w_res = self.convert_to_object(cdataobj._cdata)
keepalive_until_here(cdataobj)
return w_res
diff --git a/pypy/module/_cffi_backend/ctypeptr.py
b/pypy/module/_cffi_backend/ctypeptr.py
--- a/pypy/module/_cffi_backend/ctypeptr.py
+++ b/pypy/module/_cffi_backend/ctypeptr.py
@@ -108,6 +108,41 @@
else:
raise self._convert_error("list or tuple", w_ob)
+ def string(self, cdataobj, maxlen):
+ space = self.space
+ if isinstance(self.ctitem, ctypeprim.W_CTypePrimitive):
+ cdata = cdataobj._cdata
+ if not cdata:
+ raise operationerrfmt(space.w_RuntimeError,
+ "cannot use string() on %s",
+ space.str_w(cdataobj.repr()))
+ #
+ from pypy.module._cffi_backend import ctypearray
+ length = maxlen
+ if length < 0 and isinstance(self, ctypearray.W_CTypeArray):
+ length = cdataobj.get_array_length()
+ #
+ # pointer to a primitive type of size 1: builds and returns a str
+ if self.ctitem.size == rffi.sizeof(lltype.Char):
+ if length < 0:
+ s = rffi.charp2str(cdata)
+ else:
+ s = rffi.charp2strn(cdata, length)
+ keepalive_until_here(cdataobj)
+ return space.wrap(s)
+ #
+ # pointer to a wchar_t: builds and returns a unicode
+ if self.is_unichar_ptr_or_array():
+ cdata = rffi.cast(rffi.CWCHARP, cdata)
+ if length < 0:
+ u = rffi.wcharp2unicode(cdata)
+ else:
+ u = rffi.wcharp2unicoden(cdata, length)
+ keepalive_until_here(cdataobj)
+ return space.wrap(u)
+ #
+ return W_CType.string(self, cdataobj, maxlen)
+
class W_CTypePtrBase(W_CTypePtrOrArray):
# base class for both pointers and pointers-to-functions
@@ -152,30 +187,6 @@
extra = " *"
W_CTypePtrBase.__init__(self, space, size, extra, 2, ctitem)
- def str(self, cdataobj):
- if self.is_char_ptr_or_array():
- if not cdataobj._cdata:
- space = self.space
- raise operationerrfmt(space.w_RuntimeError,
- "cannot use str() on %s",
- space.str_w(cdataobj.repr()))
- s = rffi.charp2str(cdataobj._cdata)
- keepalive_until_here(cdataobj)
- return self.space.wrap(s)
- return W_CTypePtrOrArray.str(self, cdataobj)
-
- def unicode(self, cdataobj):
- if self.is_unichar_ptr_or_array():
- if not cdataobj._cdata:
- space = self.space
- raise operationerrfmt(space.w_RuntimeError,
- "cannot use unicode() on %s",
- space.str_w(cdataobj.repr()))
- s = rffi.wcharp2unicode(rffi.cast(rffi.CWCHARP, cdataobj._cdata))
- keepalive_until_here(cdataobj)
- return self.space.wrap(s)
- return W_CTypePtrOrArray.unicode(self, cdataobj)
-
def newp(self, w_init):
space = self.space
ctitem = self.ctitem
diff --git a/pypy/module/_cffi_backend/func.py
b/pypy/module/_cffi_backend/func.py
--- a/pypy/module/_cffi_backend/func.py
+++ b/pypy/module/_cffi_backend/func.py
@@ -69,3 +69,9 @@
p = ctype.name_position
s = '%s%s%s' % (ctype.name[:p], replace_with, ctype.name[p:])
return space.wrap(s)
+
+# ____________________________________________________________
+
+@unwrap_spec(cdata=cdataobj.W_CData, maxlen=int)
+def string(space, cdata, maxlen=-1):
+ return cdata.ctype.string(cdata, maxlen)
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -120,7 +120,7 @@
assert long(cast(p, 'A')) == 65L
assert type(int(cast(p, 'A'))) is int
assert type(long(cast(p, 'A'))) is long
- assert str(cast(p, 'A')) == 'A'
+ assert str(cast(p, 'A')) == repr(cast(p, 'A'))
assert repr(cast(p, 'A')) == "<cdata 'char' 'A'>"
assert repr(cast(p, 255)) == r"<cdata 'char' '\xff'>"
assert repr(cast(p, 0)) == r"<cdata 'char' '\x00'>"
@@ -225,7 +225,9 @@
assert p[0] == 'A'
py.test.raises(TypeError, newp, BPtr, 65)
py.test.raises(TypeError, newp, BPtr, "foo")
- assert str(cast(BChar, 'A')) == 'A'
+ c = cast(BChar, 'A')
+ assert str(c) == repr(c)
+ assert int(c) == ord('A')
py.test.raises(TypeError, cast, BChar, 'foo')
def test_reading_pointer_to_pointer():
@@ -285,6 +287,9 @@
py.test.raises(TypeError, "p[0]")
def test_default_str():
+ BChar = new_primitive_type("char")
+ x = cast(BChar, 42)
+ assert str(x) == repr(x)
BInt = new_primitive_type("int")
x = cast(BInt, 42)
assert str(x) == repr(x)
@@ -310,7 +315,7 @@
y = cast(BInt, x)
assert int(y) == 42
y = cast(new_primitive_type("char"), x)
- assert str(y) == chr(42)
+ assert int(y) == 42
y = cast(new_primitive_type("float"), x)
assert float(y) == 42.0
#
@@ -451,7 +456,7 @@
#
p = new_primitive_type("char")
n = cast(p, cast(p, "A"))
- assert str(n) == "A"
+ assert int(n) == ord("A")
def test_new_primitive_from_cdata():
p = new_primitive_type("int")
@@ -949,14 +954,14 @@
BEnum = new_enum_type("foo", ('def', 'c', 'ab'), (0, 1, -20))
e = cast(BEnum, 0)
assert repr(e) == "<cdata 'enum foo' 'def'>"
- assert str(e) == 'def'
- assert str(cast(BEnum, -20)) == 'ab'
- assert str(cast(BEnum, 'c')) == 'c'
+ assert string(e) == 'def'
+ assert string(cast(BEnum, -20)) == 'ab'
+ assert string(cast(BEnum, 'c')) == 'c'
assert int(cast(BEnum, 'c')) == 1
assert int(cast(BEnum, 'def')) == 0
assert int(cast(BEnum, -242 + 2**128)) == -242
- assert str(cast(BEnum, -242 + 2**128)) == '#-242'
- assert str(cast(BEnum, '#-20')) == 'ab'
+ assert string(cast(BEnum, -242 + 2**128)) == '#-242'
+ assert string(cast(BEnum, '#-20')) == 'ab'
assert repr(cast(BEnum, '#-20')) == "<cdata 'enum foo' 'ab'>"
assert repr(cast(BEnum, '#-21')) == "<cdata 'enum foo' '#-21'>"
@@ -1106,11 +1111,12 @@
BArray1 = new_array_type(new_pointer_type(BChar), 5)
BArray2 = new_array_type(new_pointer_type(BArray1), 5)
a = newp(BArray2, ["abc", "de", "ghij"])
- assert str(a[2]) == "ghij"
+ assert string(a[1]) == "de"
+ assert string(a[2]) == "ghij"
a[2] = "."
- assert str(a[2]) == "."
+ assert string(a[2]) == "."
a[2] = "12345"
- assert str(a[2]) == "12345"
+ assert string(a[2]) == "12345"
e = py.test.raises(IndexError, 'a[2] = "123456"')
assert 'char[5]' in str(e.value)
assert 'got 6 characters' in str(e.value)
@@ -1203,16 +1209,53 @@
p2 = newp(new_pointer_type(BFunc), p1)
assert p2[0] == p1
-def test_str():
+def test_string():
BChar = new_primitive_type("char")
+ assert string(cast(BChar, 42)) == '*'
+ assert string(cast(BChar, 0)) == '\x00'
BCharP = new_pointer_type(BChar)
BArray = new_array_type(BCharP, 10)
a = newp(BArray, "hello")
assert len(a) == 10
- assert str(a) == "hello"
+ assert string(a) == "hello"
p = a + 2
- assert str(p) == "llo"
- py.test.raises(RuntimeError, str, cast(BCharP, 0))
+ assert string(p) == "llo"
+ assert string(newp(new_array_type(BCharP, 4), "abcd")) == "abcd"
+ py.test.raises(RuntimeError, string, cast(BCharP, 0))
+ assert string(a, 4) == "hell"
+ assert string(a, 5) == "hello"
+ assert string(a, 6) == "hello"
+
+def test_string_byte():
+ BByte = new_primitive_type("signed char")
+ assert string(cast(BByte, 42)) == '*'
+ assert string(cast(BByte, 0)) == '\x00'
+ BArray = new_array_type(new_pointer_type(BByte), None)
+ a = newp(BArray, [65, 66, 67])
+ assert type(string(a)) is str and string(a) == 'ABC'
+ #
+ BByte = new_primitive_type("unsigned char")
+ assert string(cast(BByte, 42)) == '*'
+ assert string(cast(BByte, 0)) == '\x00'
+ BArray = new_array_type(new_pointer_type(BByte), None)
+ a = newp(BArray, [65, 66, 67])
+ assert type(string(a)) is str and string(a) == 'ABC'
+
+def test_string_wchar():
+ BWChar = new_primitive_type("wchar_t")
+ assert string(cast(BWChar, 42)) == u'*'
+ assert string(cast(BWChar, 0x4253)) == u'\u4253'
+ assert string(cast(BWChar, 0)) == u'\x00'
+ BArray = new_array_type(new_pointer_type(BWChar), None)
+ a = newp(BArray, [u'A', u'B', u'C'])
+ assert type(string(a)) is unicode and string(a) == u'ABC'
+ assert string(a, 10) == u'ABC'
+
+def test_string_typeerror():
+ BShort = new_primitive_type("short")
+ BArray = new_array_type(new_pointer_type(BShort), None)
+ a = newp(BArray, [65, 66, 67])
+ py.test.raises(TypeError, string, a)
def test_bug_convert_to_ptr():
BChar = new_primitive_type("char")
@@ -1229,12 +1272,12 @@
BStructPtr = new_pointer_type(BStruct)
complete_struct_or_union(BStruct, [('a1', BCharArray10, -1)])
p = newp(BStructPtr, None)
- assert str(p.a1) == ''
+ assert string(p.a1) == ''
p.a1 = 'foo'
- assert str(p.a1) == 'foo'
+ assert string(p.a1) == 'foo'
assert list(p.a1) == ['f', 'o', 'o'] + ['\x00'] * 7
p.a1 = ['x', 'y']
- assert str(p.a1) == 'xyo'
+ assert string(p.a1) == 'xyo'
def test_invalid_function_result_types():
BFunc = new_function_type((), new_void_type())
@@ -1364,7 +1407,7 @@
if wchar4:
x = cast(BWChar, 0x12345)
assert str(x) == "<cdata 'wchar_t' u'\U00012345'>"
- assert unicode(x) == u'\U00012345'
+ assert int(x) == 0x12345
else:
assert not pyuni4
#
@@ -1395,20 +1438,20 @@
BWCharArray = new_array_type(BWCharP, None)
a = newp(BWCharArray, u'hello \u1234 world')
assert len(a) == 14 # including the final null
- assert unicode(a) == u'hello \u1234 world'
+ assert string(a) == u'hello \u1234 world'
a[13] = u'!'
- assert unicode(a) == u'hello \u1234 world!'
+ assert string(a) == u'hello \u1234 world!'
assert str(a) == repr(a)
assert a[6] == u'\u1234'
a[6] = u'-'
- assert unicode(a) == 'hello - world!'
+ assert string(a) == u'hello - world!'
assert str(a) == repr(a)
#
if wchar4:
u = u'\U00012345\U00012346\U00012347'
a = newp(BWCharArray, u)
assert len(a) == 4
- assert unicode(a) == u
+ assert string(a) == u
assert len(list(a)) == 4
expected = [u'\U00012345', u'\U00012346', u'\U00012347', unichr(0)]
assert list(a) == expected
@@ -1419,17 +1462,17 @@
w = cast(BWChar, 'a')
assert repr(w) == "<cdata 'wchar_t' u'a'>"
assert str(w) == repr(w)
- assert unicode(w) == u'a'
+ assert string(w) == u'a'
assert int(w) == ord('a')
w = cast(BWChar, 0x1234)
assert repr(w) == "<cdata 'wchar_t' u'\u1234'>"
assert str(w) == repr(w)
- assert unicode(w) == u'\u1234'
+ assert string(w) == u'\u1234'
assert int(w) == 0x1234
w = cast(BWChar, u'\u8234')
assert repr(w) == "<cdata 'wchar_t' u'\u8234'>"
assert str(w) == repr(w)
- assert unicode(w) == u'\u8234'
+ assert string(w) == u'\u8234'
assert int(w) == 0x8234
w = cast(BInt, u'\u1234')
assert repr(w) == "<cdata 'int' 4660>"
@@ -1437,7 +1480,7 @@
w = cast(BWChar, u'\U00012345')
assert repr(w) == "<cdata 'wchar_t' u'\U00012345'>"
assert str(w) == repr(w)
- assert unicode(w) == u'\U00012345'
+ assert string(w) == u'\U00012345'
assert int(w) == 0x12345
w = cast(BInt, u'\U00012345')
assert repr(w) == "<cdata 'int' 74565>"
@@ -1447,23 +1490,23 @@
#
a = newp(BWCharArray, u'hello - world')
p = cast(BWCharP, a)
- assert unicode(p) == u'hello - world'
+ assert string(p) == u'hello - world'
p[6] = u'\u2345'
- assert unicode(p) == u'hello \u2345 world'
+ assert string(p) == u'hello \u2345 world'
#
s = newp(BStructPtr, [u'\u1234', p])
assert s.a1 == u'\u1234'
assert s.a2 == p
assert str(s.a2) == repr(s.a2)
- assert unicode(s.a2) == u'hello \u2345 world'
+ assert string(s.a2) == u'hello \u2345 world'
#
q = cast(BWCharP, 0)
assert str(q) == repr(q)
- py.test.raises(RuntimeError, unicode, q)
+ py.test.raises(RuntimeError, string, q)
#
def cb(p):
assert repr(p).startswith("<cdata 'wchar_t *' 0x")
- return len(unicode(p))
+ return len(string(p))
BFunc = new_function_type((BWCharP,), BInt, False)
f = callback(BFunc, cb, -42)
assert f(u'a\u1234b') == 3
@@ -1471,9 +1514,9 @@
if wchar4 and not pyuni4:
# try out-of-range wchar_t values
x = cast(BWChar, 1114112)
- py.test.raises(ValueError, unicode, x)
+ py.test.raises(ValueError, string, x)
x = cast(BWChar, -1)
- py.test.raises(ValueError, unicode, x)
+ py.test.raises(ValueError, string, x)
def test_keepalive_struct():
# exception to the no-keepalive rule: p=newp(BStructPtr) returns a
@@ -1585,12 +1628,12 @@
assert c[2] == '-'
assert str(buf) == "hi-there\x00"
buf[:2] = 'HI'
- assert str(c) == 'HI-there'
+ assert string(c) == 'HI-there'
assert buf[:4:2] == 'H-'
if '__pypy__' not in sys.builtin_module_names:
# XXX pypy doesn't support the following assignment so far
buf[:4:2] = 'XY'
- assert str(c) == 'XIYthere'
+ assert string(c) == 'XIYthere'
def test_getcname():
BUChar = new_primitive_type("unsigned char")
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit