Author: Alex Gaynor <[email protected]>
Branch: numpy-dtype-refactor
Changeset: r49287:b8595c5ed572
Date: 2011-11-10 14:07 -0500
http://bitbucket.org/pypy/pypy/changeset/b8595c5ed572/
Log: tons more box types, and some methods on them
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -338,7 +338,7 @@
elif isinstance(w_res, BoolObject):
dtype = interp.space.fromcache(W_BoolDtype)
elif isinstance(w_res, interp_boxes.W_GenericBox):
- dtype = w_res.descr_get_dtype(interp.space)
+ dtype = w_res.get_dtype(interp.space)
else:
dtype = None
return scalar_w(interp.space, dtype, w_res)
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
@@ -1,13 +1,38 @@
from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.gateway import interp2app
from pypy.interpreter.typedef import TypeDef
from pypy.objspace.std.inttype import int_typedef
from pypy.rlib.rarithmetic import LONG_BIT
+from pypy.tool.sourcetools import func_with_new_name
MIXIN_64 = (int_typedef,) if LONG_BIT == 64 else ()
+def dtype_getter(name):
+ @staticmethod
+ def get_dtype(space):
+ from pypy.module.micronumpy.interp_dtype import get_dtype_cache
+ return getattr(get_dtype_cache(space), "w_%sdtype" % name)
+ return get_dtype
+
class W_GenericBox(Wrappable):
- pass
+ def descr_repr(self, space):
+ return space.wrap(self.get_dtype(space).itemtype.str_format(self))
+
+ def descr_int(self, space):
+ return space.wrap(self.convert_to(W_LongBox.get_dtype(space)).value)
+
+ def descr_float(self, space):
+ return space.wrap(self.convert_to(W_Float64Box.get_dtype(space)).value)
+
+ def _binop_impl(ufunc_name):
+ def impl(self, space, w_other):
+ from pypy.module.micronumpy import interp_ufuncs
+ return getattr(interp_ufuncs.get(space), ufunc_name).call(space,
[self, w_other])
+ return func_with_new_name(impl, "binop_%s_impl" % ufunc_name)
+
+ descr_eq = _binop_impl("equal")
+
class W_BoolBox(Wrappable):
def __init__(self, value):
@@ -26,10 +51,37 @@
class W_SignedIntegerBox(W_IntegerBox):
pass
+class W_UnsignedIntgerBox(W_IntegerBox):
+ pass
+
+class W_Int8Box(W_SignedIntegerBox):
+ pass
+
+class W_UInt8Box(W_UnsignedIntgerBox):
+ pass
+
+class W_Int16Box(W_SignedIntegerBox):
+ pass
+
+class W_UInt16Box(W_UnsignedIntgerBox):
+ pass
+
+class W_Int32Box(W_SignedIntegerBox):
+ pass
+
+class W_UInt32Box(W_UnsignedIntgerBox):
+ pass
+
class W_LongBox(W_SignedIntegerBox):
+ get_dtype = dtype_getter("long")
+
+class W_ULongBox(W_UnsignedIntgerBox):
pass
class W_Int64Box(W_SignedIntegerBox):
+ get_dtype = dtype_getter("int64")
+
+class W_UInt64Box(W_UnsignedIntgerBox):
pass
class W_InexactBox(W_NumberBox):
@@ -38,13 +90,23 @@
class W_FloatingBox(W_InexactBox):
pass
+class W_Float32Box(W_FloatingBox):
+ pass
+
class W_Float64Box(W_FloatingBox):
- def descr_get_dtype(self, space):
- from pypy.module.micronumpy.interp_dtype import get_dtype_cache
- return get_dtype_cache(space).w_float64dtype
+ get_dtype = dtype_getter("float64")
+
+
W_GenericBox.typedef = TypeDef("generic",
__module__ = "numpy",
+
+ __repr__ = interp2app(W_GenericBox.descr_repr),
+ __int__ = interp2app(W_GenericBox.descr_int),
+ __float__ = interp2app(W_GenericBox.descr_float),
+
+ __eq__ = interp2app(W_GenericBox.descr_eq),
+
)
W_BoolBox.typedef = TypeDef("bool_", W_GenericBox.typedef,
@@ -63,7 +125,6 @@
__module__ = "numpy",
)
-# XXX: fix for 32bit
if LONG_BIT == 32:
long_name = "int32"
elif LONG_BIT == 64:
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
@@ -1,7 +1,7 @@
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import interp2app
-from pypy.interpreter.typedef import TypeDef, interp_attrproperty
+from pypy.interpreter.typedef import TypeDef, GetSetProperty,
interp_attrproperty
from pypy.module.micronumpy import types, signature
from pypy.rlib.objectmodel import specialize
from pypy.rlib.rarithmetic import LONG_BIT
@@ -47,6 +47,10 @@
struct_ptr = rffi.ptradd(storage, i * self.itemtype.get_element_size())
self.itemtype.store(struct_ptr, 0, box)
+ def fill(self, storage, box, start, stop):
+ start_ptr = rffi.ptradd(storage, start *
self.itemtype.get_element_size())
+ self.itemtype.fill(start_ptr, box, stop - start)
+
def descr__new__(space, w_subtype, w_dtype):
cache = get_dtype_cache(space)
@@ -71,6 +75,9 @@
def descr_repr(self, space):
return space.wrap("dtype('%s')" % self.name)
+ def descr_get_itemsize(self, space):
+ return space.wrap(self.itemtype.get_element_size())
+
W_Dtype.typedef = TypeDef("dtype",
__module__ = "numpy",
__new__ = interp2app(W_Dtype.descr__new__.im_func),
@@ -80,6 +87,7 @@
num = interp_attrproperty("num", cls=W_Dtype),
kind = interp_attrproperty("kind", cls=W_Dtype),
+ itemsize = GetSetProperty(W_Dtype.descr_get_itemsize),
)
class DtypeCache(object):
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -566,7 +566,7 @@
)
arr = SingleDimArray(size, dtype=dtype)
- one = dtype.adapt_val(1)
+ one = dtype.box(1)
arr.dtype.fill(arr.storage, one, 0, size)
return space.wrap(arr)
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
@@ -141,7 +141,7 @@
promote_bools=self.promote_bools,
)
if self.comparison_func:
- res_dtype = space.fromcache(interp_dtype.W_BoolDtype)
+ res_dtype = interp_dtype.get_dtype_cache(space).w_booldtype
else:
res_dtype = calc_dtype
if isinstance(w_lhs, Scalar) and isinstance(w_rhs, Scalar):
@@ -243,9 +243,9 @@
return dt
def find_dtype_for_scalar(space, w_obj, current_guess=None):
- bool_dtype = space.fromcache(interp_dtype.W_BoolDtype)
- long_dtype = space.fromcache(interp_dtype.W_LongDtype)
- int64_dtype = space.fromcache(interp_dtype.W_Int64Dtype)
+ bool_dtype = interp_dtype.get_dtype_cache(space).w_booldtype
+ long_dtype = interp_dtype.get_dtype_cache(space).w_longdtype
+ int64_dtype = interp_dtype.get_dtype_cache(space).w_int64dtype
if space.isinstance_w(w_obj, space.w_bool):
if current_guess is None or current_guess is bool_dtype:
@@ -261,7 +261,7 @@
current_guess is long_dtype or current_guess is int64_dtype):
return int64_dtype
return current_guess
- return space.fromcache(interp_dtype.W_Float64Dtype)
+ return interp_dtype.get_dtype_cache(space).w_float64dtype
def ufunc_dtype_caller(space, ufunc_name, op_name, argcount, comparison_func):
@@ -273,9 +273,8 @@
def impl(res_dtype, lvalue, rvalue):
res = getattr(res_dtype.itemtype, op_name)(lvalue, rvalue)
if comparison_func:
- booldtype = space.fromcache(interp_dtype.W_BoolDtype)
- assert isinstance(booldtype, interp_dtype.W_BoolDtype)
- res = booldtype.box(res)
+ bool_dtype = interp_dtype.get_dtype_cache(space).w_booldtype
+ res = bool_dtype.box(res)
return res
return func_with_new_name(impl, ufunc_name)
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
@@ -25,6 +25,11 @@
return box.value
def coerce(self, space, w_item):
+ if isinstance(w_item, self.BoxType):
+ return w_item
+ return self._coerce(space, w_item)
+
+ def _coerce(self, space, w_item):
raise NotImplementedError
def read(self, ptr, offset):
@@ -38,9 +43,18 @@
ptr = rffi.ptradd(ptr, offset)
rffi.cast(lltype.Ptr(lltype.Array(self.T, hints={"nolength": True})),
ptr)[0] = value
+ def fill(self, ptr, box, n):
+ value = self.unbox(box)
+ for i in xrange(n):
+ rffi.cast(lltype.Ptr(lltype.Array(self.T, hints={"nolength":
True})), ptr)[0] = value
+ ptr = rffi.ptradd(ptr, self.get_element_size())
+
def add(self, v1, v2):
return self.box(self.unbox(v1) + self.unbox(v2))
+ def eq(self, v1, v2):
+ return self.unbox(v1) == self.unbox(v2)
+
def max(self, v1, v2):
return self.box(max(self.unbox(v1), self.unbox(v2)))
@@ -61,55 +75,68 @@
else:
return self.False
- def coerce(self, space, w_item):
+ def _coerce(self, space, w_item):
return self.box(space.is_true(w_item))
class Integer(Primitive):
- def coerce(self, space, w_item):
+ def _coerce(self, space, w_item):
return self.box(space.int_w(space.int(w_item)))
-class Int8(Primitive):
+ def str_format(self, box):
+ value = self.unbox(box)
+ return str(value)
+
+class Int8(Integer):
T = rffi.SIGNEDCHAR
+ BoxType = interp_boxes.W_Int8Box
-class UInt8(Primitive):
+class UInt8(Integer):
T = rffi.UCHAR
+ BoxType = interp_boxes.W_UInt8Box
-class Int16(Primitive):
+class Int16(Integer):
T = rffi.SHORT
+ BoxType = interp_boxes.W_Int16Box
-class UInt16(Primitive):
+class UInt16(Integer):
T = rffi.USHORT
+ BoxType = interp_boxes.W_UInt16Box
-class Int32(Primitive):
+class Int32(Integer):
T = rffi.INT
+ BoxType = interp_boxes.W_Int32Box
-class UInt32(Primitive):
+class UInt32(Integer):
T = rffi.UINT
+ BoxType = interp_boxes.W_UInt32Box
-class Long(Primitive):
+class Long(Integer):
T = rffi.LONG
BoxType = interp_boxes.W_LongBox
-class ULong(Primitive):
+class ULong(Integer):
T = rffi.ULONG
+ BoxType = interp_boxes.W_ULongBox
class Int64(Integer):
T = rffi.LONGLONG
BoxType = interp_boxes.W_Int64Box
-class UInt64(Primitive):
+class UInt64(Integer):
T = rffi.ULONGLONG
+ BoxType = interp_boxes.W_UInt64Box
class Float(Primitive):
- def coerce(self, space, w_item):
+ def _coerce(self, space, w_item):
return self.box(space.float_w(space.float(w_item)))
def str_format(self, box):
value = self.unbox(box)
return float2string(value, "g", rfloat.DTSF_STR_PRECISION)
-class Float32(Primitive):
+class Float32(Float):
T = rffi.FLOAT
+ BoxType = interp_boxes.W_Float32Box
class Float64(Float):
T = rffi.DOUBLE
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit