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

fijal at codespeak.net fijal at codespeak.net
Sun Feb 15 17:15:43 CET 2009


Author: fijal
Date: Sun Feb 15 17:15:42 2009
New Revision: 61940

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tlc.py
Log:
fix a bit of bugs


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	Sun Feb 15 17:15:42 2009
@@ -284,6 +284,7 @@
             if ofs >= field:
                 instnode.curfields[ofs + 1] = node
         instnode.curfields[field] = fieldnode
+        instnode.known_length += 1
         self.dependency_graph.append((instnode, fieldnode))
         
     def find_nodes(self):
@@ -344,6 +345,8 @@
                 if (isinstance(fieldbox, ConstInt) or
                     self.nodes[op.args[2]].const):
                     field = self.getsource(fieldbox).getint()
+                    if field < 0:
+                        field = instnode.known_length - field
                     box = op.results[0]
                     self.find_nodes_getfield(instnode, field, box)
                     continue
@@ -365,6 +368,8 @@
                 fieldbox = self.getsource(op.args[2])
                 assert isinstance(fieldbox, Const) or fieldbox.const
                 field = fieldbox.getint()
+                if field < 0:
+                    field = instnode.known_length - field
                 self.find_nodes_insert(instnode, field,
                                        self.getnode(op.args[3]))
                 continue
@@ -378,16 +383,20 @@
                 continue
             elif opname == 'len' or opname == 'listnonzero':
                 instnode = self.getnode(op.args[1])
-                assert instnode.known_length != -1
-                lgtbox = op.results[0].constbox()
-                self.nodes[op.results[0]] = InstanceNode(lgtbox, const=True)
-                continue
+                if not instnode.escaped:
+                    assert instnode.known_length != -1
+                    lgtbox = op.results[0].constbox()
+                    self.nodes[op.results[0]] = InstanceNode(lgtbox, const=True)
+                    continue
             elif opname == 'setitem':
                 instnode = self.getnode(op.args[1])
                 fieldbox = op.args[2]
                 if (isinstance(fieldbox, ConstInt)
                     or self.nodes[op.args[2]].const):
                     field = self.getsource(fieldbox).getint()
+                    if field < 0:
+                        field = instnode.known_length - field
+                    assert field < instnode.known_length
                     self.find_nodes_setfield(instnode, field,
                                              self.getnode(op.args[3]))
                     continue
@@ -534,6 +543,8 @@
 
     def optimize_getfield(self, instnode, ofs, box):
         if instnode.virtual or instnode.virtualized:
+            if ofs < 0:
+                ofs = instnode.known_length - ofs
             assert ofs in instnode.curfields
             return True # this means field is never actually
         elif ofs in instnode.cleanfields:
@@ -558,6 +569,7 @@
             if ofs >= field:
                 instnode.curfields[ofs + 1] = node
         instnode.curfields[field] = valuenode
+        instnode.known_length += 1
 
     def optimize_loop(self):
         self.ready_results = {}

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tlc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tlc.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tlc.py	Sun Feb 15 17:15:42 2009
@@ -44,7 +44,7 @@
         assert res == 42
 
     def test_accumulator(self):
-        py.test.skip("unsupported yet")
+        py.test.skip("X")
         path = py.path.local(tlc.__file__).dirpath('accumulator.tlc.src')
         code = path.read()
         res = self.exec_code(code, 20)



More information about the Pypy-commit mailing list