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
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)
23
("data", Ptr(ITEMARRAY))))
24
self.lowleveltype = self.ARRAY
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)
30
class __extend__(SomeArray):
31
def rtyper_makerepr(self, rtyper):
32
return ArrayRepr( rtyper, self )
34
def rtyper_makekey(self):
35
return self.__class__, self.knowntype
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)
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)
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)
53
class __extend__(pairtype(AbstractBaseListRepr, ArrayRepr)):
54
def convert_from_to((r_lst, r_arr), v, llops):
55
if r_lst.listitem is None:
57
if r_lst.item_repr != r_arr.item_repr:
59
c1 = inputconst(lltype.Void, r_arr.lowleveltype.TO)
60
return llops.gendirectcall(ll_build_array, c1, v)
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)
67
def ll_build_array(ARRAY, lst):
68
size = lst.ll_length()
70
data = array.data = malloc(ARRAY.data.TO, size)
73
data[i] = lst.ll_getitem_fast(i)
77
def ll_allocate(ARRAY, array):
78
new_array = malloc(ARRAY)
79
new_array.data = array.data
82
def ll_setitem(l, index, item):
85
def ll_getitem(l, index):
88
def ll_add(ARRAY, a1, a2):
90
if size != len(a2.data):
93
array.data = malloc(ARRAY.data.TO, size)
96
array.data[i] = a1.data[i] + a2.data[i]