Author: fijal
Branch: unicode-utf8
Changeset: r93158:467a32f09dd6
Date: 2017-11-24 11:16 +0100
http://bitbucket.org/pypy/pypy/changeset/467a32f09dd6/
Log: start fixing _rawffi
diff --git a/pypy/module/_rawffi/alt/interp_funcptr.py
b/pypy/module/_rawffi/alt/interp_funcptr.py
--- a/pypy/module/_rawffi/alt/interp_funcptr.py
+++ b/pypy/module/_rawffi/alt/interp_funcptr.py
@@ -167,8 +167,8 @@
addr = rffi.cast(rffi.ULONG, buf)
self.argchain.arg(addr)
- def handle_unichar_p(self, w_ffitype, w_obj, unicodeval):
- buf = rffi.unicode2wcharp(unicodeval)
+ def handle_unichar_p(self, w_ffitype, w_obj, utf8val, utf8len):
+ buf = rffi.utf82wcharp(utf8val, utf8len)
self.w_func.to_free.append(rffi.cast(rffi.VOIDP, buf))
addr = rffi.cast(rffi.ULONG, buf)
self.argchain.arg(addr)
diff --git a/pypy/module/_rawffi/alt/test/test_type_converter.py
b/pypy/module/_rawffi/alt/test/test_type_converter.py
--- a/pypy/module/_rawffi/alt/test/test_type_converter.py
+++ b/pypy/module/_rawffi/alt/test/test_type_converter.py
@@ -6,7 +6,7 @@
class DummyFromAppLevelConverter(FromAppLevelConverter):
- def handle_all(self, w_ffitype, w_obj, val):
+ def handle_all(self, w_ffitype, w_obj, val, lgt=None):
self.lastval = val
handle_signed = handle_all
@@ -120,8 +120,8 @@
def test_strings(self):
# first, try automatic conversion from applevel
self.check(app_types.char_p, self.space.newbytes('foo'), 'foo')
- self.check(app_types.unichar_p, self.space.wrap(u'foo\u1234'),
u'foo\u1234')
- self.check(app_types.unichar_p, self.space.wrap('foo'), u'foo')
+ self.check(app_types.unichar_p, self.space.wrap(u'foo\u1234'),
u'foo\u1234'.encode('utf8'))
+ self.check(app_types.unichar_p, self.space.wrap('foo'), 'foo')
# then, try to pass explicit pointers
self.check(app_types.char_p, self.space.wrap(42), 42)
self.check(app_types.unichar_p, self.space.wrap(42), 42)
diff --git a/pypy/module/_rawffi/alt/type_converter.py
b/pypy/module/_rawffi/alt/type_converter.py
--- a/pypy/module/_rawffi/alt/type_converter.py
+++ b/pypy/module/_rawffi/alt/type_converter.py
@@ -1,6 +1,6 @@
from rpython.rlib import libffi
-from rpython.rlib import jit
-from rpython.rlib.rarithmetic import r_uint
+from rpython.rlib import jit, rutf8
+from rpython.rlib.rarithmetic import r_uint, intmask
from pypy.interpreter.error import oefmt
from pypy.module._rawffi.structure import W_StructureInstance, W_Structure
from pypy.module._rawffi.alt.interp_ffitype import app_types
@@ -85,8 +85,8 @@
return True
elif w_ffitype.is_unichar_p() and (w_type is self.space.w_bytes or
w_type is self.space.w_unicode):
- unicodeval = self.space.unicode_w(w_obj)
- self.handle_unichar_p(w_ffitype, w_obj, unicodeval)
+ utf8, lgt = self.space.utf8_len_w(w_obj)
+ self.handle_unichar_p(w_ffitype, w_obj, utf8, lgt)
return True
return False
@@ -147,7 +147,7 @@
"""
self.error(w_ffitype, w_obj)
- def handle_unichar_p(self, w_ffitype, w_obj, unicodeval):
+ def handle_unichar_p(self, w_ffitype, w_obj, utf8val, utf8len):
"""
unicodeval: interp-level unicode
"""
@@ -228,7 +228,8 @@
return space.newbytes(chr(ucharval))
elif w_ffitype.is_unichar():
wcharval = self.get_unichar(w_ffitype)
- return space.newunicode(unichr(wcharval))
+ return space.newutf8(rutf8.unichr_as_utf8(wcharval), 1,
+ rutf8.get_flag_from_code(intmask(wcharval)))
elif w_ffitype.is_double():
return self._float(w_ffitype)
elif w_ffitype.is_singlefloat():
diff --git a/pypy/module/_rawffi/interp_rawffi.py
b/pypy/module/_rawffi/interp_rawffi.py
--- a/pypy/module/_rawffi/interp_rawffi.py
+++ b/pypy/module/_rawffi/interp_rawffi.py
@@ -10,6 +10,7 @@
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.tool import rffi_platform
from rpython.rlib.unroll import unrolling_iterable
+from rpython.rlib import rutf8
from rpython.rlib.objectmodel import specialize
import rpython.rlib.rposix as rposix
@@ -416,13 +417,13 @@
val = s[0]
push_func(add_arg, argdesc, val)
elif letter == 'u':
- s = space.unicode_w(w_arg)
- if len(s) != 1:
+ s, lgt = space.utf8_len_w(w_arg)
+ if lgt != 1:
raise oefmt(space.w_TypeError,
"Expected unicode string of length one as wide "
"character")
- val = s[0]
- push_func(add_arg, argdesc, val)
+ val = rutf8.codepoint_at_pos(s, 0)
+ push_func(add_arg, argdesc, rffi.cast(rffi.WCHAR_T, val))
else:
for c in unroll_letters_for_numbers:
if letter == c:
diff --git a/rpython/rtyper/lltypesystem/rffi.py
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -1024,13 +1024,14 @@
def utf82wcharp(utf8, utf8len):
from rpython.rlib import rutf8
- w = lltype.malloc(CWCHARP.TO, utf8len, flavor='raw')
+ w = lltype.malloc(CWCHARP.TO, utf8len + 1, flavor='raw')
i = 0
index = 0
while i < len(utf8):
w[index] = unichr(rutf8.codepoint_at_pos(utf8, i))
i = rutf8.next_codepoint_pos(utf8, i)
index += 1
+ w[index] = unichr(0)
return w
# char**
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit