Author: Armin Rigo <[email protected]>
Branch: ffi-backend
Changeset: r55805:5dac7ab941a2
Date: 2012-06-24 18:21 +0200
http://bitbucket.org/pypy/pypy/changeset/5dac7ab941a2/
Log: Fixes.
diff --git a/pypy/module/_ffi_backend/cdataobj.py
b/pypy/module/_ffi_backend/cdataobj.py
--- a/pypy/module/_ffi_backend/cdataobj.py
+++ b/pypy/module/_ffi_backend/cdataobj.py
@@ -59,8 +59,7 @@
self.ctype.name)
def str(self):
- w_result = self.ctype.try_str(self._cdata)
- keepalive_until_here(self)
+ w_result = self.ctype.try_str(self)
return w_result or self.repr()
@specialize.arg(2)
diff --git a/pypy/module/_ffi_backend/ctypeobj.py
b/pypy/module/_ffi_backend/ctypeobj.py
--- a/pypy/module/_ffi_backend/ctypeobj.py
+++ b/pypy/module/_ffi_backend/ctypeobj.py
@@ -54,7 +54,7 @@
"cdata of type '%s' cannot be indexed",
self.name)
- def try_str(self, cdata):
+ def try_str(self, cdataobj):
return None
def add(self, cdata, i):
@@ -109,6 +109,13 @@
extra = " *"
W_CTypePtrOrArray.__init__(self, space, size, extra, 2, ctitem)
+ def try_str(self, cdataobj):
+ if isinstance(self.ctitem, W_CTypePrimitiveChar):
+ s = rffi.charp2str(cdataobj._cdata)
+ keepalive_until_here(cdataobj)
+ return self.space.wrap(s)
+ return None
+
def cast(self, w_ob):
space = self.space
ob = space.interpclass_w(w_ob)
@@ -164,6 +171,13 @@
self.length = length
self.ctptr = ctptr
+ def try_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 None
+
def _alignof(self):
return self.ctitem.alignof()
@@ -296,7 +310,10 @@
def convert_to_object(self, cdata):
return self.space.wrap(cdata[0])
- try_str = convert_to_object
+ def try_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
diff --git a/pypy/module/_ffi_backend/test/_backend_test_c.py
b/pypy/module/_ffi_backend/test/_backend_test_c.py
--- a/pypy/module/_ffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_ffi_backend/test/_backend_test_c.py
@@ -205,9 +205,17 @@
BChar = new_primitive_type("char")
BInt = new_primitive_type("int")
BFloat = new_primitive_type("float")
- assert (hash(cast(BChar, 'A')) !=
- hash(cast(BInt, 65)))
- assert hash(cast(BFloat, 65)) != hash(65.0)
+ for i in range(1, 20):
+ if (hash(cast(BChar, chr(i))) !=
+ hash(cast(BInt, i))):
+ break
+ else:
+ raise AssertionError("hashes are equal")
+ for i in range(1, 20):
+ if hash(cast(BFloat, i)) != hash(float(i)):
+ break
+ else:
+ raise AssertionError("hashes are equal")
def test_no_len_on_nonarray():
p = new_primitive_type("int")
@@ -933,3 +941,13 @@
u1 = newp(BUnionPtr, 42)
u2 = newp(BUnionPtr, u1[0])
assert u2.a1 == 42
+
+def test_str():
+ BChar = new_primitive_type("char")
+ BCharP = new_pointer_type(BChar)
+ BArray = new_array_type(BCharP, 10)
+ a = newp(BArray, "hello")
+ assert len(a) == 10
+ assert str(a) == "hello"
+ p = a + 2
+ assert str(p) == "llo"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit