Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r55748:497d9fce6929 Date: 2012-06-20 18:40 +0200 http://bitbucket.org/pypy/pypy/changeset/497d9fce6929/
Log: Next test. 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 @@ -44,6 +44,11 @@ keepalive_until_here(self) return w_result + def str(self): + w_result = self.ctype.try_str(self.cdata) + keepalive_until_here(self) + return w_result or self.repr() + def read_raw_signed_data(self): result = misc.read_raw_signed_data(self.cdata, self.ctype.size) keepalive_until_here(self) @@ -91,6 +96,7 @@ __int__ = interp2app(W_CData.int), __long__ = interp2app(W_CData.long), __float__ = interp2app(W_CData.float), + __str__ = interp2app(W_CData.str), ) W_CData.acceptable_as_base_class = False 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 @@ -36,6 +36,9 @@ def convert_to_object(self, cdata): raise NotImplementedError + def try_str(self, cdata): + return None + class W_CTypePrimitive(W_CType): @@ -44,7 +47,12 @@ if cdataobj.check_cdata(space, w_ob): xxx elif space.isinstance_w(w_ob, space.w_str): - xxx + s = space.str_w(w_ob) + if len(s) != 1: + raise operationerrfmt(space.w_TypeError, + "cannot cast string of length %d to ctype '%s'", + len(s), self.name) + value = ord(s[0]) elif space.is_w(w_ob, space.w_None): value = 0 else: @@ -57,7 +65,10 @@ class W_CTypePrimitiveChar(W_CTypePrimitive): def int(self, cdata): - xxx + return self.space.wrap(ord(cdata[0])) + + def try_str(self, cdata): + return self.space.wrap(cdata[0]) class W_CTypePrimitiveSigned(W_CTypePrimitive): diff --git a/pypy/module/_ffi_backend/test/test_c.py b/pypy/module/_ffi_backend/test/test_c.py --- a/pypy/module/_ffi_backend/test/test_c.py +++ b/pypy/module/_ffi_backend/test/test_c.py @@ -124,6 +124,8 @@ assert repr(float(cast(p, -0.0))) == '-0.0' def test_character_type(self): + new_primitive_type = self.b.new_primitive_type + cast = self.b.cast p = new_primitive_type("char") assert bool(cast(p, '\x00')) assert cast(p, '\x00') != cast(p, -17*256) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit