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

Reply via email to