[pypy-commit] pypy default: merge
fijal
noreply at buildbot.pypy.org
Sat Oct 27 21:33:48 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r58516:8a98d2b926ad
Date: 2012-10-27 21:33 +0200
http://bitbucket.org/pypy/pypy/changeset/8a98d2b926ad/
Log: merge
diff --git a/lib_pypy/numpypy/core/numeric.py b/lib_pypy/numpypy/core/numeric.py
--- a/lib_pypy/numpypy/core/numeric.py
+++ b/lib_pypy/numpypy/core/numeric.py
@@ -1,5 +1,5 @@
-from _numpypy import array, ndarray, int_, float_, bool_ #, complex_# , longlong
+from _numpypy import array, ndarray, int_, float_, bool_, flexible #, complex_# , longlong
from _numpypy import concatenate
from .fromnumeric import any
import math
@@ -200,7 +200,7 @@
typename = "'%s'" % typename
lf = ''
- if 0: # or issubclass(arr.dtype.type, flexible):
+ if issubclass(arr.dtype.type, flexible):
if arr.dtype.names:
typename = "%s" % str(arr.dtype)
else:
diff --git a/lib_pypy/pyrepl/readline.py b/lib_pypy/pyrepl/readline.py
--- a/lib_pypy/pyrepl/readline.py
+++ b/lib_pypy/pyrepl/readline.py
@@ -233,7 +233,7 @@
try:
return unicode(line, ENCODING)
except UnicodeDecodeError: # bah, silently fall back...
- return unicode(line, 'utf-8')
+ return unicode(line, 'utf-8', 'replace')
def get_history_length(self):
return self.saved_history_length
diff --git a/lib_pypy/pyrepl/unix_console.py b/lib_pypy/pyrepl/unix_console.py
--- a/lib_pypy/pyrepl/unix_console.py
+++ b/lib_pypy/pyrepl/unix_console.py
@@ -496,7 +496,7 @@
if iscode:
self.__tputs(text)
else:
- os.write(self.output_fd, text.encode(self.encoding))
+ os.write(self.output_fd, text.encode(self.encoding, 'replace'))
del self.__buffer[:]
def __tputs(self, fmt, prog=delayprog):
diff --git a/pypy/annotation/annrpython.py b/pypy/annotation/annrpython.py
--- a/pypy/annotation/annrpython.py
+++ b/pypy/annotation/annrpython.py
@@ -548,7 +548,7 @@
if cell.is_constant():
newcell.const = cell.const
cell = newcell
- cell.knowntypedata = renamed_knowntypedata
+ cell.set_knowntypedata(renamed_knowntypedata)
cells.append(cell)
diff --git a/pypy/annotation/binaryop.py b/pypy/annotation/binaryop.py
--- a/pypy/annotation/binaryop.py
+++ b/pypy/annotation/binaryop.py
@@ -144,7 +144,7 @@
# XXX HACK HACK HACK
bk = getbookkeeper()
if bk is not None: # for testing
- knowntypedata = r.knowntypedata = {}
+ knowntypedata = {}
fn, block, i = bk.position_key
annotator = bk.annotator
@@ -168,6 +168,7 @@
bind(obj2, obj1, 0)
bind(obj1, obj2, 1)
+ r.set_knowntypedata(knowntypedata)
return r
@@ -337,8 +338,7 @@
case = opname in ('gt', 'ge', 'eq')
add_knowntypedata(knowntypedata, case, [op.args[0]],
SomeInteger(nonneg=True, knowntype=tointtype(int1)))
- if knowntypedata:
- r.knowntypedata = knowntypedata
+ r.set_knowntypedata(knowntypedata)
# a special case for 'x < 0' or 'x >= 0',
# where 0 is a flow graph Constant
# (in this case we are sure that it cannot become a r_uint later)
@@ -369,8 +369,7 @@
if hasattr(boo1, 'knowntypedata') and \
hasattr(boo2, 'knowntypedata'):
ktd = merge_knowntypedata(boo1.knowntypedata, boo2.knowntypedata)
- if ktd:
- s.knowntypedata = ktd
+ s.set_knowntypedata(ktd)
return s
def and_((boo1, boo2)):
diff --git a/pypy/annotation/builtin.py b/pypy/annotation/builtin.py
--- a/pypy/annotation/builtin.py
+++ b/pypy/annotation/builtin.py
@@ -188,10 +188,10 @@
variables = [op.args[1]]
for variable in variables:
assert bk.annotator.binding(variable) == s_obj
- r.knowntypedata = {}
-
+ knowntypedata = {}
if not hasattr(typ, '_freeze_') and isinstance(s_type, SomePBC):
- add_knowntypedata(r.knowntypedata, True, variables, bk.valueoftype(typ))
+ add_knowntypedata(knowntypedata, True, variables, bk.valueoftype(typ))
+ r.set_knowntypedata(knowntypedata)
return r
# note that this one either needs to be constant, or we will create SomeObject
diff --git a/pypy/annotation/model.py b/pypy/annotation/model.py
--- a/pypy/annotation/model.py
+++ b/pypy/annotation/model.py
@@ -195,6 +195,10 @@
unsigned = False
def __init__(self):
pass
+ def set_knowntypedata(self, knowntypedata):
+ assert not hasattr(self, 'knowntypedata')
+ if knowntypedata:
+ self.knowntypedata = knowntypedata
class SomeStringOrUnicode(SomeObject):
immutable = True
diff --git a/pypy/annotation/unaryop.py b/pypy/annotation/unaryop.py
--- a/pypy/annotation/unaryop.py
+++ b/pypy/annotation/unaryop.py
@@ -76,7 +76,7 @@
s_obj.is_true_behavior(r)
bk = getbookkeeper()
- knowntypedata = r.knowntypedata = {}
+ knowntypedata = {}
fn, block, i = bk.position_key
op = block.operations[i]
assert op.opname == "is_true" or op.opname == "nonzero"
@@ -86,8 +86,8 @@
if s_obj.can_be_none():
s_nonnone_obj = s_obj.nonnoneify()
add_knowntypedata(knowntypedata, True, [arg], s_nonnone_obj)
+ r.set_knowntypedata(knowntypedata)
return r
-
def nonzero(obj):
return obj.is_true()
diff --git a/pypy/config/translationoption.py b/pypy/config/translationoption.py
--- a/pypy/config/translationoption.py
+++ b/pypy/config/translationoption.py
@@ -118,7 +118,7 @@
("translation.gcrootfinder", DEFL_ROOTFINDER_WITHJIT),
("translation.list_comprehension_operations", True)]),
ChoiceOption("jit_backend", "choose the backend for the JIT",
- ["auto", "x86", "x86-without-sse2", "llvm", 'arm'],
+ ["auto", "x86", "x86-without-sse2", 'arm'],
default="auto", cmdline="--jit-backend"),
ChoiceOption("jit_profiler", "integrate profiler support into the JIT",
["off", "oprofile"],
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -38,6 +38,8 @@
.. branch: numpypy-complex2
Complex dtype support for numpy
+.. branch: numpypy-problems
+Improve dtypes intp, uintp, void, string and record
.. branch: kill-someobject
major cleanups including killing some object support
diff --git a/pypy/jit/backend/detect_cpu.py b/pypy/jit/backend/detect_cpu.py
--- a/pypy/jit/backend/detect_cpu.py
+++ b/pypy/jit/backend/detect_cpu.py
@@ -77,8 +77,6 @@
return "pypy.jit.backend.x86.runner", "CPU_X86_64"
elif backend_name == 'cli':
return "pypy.jit.backend.cli.runner", "CliCPU"
- elif backend_name == 'llvm':
- return "pypy.jit.backend.llvm.runner", "LLVMCPU"
elif backend_name == 'arm':
return "pypy.jit.backend.arm.runner", "CPU_ARM"
elif backend_name == 'armhf':
diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -62,6 +62,7 @@
'flexible': 'interp_boxes.W_FlexibleBox',
'character': 'interp_boxes.W_CharacterBox',
'str_': 'interp_boxes.W_StringBox',
+ 'string_': 'interp_boxes.W_StringBox',
'unicode_': 'interp_boxes.W_UnicodeBox',
'void': 'interp_boxes.W_VoidBox',
'complexfloating': 'interp_boxes.W_ComplexFloatingBox',
diff --git a/pypy/module/micronumpy/arrayimpl/voidbox.py b/pypy/module/micronumpy/arrayimpl/voidbox.py
--- a/pypy/module/micronumpy/arrayimpl/voidbox.py
+++ b/pypy/module/micronumpy/arrayimpl/voidbox.py
@@ -6,6 +6,7 @@
def __init__(self, size, dtype):
self.storage = alloc_raw_storage(size)
self.dtype = dtype
+ self.size = size
def __del__(self):
free_raw_storage(self.storage)
diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -246,7 +246,11 @@
except KeyError:
raise OperationError(space.w_IndexError,
space.wrap("Field %s does not exist" % item))
- return dtype.itemtype.read(self.arr, self.ofs, ofs, dtype)
+ read_val = dtype.itemtype.read(self.arr, self.ofs, ofs, dtype)
+ if isinstance (read_val, W_StringBox):
+ # StringType returns a str
+ return space.wrap(dtype.itemtype.to_str(read_val))
+ return read_val
@unwrap_spec(item=str)
def descr_setitem(self, space, item, w_value):
@@ -271,6 +275,13 @@
arr.storage[i] = arg[i]
return W_StringBox(arr, 0, arr.dtype)
+ # Running entire test suite needs this function to succeed,
+ # running single test_stringarray succeeds without it.
+ # With convert_to() test_ztranslation fails since
+ # W_CharacterBox is not a W_GenericBox.
+ # Why is it needed for multiple tests?
+ #def convert_to(self, dtype):
+ # xxx
class W_UnicodeBox(W_CharacterBox):
def descr__new__unicode_box(space, w_subtype, w_arg):
@@ -474,6 +485,7 @@
W_VoidBox.typedef = TypeDef("void", W_FlexibleBox.typedef,
__module__ = "numpypy",
+ __new__ = interp2app(W_VoidBox.descr__new__.im_func),
__getitem__ = interp2app(W_VoidBox.descr_getitem),
__setitem__ = interp2app(W_VoidBox.descr_setitem),
)
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -8,6 +8,7 @@
from pypy.module.micronumpy import types, interp_boxes
from pypy.rlib.objectmodel import specialize
from pypy.rlib.rarithmetic import LONG_BIT, r_longlong, r_ulonglong
+from pypy.rpython.lltypesystem import rffi
UNSIGNEDLTR = "u"
@@ -17,6 +18,8 @@
VOIDLTR = 'V'
STRINGLTR = 'S'
UNICODELTR = 'U'
+INTPLTR = 'p'
+UINTPLTR = 'P'
def decode_w_dtype(space, w_dtype):
if space.is_none(w_dtype):
@@ -66,11 +69,16 @@
def fill(self, storage, box, start, stop):
self.itemtype.fill(storage, self.get_size(), box, start, stop, 0)
+ def get_name(self):
+ if self.char == 'S':
+ return '|S' + str(self.get_size())
+ return self.name
+
def descr_str(self, space):
- return space.wrap(self.name)
+ return space.wrap(self.get_name())
def descr_repr(self, space):
- return space.wrap("dtype('%s')" % self.name)
+ return space.wrap("dtype('%s')" % self.get_name())
def descr_get_itemsize(self, space):
return space.wrap(self.itemtype.get_element_size())
@@ -135,6 +143,9 @@
def is_record_type(self):
return self.fields is not None
+ def is_flexible_type(self):
+ return (self.num == 18 or self.num == 19 or self.num == 20)
+
def __repr__(self):
if self.fields is not None:
return '<DType %r>' % self.fields
@@ -454,6 +465,35 @@
#alternate_constructors=[space.w_buffer],
# XXX no buffer in space
)
+ ptr_size = rffi.sizeof(rffi.CCHARP)
+ if ptr_size == 4:
+ intp_box = interp_boxes.W_Int32Box
+ intp_type = types.Int32()
+ uintp_box = interp_boxes.W_UInt32Box
+ uintp_type = types.UInt32()
+ elif ptr_size == 8:
+ intp_box = interp_boxes.W_Int64Box
+ intp_type = types.Int64()
+ uintp_box = interp_boxes.W_UInt64Box
+ uintp_type = types.UInt64()
+ else:
+ raise ValueError('unknown point size %d' % ptr_size)
+ self.w_intpdtype = W_Dtype(
+ intp_type,
+ num=5,
+ kind=INTPLTR,
+ name='intp',
+ char=INTPLTR,
+ w_box_type = space.gettypefor(intp_box),
+ )
+ self.w_uintpdtype = W_Dtype(
+ uintp_type,
+ num=6,
+ kind=UINTPLTR,
+ name='uintp',
+ char=UINTPLTR,
+ w_box_type = space.gettypefor(uintp_box),
+ )
self.builtin_dtypes = [
self.w_booldtype, self.w_int8dtype, self.w_uint8dtype,
self.w_int16dtype, self.w_uint16dtype, self.w_int32dtype,
@@ -462,7 +502,7 @@
self.w_float32dtype, self.w_float64dtype, self.w_complex64dtype,
self.w_complex128dtype,
self.w_stringdtype, self.w_unicodedtype,
- self.w_voiddtype,
+ self.w_voiddtype, self.w_intpdtype, self.w_uintpdtype,
]
self.float_dtypes_by_num_bytes = sorted(
(dtype.itemtype.get_element_size(), dtype)
@@ -504,7 +544,8 @@
#'CDOUBLE',
#'DATETIME',
'UINT': self.w_uint32dtype,
- 'INTP': self.w_longdtype,
+ 'INTP': self.w_intpdtype,
+ 'UINTP': self.w_uintpdtype,
#'HALF',
'BYTE': self.w_int8dtype,
#'CFLOAT': ,
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -150,6 +150,9 @@
"supported for binary functions"))
assert isinstance(self, W_Ufunc2)
obj = convert_to_array(space, w_obj)
+ if obj.get_dtype().is_flexible_type():
+ raise OperationError(space.w_TypeError,
+ space.wrap('cannot perform reduce for flexible type'))
obj_shape = obj.get_shape()
if obj.is_scalar():
return obj.get_scalar_value()
@@ -235,6 +238,9 @@
if space.is_w(out, space.w_None):
out = None
w_obj = convert_to_array(space, w_obj)
+ if w_obj.get_dtype().is_flexible_type():
+ raise OperationError(space.w_TypeError,
+ space.wrap('Not implemented for this type'))
calc_dtype = find_unaryop_result_dtype(space,
w_obj.get_dtype(),
promote_to_float=self.promote_to_float,
@@ -301,6 +307,10 @@
w_out = None
w_lhs = convert_to_array(space, w_lhs)
w_rhs = convert_to_array(space, w_rhs)
+ if w_lhs.get_dtype().is_flexible_type() or \
+ w_rhs.get_dtype().is_flexible_type():
+ raise OperationError(space.w_TypeError,
+ space.wrap('unsupported operand types'))
calc_dtype = find_binop_result_dtype(space,
w_lhs.get_dtype(), w_rhs.get_dtype(),
int_only=self.int_only,
@@ -447,6 +457,7 @@
int64_dtype = interp_dtype.get_dtype_cache(space).w_int64dtype
complex_type = interp_dtype.get_dtype_cache(space).w_complex128dtype
float_type = interp_dtype.get_dtype_cache(space).w_float64dtype
+ str_dtype = interp_dtype.get_dtype_cache(space).w_stringdtype
if isinstance(w_obj, interp_boxes.W_GenericBox):
dtype = w_obj.get_dtype(space)
if current_guess is None:
@@ -473,6 +484,15 @@
current_guess is complex_type or current_guess is float_type):
return complex_type
return current_guess
+ elif space.isinstance_w(w_obj, space.w_str):
+ if (current_guess is None):
+ return interp_dtype.variable_dtype(space,
+ 'S%d' % space.len_w(w_obj))
+ elif current_guess.num ==18:
+ if current_guess.itemtype.get_size() < space.len_w(w_obj):
+ return interp_dtype.variable_dtype(space,
+ 'S%d' % space.len_w(w_obj))
+ return current_guess
if current_guess is complex_type:
return complex_type
return interp_dtype.get_dtype_cache(space).w_float64dtype
diff --git a/pypy/module/micronumpy/stdobjspace.py b/pypy/module/micronumpy/stdobjspace.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/micronumpy/stdobjspace.py
@@ -0,0 +1,11 @@
+
+from pypy.objspace.std import stringobject
+from pypy.module.micronumpy import interp_boxes
+
+def delegate_stringbox2stringobj(space, w_box):
+ return space.wrap(w_box.dtype.itemtype.to_str(w_box))
+
+def register_delegates(typeorder):
+ typeorder[interp_boxes.W_StringBox] = [
+ (stringobject.W_StringObject, delegate_stringbox2stringobj),
+ ]
diff --git a/pypy/module/micronumpy/test/test_dtypes.py b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -31,6 +31,8 @@
from _numpypy import dtype
assert dtype(bool).num == 0
+ assert dtype('intp').num == 5
+ assert dtype('uintp').num == 6
assert dtype(int).num == 7
assert dtype(long).num == 9
assert dtype(float).num == 12
@@ -176,10 +178,15 @@
def test_cant_subclass(self):
from _numpypy import dtype
-
# You can't subclass dtype
raises(TypeError, type, "Foo", (dtype,), {})
+ def test_can_subclass(self):
+ import _numpypy
+ class xyz(_numpypy.void):
+ pass
+ assert True
+
def test_aliases(self):
from _numpypy import dtype
@@ -228,6 +235,17 @@
class AppTestTypes(BaseNumpyAppTest):
+ def setup_class(cls):
+ BaseNumpyAppTest.setup_class.im_func(cls)
+ if option.runappdirect:
+ import platform
+ bits, linkage = platform.architecture()
+ ptr_size = int(bits[:-3]) // 8
+ else:
+ from pypy.rpython.lltypesystem import rffi
+ ptr_size = rffi.sizeof(rffi.CCHARP)
+ cls.w_ptr_size = cls.space.wrap(ptr_size)
+
def test_abstract_types(self):
import _numpypy as numpy
raises(TypeError, numpy.generic, 0)
@@ -269,7 +287,9 @@
def test_int8(self):
import _numpypy as numpy
- assert numpy.int8.mro() == [numpy.int8, numpy.signedinteger, numpy.integer, numpy.number, numpy.generic, object]
+ assert numpy.int8.mro() == [numpy.int8, numpy.signedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, object]
a = numpy.array([1, 2, 3], numpy.int8)
assert type(a[1]) is numpy.int8
@@ -291,7 +311,9 @@
def test_uint8(self):
import _numpypy as numpy
- assert numpy.uint8.mro() == [numpy.uint8, numpy.unsignedinteger, numpy.integer, numpy.number, numpy.generic, object]
+ assert numpy.uint8.mro() == [numpy.uint8, numpy.unsignedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, object]
a = numpy.array([1, 2, 3], numpy.uint8)
assert type(a[1]) is numpy.uint8
@@ -361,16 +383,22 @@
import _numpypy as numpy
assert numpy.int_ is numpy.dtype(int).type
- assert numpy.int_.mro() == [numpy.int_, numpy.signedinteger, numpy.integer, numpy.number, numpy.generic, int, object]
+ assert numpy.int_.mro() == [numpy.int_, numpy.signedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, int, object]
def test_int64(self):
import sys
import _numpypy as numpy
if sys.maxint == 2 ** 63 -1:
- assert numpy.int64.mro() == [numpy.int64, numpy.signedinteger, numpy.integer, numpy.number, numpy.generic, int, object]
+ assert numpy.int64.mro() == [numpy.int64, numpy.signedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, int, object]
else:
- assert numpy.int64.mro() == [numpy.int64, numpy.signedinteger, numpy.integer, numpy.number, numpy.generic, object]
+ assert numpy.int64.mro() == [numpy.int64, numpy.signedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, object]
assert numpy.dtype(numpy.int64).type is numpy.int64
assert numpy.int64(3) == 3
@@ -385,7 +413,9 @@
import sys
import _numpypy as numpy
- assert numpy.uint64.mro() == [numpy.uint64, numpy.unsignedinteger, numpy.integer, numpy.number, numpy.generic, object]
+ assert numpy.uint64.mro() == [numpy.uint64, numpy.unsignedinteger,
+ numpy.integer, numpy.number,
+ numpy.generic, object]
assert numpy.dtype(numpy.uint64).type is numpy.uint64
skip("see comment")
@@ -400,7 +430,9 @@
def test_float32(self):
import _numpypy as numpy
- assert numpy.float32.mro() == [numpy.float32, numpy.floating, numpy.inexact, numpy.number, numpy.generic, object]
+ assert numpy.float32.mro() == [numpy.float32, numpy.floating,
+ numpy.inexact, numpy.number,
+ numpy.generic, object]
assert numpy.float32(12) == numpy.float64(12)
assert numpy.float32('23.4') == numpy.float32(23.4)
@@ -409,7 +441,9 @@
def test_float64(self):
import _numpypy as numpy
- assert numpy.float64.mro() == [numpy.float64, numpy.floating, numpy.inexact, numpy.number, numpy.generic, float, object]
+ assert numpy.float64.mro() == [numpy.float64, numpy.floating,
+ numpy.inexact, numpy.number,
+ numpy.generic, float, object]
a = numpy.array([1, 2, 3], numpy.float64)
assert type(a[1]) is numpy.float64
@@ -508,15 +542,16 @@
def test_various_types(self):
import _numpypy as numpy
- import sys
assert numpy.int16 is numpy.short
assert numpy.int8 is numpy.byte
assert numpy.bool_ is numpy.bool8
- if sys.maxint == (1 << 63) - 1:
- assert '%r' % numpy.intp == '%r' % numpy.int64
- else:
- assert '%r' % numpy.intp == '%r' % numpy.int32
+ if self.ptr_size == 4:
+ assert numpy.intp is numpy.int32
+ assert numpy.uintp is numpy.uint32
+ elif self.ptr_size == 8:
+ assert numpy.intp is numpy.int64
+ assert numpy.uintp is numpy.uint64
def test_mro(self):
import _numpypy as numpy
@@ -562,6 +597,11 @@
assert dtype('=i8').byteorder == '='
assert dtype(byteorder + 'i8').byteorder == '='
+ def test_intp(self):
+ from _numpypy import dtype
+ assert dtype('p') == dtype('intp')
+ assert dtype('P') == dtype('uintp')
+
def test_alignment(self):
from _numpypy import dtype
assert dtype('i4').alignment == 4
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -2245,7 +2245,49 @@
assert arr[1]['y']['y'] == 3.5
assert arr[1]['y']['x'] == 0.0
assert arr[1]['x'] == 15
-
+
+ def test_string_record(self):
+ from _numpypy import dtype, array
+ d = dtype([('x', str), ('y', 'int32')])
+ assert d.fields['x'] == (dtype(str), 0)
+ assert d.fields['y'] == (dtype('int32'), 1)
+ d = dtype([('x', 'S1'), ('y', 'int32')])
+ assert d.fields['x'] == (dtype(str), 0)
+ assert d.fields['y'] == (dtype('int32'), 1)
+ a = array([('a', 2), ('c', 1)], dtype=d)
+ assert a[1]['y'] == 1
+ assert a[0]['x'] == 'a'
+
+ def test_stringarray(self):
+ from _numpypy import array, flexible
+ a = array(['abc'],'S3')
+ assert str(a.dtype) == '|S3'
+ a = array(['abc'])
+ assert str(a.dtype) == '|S3'
+ a = array(['abc','defg','ab'])
+ assert str(a.dtype) == '|S4'
+ assert a[0] == 'abc'
+ assert a[1] == 'defg'
+ assert a[2] == 'ab'
+ raises(TypeError, a, 'sum')
+ raises(TypeError, 'a+a')
+
+ def test_flexible_repr(self):
+ # import overrides str(), repr() for array
+ from numpypy.core import arrayprint
+ from _numpypy import array
+ a = array(['abc'],'S3')
+ s = repr(a)
+ # simplify test for \n in repr
+ assert s.replace('\n', '') == "array(['abc'], dtype='|S3')"
+ # but make sure it exists
+ assert s.find('\n') == 15
+ a = array(['abc','defg','ab'])
+ s = repr(a)
+ assert s.replace('\n', '') == \
+ "array(['abc', 'defg', 'ab'], dtype='|S4')"
+
+
class AppTestPyPy(BaseNumpyAppTest):
def setup_class(cls):
if option.runappdirect and '__pypy__' not in sys.builtin_module_names:
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
@@ -16,6 +16,7 @@
from pypy.rlib.rstruct.runpack import runpack
from pypy.tool.sourcetools import func_with_new_name
from pypy.rlib import jit
+from pypy.rlib.rstring import StringBuilder
degToRad = math.pi / 180.0
@@ -1464,9 +1465,53 @@
def get_element_size(self):
return self.size * rffi.sizeof(self.T)
+ def get_size(self):
+ return self.size
+
class StringType(BaseType, BaseStringType):
T = lltype.Char
+ @jit.unroll_safe
+ def coerce(self, space, dtype, w_item):
+ from pypy.module.micronumpy.interp_dtype import new_string_dtype
+ arg = space.str_w(space.str(w_item))
+ arr = interp_boxes.VoidBoxStorage(len(arg), new_string_dtype(space, len(arg)))
+ for i in range(len(arg)):
+ arr.storage[i] = arg[i]
+ return interp_boxes.W_StringBox(arr, 0, None)
+
+ @jit.unroll_safe
+ def store(self, arr, i, offset, box):
+ assert isinstance(box, interp_boxes.W_StringBox)
+ for k in range(min(self.size, box.arr.size-offset)):
+ arr.storage[k + i] = box.arr.storage[k + offset]
+
+ def read(self, arr, i, offset, dtype=None):
+ if dtype is None:
+ dtype = arr.dtype
+ return interp_boxes.W_StringBox(arr, i + offset, dtype)
+
+ @jit.unroll_safe
+ def to_str(self, item):
+ builder = StringBuilder()
+ assert isinstance(item, interp_boxes.W_StringBox)
+ i = item.ofs
+ end = i+self.size
+ while i < end:
+ assert isinstance(item.arr.storage[i], str)
+ if item.arr.storage[i] == '\x00':
+ break
+ builder.append(item.arr.storage[i])
+ i += 1
+ return builder.build()
+
+ def str_format(self, item):
+ builder = StringBuilder()
+ builder.append("'")
+ builder.append(self.to_str(item))
+ builder.append("'")
+ return builder.build()
+
class VoidType(BaseType, BaseStringType):
T = lltype.Char
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -182,6 +182,10 @@
(complexobject.W_ComplexObject, smallintobject.delegate_SmallInt2Complex),
]
+ if config.objspace.usemodules.micronumpy:
+ from pypy.module.micronumpy.stdobjspace import register_delegates
+ register_delegates(self.typeorder)
+
self.typeorder[boolobject.W_BoolObject] += [
(intobject.W_IntObject, boolobject.delegate_Bool2IntObject),
(floatobject.W_FloatObject, floatobject.delegate_Bool2Float),
More information about the pypy-commit
mailing list