Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r56483:bdc5a8e54948 Date: 2012-07-26 21:50 +0200 http://bitbucket.org/pypy/pypy/changeset/bdc5a8e54948/
Log: Enough to pass test_wchar. 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 @@ -34,8 +34,8 @@ def unicode(self, cdataobj): if isinstance(self.ctitem, W_CTypePrimitiveUniChar): - XXX - s = rffi.charp2strn(cdataobj._cdata, cdataobj.get_array_length()) + 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) diff --git a/pypy/module/_cffi_backend/ctypefunc.py b/pypy/module/_cffi_backend/ctypefunc.py --- a/pypy/module/_cffi_backend/ctypefunc.py +++ b/pypy/module/_cffi_backend/ctypefunc.py @@ -126,7 +126,17 @@ # set the "must free" flag to 0 set_mustfree_flag(data, 0) # - #XXX WCHAR unicode raises NotImplementedError + if argtype.is_unichar_ptr_or_array: + try: + space.unicode_w(w_obj) + except OperationError: + if not e.match(space, space.w_TypeError): + raise + else: + # passing a unicode raises NotImplementedError for now + raise OperationError(space.w_NotImplementedError, + space.wrap("automatic unicode-to-" + "'wchar_t *' conversion")) # argtype.convert_from_object(data, w_obj) resultdata = rffi.ptradd(buffer, cif_descr.exchange_result) 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 @@ -33,6 +33,15 @@ len(s), self.name) return ord(s[0]) + def cast_unicode(self, w_ob): + space = self.space + s = space.unicode_w(w_ob) + if len(s) != 1: + raise operationerrfmt(space.w_TypeError, + "cannot cast unicode string of length %d to ctype '%s'", + len(s), self.name) + return ord(s[0]) + def cast(self, w_ob): from pypy.module._cffi_backend import ctypeptr space = self.space @@ -44,7 +53,9 @@ elif space.isinstance_w(w_ob, space.w_str): value = self.cast_str(w_ob) value = r_ulonglong(value) - #XXX WCHAR space.w_unicode + elif space.isinstance_w(w_ob, space.w_unicode): + value = self.cast_unicode(w_ob) + value = r_ulonglong(value) else: value = misc.as_unsigned_long_long(space, w_ob, strict=False) w_cdata = cdataobj.W_CDataCasted(space, self.size, self) @@ -96,7 +107,8 @@ class W_CTypePrimitiveUniChar(W_CTypePrimitiveCharOrUniChar): def int(self, cdata): - XXX + unichardata = rffi.cast(rffi.CWCHARP, cdata) + return self.space.wrap(ord(unichardata[0])) def convert_to_object(self, cdata): unichardata = rffi.cast(rffi.CWCHARP, cdata) 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 @@ -101,7 +101,16 @@ return W_CTypePtrOrArray.str(self, cdataobj) def unicode(self, cdataobj): - XXX + 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): from pypy.module._cffi_backend import ctypeprim 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 @@ -1431,7 +1431,7 @@ #assert f(u'a\u1234b') == 3 -- not implemented py.test.raises(NotImplementedError, f, u'a\u1234b') # - if wchar4: + if wchar4 and not pyuni4: # try out-of-range wchar_t values x = cast(BWChar, 1114112) py.test.raises(ValueError, unicode, x) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit