~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to pypy/rpython/numpy/rarray.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from pypy.rpython.rmodel import Repr, inputconst
 
2
from pypy.rpython.rrange import AbstractRangeRepr
 
3
from pypy.rpython.rint import IntegerRepr
 
4
from pypy.rpython.rlist import AbstractBaseListRepr
 
5
from pypy.rpython.error import TyperError
 
6
from pypy.rpython.lltypesystem import lltype, llmemory
 
7
from pypy.rpython.lltypesystem.lltype import \
 
8
     GcArray, GcStruct, Signed, Ptr, Unsigned, malloc, Void
 
9
from pypy.annotation.model import SomeInteger
 
10
from pypy.rpython.numpy.aarray import SomeArray
 
11
from pypy.annotation.pairtype import pairtype
 
12
 
 
13
 
 
14
class ArrayRepr(Repr):
 
15
    def __init__(self, rtyper, s_array):
 
16
        self.s_value = s_array.get_item_type()
 
17
        self.item_repr = rtyper.getrepr(self.s_value)
 
18
        ITEM = self.item_repr.lowleveltype
 
19
        ITEMARRAY = GcArray(ITEM)
 
20
        self.ARRAY = Ptr(
 
21
            GcStruct( "array",
 
22
#                ("length", Signed),
 
23
                ("data", Ptr(ITEMARRAY))))
 
24
        self.lowleveltype = self.ARRAY
 
25
 
 
26
    def allocate_instance(self, llops, v_array):
 
27
        c1 = inputconst(lltype.Void, self.lowleveltype.TO) 
 
28
        return llops.gendirectcall(ll_allocate, c1, v_array)
 
29
 
 
30
class __extend__(SomeArray):
 
31
    def rtyper_makerepr(self, rtyper):
 
32
        return ArrayRepr( rtyper, self )
 
33
 
 
34
    def rtyper_makekey(self):
 
35
        return self.__class__, self.knowntype
 
36
 
 
37
class __extend__(pairtype(ArrayRepr,ArrayRepr)):
 
38
    def rtype_add((r_arr1,r_arr2), hop):
 
39
        v_arr1, v_arr2 = hop.inputargs(r_arr1, r_arr2)
 
40
        cARRAY = hop.inputconst(Void, hop.r_result.ARRAY.TO)
 
41
        return hop.gendirectcall(ll_add, cARRAY, v_arr1, v_arr2)
 
42
 
 
43
 
 
44
class __extend__(pairtype(ArrayRepr,IntegerRepr)):
 
45
    def rtype_setitem((r_arr,r_int), hop):
 
46
        v_array, v_index, v_item = hop.inputargs(r_arr, Signed, r_arr.item_repr)
 
47
        return hop.gendirectcall(ll_setitem, v_array, v_index, v_item)
 
48
 
 
49
    def rtype_getitem((r_arr,r_int), hop):
 
50
        v_array, v_index = hop.inputargs(r_arr, Signed)
 
51
        return hop.gendirectcall(ll_getitem, v_array, v_index)
 
52
 
 
53
class __extend__(pairtype(AbstractBaseListRepr, ArrayRepr)):
 
54
    def convert_from_to((r_lst, r_arr), v, llops):
 
55
        if r_lst.listitem is None:
 
56
            return NotImplemented
 
57
        if r_lst.item_repr != r_arr.item_repr:
 
58
            return NotImplemented
 
59
        c1 = inputconst(lltype.Void, r_arr.lowleveltype.TO) 
 
60
        return llops.gendirectcall(ll_build_array, c1, v)
 
61
 
 
62
class __extend__(pairtype(AbstractRangeRepr, ArrayRepr)):
 
63
    def convert_from_to((r_rng, r_arr), v, llops):
 
64
        c1 = inputconst(lltype.Void, r_arr.lowleveltype.TO) 
 
65
        return llops.gendirectcall(ll_build_array, c1, v)
 
66
 
 
67
def ll_build_array(ARRAY, lst):
 
68
    size = lst.ll_length()
 
69
    array = malloc(ARRAY)
 
70
    data = array.data = malloc(ARRAY.data.TO, size)
 
71
    i = 0
 
72
    while i < size:
 
73
        data[i] = lst.ll_getitem_fast(i)
 
74
        i += 1
 
75
    return array
 
76
 
 
77
def ll_allocate(ARRAY, array):
 
78
    new_array = malloc(ARRAY)
 
79
    new_array.data = array.data
 
80
    return new_array
 
81
 
 
82
def ll_setitem(l, index, item):
 
83
    l.data[index] = item
 
84
 
 
85
def ll_getitem(l, index):
 
86
    return l.data[index]
 
87
 
 
88
def ll_add(ARRAY, a1, a2):
 
89
    size = len(a1.data)
 
90
    if size != len(a2.data):
 
91
        raise ValueError
 
92
    array = malloc(ARRAY)
 
93
    array.data = malloc(ARRAY.data.TO, size)
 
94
    i = 0
 
95
    while i < size:
 
96
        array.data[i] = a1.data[i] + a2.data[i]
 
97
        i += 1
 
98
    return array
 
99
 
 
100
 
 
101