Author: Ronan Lamy <[email protected]>
Branch: unicode-dtype
Changeset: r78000:f68fb42cff20
Date: 2015-06-06 16:16 +0100
http://bitbucket.org/pypy/pypy/changeset/f68fb42cff20/
Log: some progress
diff --git a/pypy/module/micronumpy/casting.py
b/pypy/module/micronumpy/casting.py
--- a/pypy/module/micronumpy/casting.py
+++ b/pypy/module/micronumpy/casting.py
@@ -325,6 +325,8 @@
return complex_dtype
elif space.isinstance_w(w_obj, space.w_str):
return variable_dtype(space, 'S%d' % space.len_w(w_obj))
+ elif space.isinstance_w(w_obj, space.w_unicode):
+ return new_unicode_dtype(space, space.len_w(w_obj))
return object_dtype
@signature(ann.instance(W_Dtype), ann.instance(W_Dtype), returns=ann.bool())
diff --git a/pypy/module/micronumpy/test/test_ndarray.py
b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -1,3 +1,4 @@
+# -*- encoding: utf-8 -*-
import py
import sys
@@ -322,6 +323,13 @@
assert b.flags['C']
assert (b == a).all()
+ def test_unicode(self):
+ import numpy as np
+ a = np.array([u'Aÿ', u'abc'], dtype=np.dtype('U'))
+ assert a.shape == (2,)
+ assert a.dtype == np.dtype('U3')
+ assert a[0] == u'Aÿ'
+
def test_dtype_attribute(self):
import numpy as np
a = np.array(40000, dtype='uint16')
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -11,7 +11,7 @@
most_neg_value_of, LONG_BIT
from rpython.rlib.rawstorage import (alloc_raw_storage,
raw_storage_getitem_unaligned, raw_storage_setitem_unaligned)
-from rpython.rlib.rstring import StringBuilder
+from rpython.rlib.rstring import StringBuilder, UnicodeBuilder
from rpython.rlib.rstruct.ieee import (float_pack, float_unpack, unpack_float,
pack_float80, unpack_float80)
from rpython.rlib.rstruct.nativefmttable import native_is_bigendian
@@ -2190,7 +2190,7 @@
self._store(storage, i, offset, box, width)
class UnicodeType(FlexibleType):
- T = lltype.Char
+ T = lltype.UniChar
num = NPY.UNICODE
kind = NPY.UNICODELTR
char = NPY.UNICODELTR
@@ -2202,58 +2202,75 @@
def coerce(self, space, dtype, w_item):
if isinstance(w_item, boxes.W_UnicodeBox):
return w_item
- raise OperationError(space.w_NotImplementedError, space.wrap(
- "coerce (probably from set_item) not implemented for unicode
type"))
+ value = space.unicode_w(w_item)
+ return boxes.W_UnicodeBox(value)
def store(self, arr, i, offset, box):
assert isinstance(box, boxes.W_UnicodeBox)
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ value = box._value
+ for k in range(len(value)):
+ index = i + offset + 4*k
+ data = rffi.cast(Int32.T, ord(box._value[k]))
+ raw_storage_setitem_unaligned(arr.storage, index, data)
def read(self, arr, i, offset, dtype=None):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ if dtype is None:
+ dtype = arr.dtype
+ size = dtype.elsize // 4
+ builder = UnicodeBuilder(size)
+ with arr as storage:
+ for k in range(size):
+ index = i + offset + 4*k
+ codepoint = raw_storage_getitem_unaligned(
+ Int32.T, arr.storage, index)
+ char = unichr(codepoint)
+ if char == u'\0':
+ break
+ builder.append(char)
+ return boxes.W_UnicodeBox(builder.build())
def str_format(self, item, add_quotes=True):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def to_builtin_type(self, space, box):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def eq(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def ne(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def lt(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def le(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def gt(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def ge(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def logical_and(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def logical_or(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def logical_not(self, v):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
@str_binary_op
def logical_xor(self, v1, v2):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def bool(self, v):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
def fill(self, storage, width, box, start, stop, offset, gcstruct):
- raise oefmt(self.space.w_NotImplementedError, "unicode type not
completed")
+ raise NotImplementedError
class VoidType(FlexibleType):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit