[pypy-svn] r25281 - pypy/dist/pypy/rpython/ootypesystem
nik at codespeak.net
nik at codespeak.net
Tue Apr 4 08:52:57 CEST 2006
Author: nik
Date: Tue Apr 4 08:52:56 2006
New Revision: 25281
Added:
pypy/dist/pypy/rpython/ootypesystem/rlist.py (contents, props changed)
Log:
ooops. forgot to checkin this rather important file during the rlist
refactoring. sorry.
Added: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py Tue Apr 4 08:52:56 2006
@@ -0,0 +1,71 @@
+from pypy.annotation.pairtype import pairtype
+from pypy.rpython.rlist import AbstractListRepr, rtype_newlist
+from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst, externalvsinternal
+from pypy.rpython.ootypesystem import ootype
+
+class BaseListRepr(AbstractListRepr):
+
+ def __init__(self, rtyper, item_repr, listitem=None):
+ self.rtyper = rtyper
+ # XXX do we need something like this for ootypes?
+ #self.LIST = GcForwardReference()
+ if not isinstance(item_repr, Repr): # not computed yet, done by setup()
+ assert callable(item_repr)
+ self._item_repr_computer = item_repr
+ else:
+ self.lowleveltype = ootype.List(item_repr.lowleveltype)
+ self.external_item_repr, self.item_repr = \
+ externalvsinternal(rtyper, item_repr)
+ self.listitem = listitem
+ self.list_cache = {}
+ # setup() needs to be called to finish this initialization
+
+ def _setup_repr(self):
+ if 'item_repr' not in self.__dict__:
+ self.external_item_repr, self.item_repr = \
+ externalvsinternal(self.rtyper, self._item_repr_computer())
+ self.lowleveltype = ootype.List(self.item_repr.lowleveltype)
+
+ def send_message(self, hop, message, can_raise=False):
+ v_args = hop.inputargs(self, *hop.args_r[1:])
+ c_name = hop.inputconst(ootype.Void, message)
+ if can_raise:
+ hop.exception_is_here()
+ return hop.genop("oosend", [c_name] + v_args,
+ resulttype=hop.r_result.lowleveltype)
+
+ def rtype_len(self, hop):
+ return self.send_message(hop, "length")
+
+ def rtype_method_append(self, hop):
+ return self.send_message(hop, "append")
+
+ListRepr = BaseListRepr
+FixedSizeListRepr = BaseListRepr
+
+class __extend__(pairtype(BaseListRepr, IntegerRepr)):
+
+ def rtype_getitem((r_list, r_int), hop):
+ # XXX must handle exceptions
+ #if hop.has_implicit_exception(IndexError):
+ # XXX must handle negative indices
+ return r_list.send_message(hop, "getitem", can_raise=True)
+
+ def rtype_setitem((r_list, r_int), hop):
+ # XXX must handle exceptions
+ #if hop.has_implicit_exception(IndexError):
+ # XXX must handle negative indices
+ #if hop.has_implicit_exception(IndexError):
+ return r_list.send_message(hop, "setitem", can_raise=True)
+
+def newlist(llops, r_list, items_v):
+ c1 = inputconst(ootype.Void, r_list.lowleveltype)
+ v_result = llops.genop("new", [c1], resulttype=r_list.lowleveltype)
+ #LIST = r_list.LIST
+ #cno = inputconst(Signed, len(items_v))
+ #v_result = llops.gendirectcall(LIST.ll_newlist, cno)
+ #v_func = inputconst(Void, dum_nocheck)
+ #for i, v_item in enumerate(items_v):
+ # ci = inputconst(Signed, i)
+ # llops.gendirectcall(ll_setitem_nonneg, v_func, v_result, ci, v_item)
+ return v_result
More information about the Pypy-commit
mailing list