[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