[pypy-svn] r30024 - pypy/dist/pypy/rpython/numpy

simonb at codespeak.net simonb at codespeak.net
Thu Jul 13 18:56:29 CEST 2006


Author: simonb
Date: Thu Jul 13 18:56:21 2006
New Revision: 30024

Added:
   pypy/dist/pypy/rpython/numpy/rarray.py
Log:
whoops: added missing file

Added: pypy/dist/pypy/rpython/numpy/rarray.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/numpy/rarray.py	Thu Jul 13 18:56:21 2006
@@ -0,0 +1,101 @@
+from pypy.rpython.rmodel import Repr, inputconst
+from pypy.rpython.rrange import AbstractRangeRepr
+from pypy.rpython.rint import IntegerRepr
+from pypy.rpython.rlist import AbstractBaseListRepr
+from pypy.rpython.error import TyperError
+from pypy.rpython.lltypesystem import lltype, llmemory
+from pypy.rpython.lltypesystem.lltype import \
+     GcArray, GcStruct, Signed, Ptr, Unsigned, malloc, Void
+from pypy.annotation.model import SomeInteger
+from pypy.rpython.numpy.aarray import SomeArray
+from pypy.annotation.pairtype import pairtype
+
+
+class ArrayRepr(Repr):
+    def __init__(self, rtyper, s_array):
+        self.s_value = s_array.get_item_type()
+        self.item_repr = rtyper.getrepr(self.s_value)
+        ITEM = self.item_repr.lowleveltype
+        ITEMARRAY = GcArray(ITEM)
+        self.ARRAY = Ptr(
+            GcStruct( "array",
+#                ("length", Signed),
+                ("data", Ptr(ITEMARRAY))))
+        self.lowleveltype = self.ARRAY
+
+    def allocate_instance(self, llops, v_array):
+        c1 = inputconst(lltype.Void, self.lowleveltype.TO) 
+        return llops.gendirectcall(ll_allocate, c1, v_array)
+
+class __extend__(SomeArray):
+    def rtyper_makerepr(self, rtyper):
+        return ArrayRepr( rtyper, self )
+
+    def rtyper_makekey(self):
+        return self.__class__, self.knowntype
+
+class __extend__(pairtype(ArrayRepr,ArrayRepr)):
+    def rtype_add((r_arr1,r_arr2), hop):
+        v_arr1, v_arr2 = hop.inputargs(r_arr1, r_arr2)
+        cARRAY = hop.inputconst(Void, hop.r_result.ARRAY.TO)
+        return hop.gendirectcall(ll_add, cARRAY, v_arr1, v_arr2)
+
+
+class __extend__(pairtype(ArrayRepr,IntegerRepr)):
+    def rtype_setitem((r_arr,r_int), hop):
+        v_array, v_index, v_item = hop.inputargs(r_arr, Signed, r_arr.item_repr)
+        return hop.gendirectcall(ll_setitem, v_array, v_index, v_item)
+
+    def rtype_getitem((r_arr,r_int), hop):
+        v_array, v_index = hop.inputargs(r_arr, Signed)
+        return hop.gendirectcall(ll_getitem, v_array, v_index)
+
+class __extend__(pairtype(AbstractBaseListRepr, ArrayRepr)):
+    def convert_from_to((r_lst, r_arr), v, llops):
+        if r_lst.listitem is None:
+            return NotImplemented
+        if r_lst.item_repr != r_arr.item_repr:
+            return NotImplemented
+        c1 = inputconst(lltype.Void, r_arr.lowleveltype.TO) 
+        return llops.gendirectcall(ll_build_array, c1, v)
+
+class __extend__(pairtype(AbstractRangeRepr, ArrayRepr)):
+    def convert_from_to((r_rng, r_arr), v, llops):
+        c1 = inputconst(lltype.Void, r_arr.lowleveltype.TO) 
+        return llops.gendirectcall(ll_build_array, c1, v)
+
+def ll_build_array(ARRAY, lst):
+    size = lst.ll_length()
+    array = malloc(ARRAY)
+    data = array.data = malloc(ARRAY.data.TO, size)
+    i = 0
+    while i < size:
+        data[i] = lst.ll_getitem_fast(i)
+        i += 1
+    return array
+
+def ll_allocate(ARRAY, array):
+    new_array = malloc(ARRAY)
+    new_array.data = array.data
+    return new_array
+
+def ll_setitem(l, index, item):
+    l.data[index] = item
+
+def ll_getitem(l, index):
+    return l.data[index]
+
+def ll_add(ARRAY, a1, a2):
+    size = len(a1.data)
+    if size != len(a2.data):
+        raise ValueError
+    array = malloc(ARRAY)
+    array.data = malloc(ARRAY.data.TO, size)
+    i = 0
+    while i < size:
+        array.data[i] = a1.data[i] + a2.data[i]
+        i += 1
+    return array
+
+
+



More information about the Pypy-commit mailing list