[pypy-svn] r66673 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Wed Jul 29 18:26:07 CEST 2009


Author: arigo
Date: Wed Jul 29 18:26:06 2009
New Revision: 66673

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_specnode.py
Log:
Add VirtualArraySpecNodes.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py	Wed Jul 29 18:26:06 2009
@@ -45,6 +45,33 @@
             subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
 
 
+class VirtualArraySpecNode(SpecNode):
+    def __init__(self, arraydescr, items):
+        self.arraydescr = arraydescr
+        self.items = items      # list of subspecnodes
+
+    def equals(self, other):
+        if not (isinstance(other, VirtualArraySpecNode) and
+                len(self.items) == len(other.items)):
+            return False
+        assert self.arraydescr == other.arraydescr
+        for i in range(len(self.items)):
+            s1 = self.items[i]
+            s2 = other.items[i]
+            if not s1.equals(s2):
+                return False
+        return True
+
+    def extract_runtime_data(self, cpu, valuebox, resultlist):
+        from pypy.jit.metainterp import executor, history, resoperation
+        for i in range(len(self.items)):
+            itembox = executor.execute(cpu, resoperation.rop.GETARRAYITEM_GC,
+                                       [valuebox, history.ConstInt(i)],
+                                       self.arraydescr)
+            subspecnode = self.items[i]
+            subspecnode.extract_runtime_data(cpu, itembox, resultlist)
+
+
 def equals_specnodes(specnodes1, specnodes2):
     assert len(specnodes1) == len(specnodes2)
     for i in range(len(specnodes1)):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimizefindnode.py	Wed Jul 29 18:26:06 2009
@@ -55,6 +55,9 @@
     nextdescr = cpu.fielddescrof(NODE, 'next')
     otherdescr = cpu.fielddescrof(NODE2, 'other')
 
+    # for test_specnode
+    arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
+
     cpu.class_sizes = {cpu.cast_adr_to_int(node_vtable_adr): cpu.sizeof(NODE),
                       cpu.cast_adr_to_int(node_vtable_adr2): cpu.sizeof(NODE2)}
     namespace = locals()

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_specnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_specnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_specnode.py	Wed Jul 29 18:26:06 2009
@@ -2,6 +2,7 @@
 from pypy.jit.metainterp.history import AbstractDescr, BoxPtr, ConstInt
 from pypy.jit.metainterp.specnode import prebuiltNotSpecNode
 from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
+from pypy.jit.metainterp.specnode import VirtualArraySpecNode
 from pypy.jit.metainterp.specnode import equals_specnodes
 from pypy.jit.metainterp.test.test_optimizefindnode import LLtypeMixin
 
@@ -10,6 +11,10 @@
                          [(LLtypeMixin.valuedescr, prebuiltNotSpecNode),
                           (LLtypeMixin.nextdescr,  prebuiltNotSpecNode)])
 
+def _get_aspecnode(length=2):
+    return VirtualArraySpecNode(LLtypeMixin.arraydescr,
+                                [prebuiltNotSpecNode] * length)
+
 def test_equals_specnodes():
     assert equals_specnodes([prebuiltNotSpecNode, prebuiltNotSpecNode],
                             [prebuiltNotSpecNode, prebuiltNotSpecNode])
@@ -19,6 +24,12 @@
     assert not equals_specnodes([vspecnode1], [vspecnode2])
     assert not equals_specnodes([vspecnode1], [prebuiltNotSpecNode])
     assert not equals_specnodes([prebuiltNotSpecNode], [vspecnode2])
+    aspecnode1 = _get_aspecnode(1)
+    aspecnode2 = _get_aspecnode(2)
+    assert equals_specnodes([aspecnode2], [aspecnode2])
+    assert not equals_specnodes([aspecnode1], [aspecnode2])
+    assert not equals_specnodes([aspecnode1], [prebuiltNotSpecNode])
+    assert not equals_specnodes([prebuiltNotSpecNode], [aspecnode2])
 
 def test_extract_runtime_data_1():
     res = []
@@ -37,3 +48,15 @@
     assert len(res) == 2
     assert res[0].value == structure.value
     assert res[1].value._obj.container._as_ptr() == structure.next
+
+def test_extract_runtime_data_3():
+    array = lltype.malloc(lltype.GcArray(lltype.Signed), 2)
+    array[0] = 123
+    array[1] = 456
+    arraybox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, array))
+    aspecnode = _get_aspecnode()
+    res = []
+    aspecnode.extract_runtime_data(LLtypeMixin.cpu, arraybox, res)
+    assert len(res) == 2
+    assert res[0].value == 123
+    assert res[1].value == 456



More information about the Pypy-commit mailing list