[pypy-svn] r32059 - pypy/dist/pypy/jit/timeshifter

pedronis at codespeak.net pedronis at codespeak.net
Thu Sep 7 17:46:08 CEST 2006


Author: pedronis
Date: Thu Sep  7 17:46:06 2006
New Revision: 32059

Modified:
   pypy/dist/pypy/jit/timeshifter/vlist.py
Log:
(arigo, pedronis)

some more virtual list operations implemented (test pending).



Modified: pypy/dist/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vlist.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/vlist.py	Thu Sep  7 17:46:06 2006
@@ -137,12 +137,44 @@
             return oopspecdesc.typedesc.factory(length, itembox)
     return oopspecdesc.residual_call(jitstate, [lengthbox, itembox])
 
+def oop_list_len(jitstate, oopspecdesc, selfbox):
+    if isinstance(selfbox.content, VirtualList):
+        return rvalue.ll_fromvalue(jitstate, len(selfbox.content.item_boxes))
+    else:
+        return oopspecdesc.residual_call(jitstate, [selfbox])
+
 def oop_list_append(jitstate, oopspecdesc, selfbox, itembox):
     if isinstance(selfbox.content, VirtualList):
         selfbox.content.item_boxes.append(itembox)
     else:
         oopspecdesc.residual_call(jitstate, [selfbox, itembox])
 
+def oop_list_insert(jitstate, oopspecdesc, selfbox, indexbox, itembox):
+    if isinstance(selfbox.content, VirtualList) and indexbox.is_constant():
+        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
+        selfbox.content.item_boxes[index].insert(index, itembox)
+    else:
+        oopspecdesc.residual_call(jitstate, [selfbox, indexbox, itembox])
+
+def oop_list_pop(jitstate, oopspecdesc, selfbox, indexbox=None):
+    if indexbox is None:
+        if isinstance(selfbox.content, VirtualList):
+            try:
+                return selfbox.content.item_boxes.pop()
+            except IndexError:
+                return oopspecdesc.residual_exception(jitstate, IndexError)
+        else:
+            return oopspecdesc.residual_call(jitstate, [selfbox])
+
+    if (isinstance(selfbox.content, VirtualList) and
+        indexbox.is_constant()):
+        index = rvalue.ll_getvalue(indexbox, lltype.Signed)
+        try:
+            return selfbox.content.item_boxes.pop(index)
+        except IndexError:
+            return oopspecdesc.residual_exception(jitstate, IndexError)
+    return oopspecdesc.residual_call(jitstate, [selfbox, indexbox])
+
 def oop_list_getitem(jitstate, oopspecdesc, selfbox, indexbox):
     if isinstance(selfbox.content, VirtualList) and indexbox.is_constant():
         index = rvalue.ll_getvalue(indexbox, lltype.Signed)



More information about the Pypy-commit mailing list