[pypy-svn] r62896 - pypy/branch/pyjitpl5/pypy/jit/metainterp

fijal at codespeak.net fijal at codespeak.net
Thu Mar 12 18:26:20 CET 2009


Author: fijal
Date: Thu Mar 12 18:26:17 2009
New Revision: 62896

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
Log:
Use r_dicts in place of regular dicts and remove some old code.


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	Thu Mar 12 18:26:17 2009
@@ -3,22 +3,18 @@
                                          ResOperation, AbstractDescr,
                                          Options, AbstractValue, ConstPtr)
 from pypy.jit.metainterp.specnode import (FixedClassSpecNode,
-                                          #FixedListSpecNode,
                                           VirtualInstanceSpecNode,
                                           VirtualizableSpecNode,
                                           NotSpecNode,
                                           DelayedSpecNode,
                                           SpecNodeWithBox,
                                           DelayedFixedListSpecNode,
-                                          #DelayedListSpecNode,
                                           VirtualFixedListSpecNode,
-                                          #VirtualListSpecNode,
                                           )
 from pypy.jit.metainterp import executor
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rpython.lltypesystem import lltype, llmemory
-#from pypy.jit.metainterp.codewriter import ListDescr
-
+from pypy.rlib.objectmodel import r_dict
 
 class FixedList(AbstractValue):
     def __init__(self, arraydescr):
@@ -105,6 +101,18 @@
             liveboxes.append(box)
         return res
 
+def av_eq(self, other):
+    return self.sort_key() == other.sort_key()
+
+def av_hash(self):
+    return self.sort_key()
+
+def av_list_in(lst, key):
+    for l in lst:
+        if key.sort_key() == l.sort_key():
+            return True
+    return False
+
 class InstanceNode(object):
     def __init__(self, source, escaped=True, startbox=False, const=False):
         if isinstance(source, Const):
@@ -117,11 +125,11 @@
         self.const = const
         self.nonzero = False     # NB. never set to True so far
         self.cls = None
-        self.origfields = {}
-        self.curfields = {}
-        self.cleanfields = {}
-        self.dirtyfields = {}
-        self.expanded_fields = {}
+        self.origfields = r_dict(av_eq, av_hash)
+        self.curfields = r_dict(av_eq, av_hash)
+        self.cleanfields = r_dict(av_eq, av_hash)
+        self.dirtyfields = r_dict(av_eq, av_hash)
+        self.expanded_fields = r_dict(av_eq, av_hash)
         self.cursize = -1
         self.vdesc = None # for virtualizables
 
@@ -142,7 +150,7 @@
                 node.escape_if_startbox(memo)
         else:
             for key, node in self.curfields.items():
-                if self.vdesc is not None and key not in self.vdesc:
+                if self.vdesc is not None and not av_list_in(self.vdesc, key):
                     esc_self = True
                 else:
                     esc_self = False
@@ -151,7 +159,7 @@
             # if they're not marked specifically as ones that does not escape
             for key, node in self.origfields.items():
                 if key not in self.curfields:
-                    if self.vdesc is not None and key not in self.vdesc:
+                    if self.vdesc is not None and not av_list_in(self.vdesc, key):
                         esc_self = True
                     else:
                         esc_self = False
@@ -163,7 +171,7 @@
             if ofs in other.curfields:
                 node.add_to_dependency_graph(other.curfields[ofs], dep_graph)
             if (self.virtualized and self.vdesc is not None and
-                ofs in self.vdesc):
+                av_list_in(self.vdesc, ofs)):
                 node.add_to_dependency_graph(other.origfields[ofs], dep_graph)
 
     def intersect(self, other, nodes):
@@ -545,7 +553,6 @@
                 instnode = self.nodes[box]
                 assert not instnode.virtual
                 box = instnode.source
-            #assert isinstance(box, Const) or box in self.ready_results
             newboxes.append(box)
         return newboxes
 
@@ -557,8 +564,6 @@
     def optimize_getfield(self, instnode, ofs, box):
         assert isinstance(ofs, AbstractValue)
         if instnode.virtual or instnode.virtualized:
-##            if ofs < 0:
-##                ofs = instnode.cursize + ofs
             assert ofs in instnode.curfields
             return True # this means field is never actually
         elif ofs in instnode.cleanfields:
@@ -571,8 +576,6 @@
     def optimize_setfield(self, instnode, ofs, valuenode, valuebox):
         assert isinstance(ofs, AbstractValue)
         if instnode.virtual or instnode.virtualized:
-##            if ofs < 0:
-##                ofs = instnode.cursize + ofs
             instnode.curfields[ofs] = valuenode
         else:
             assert not valuenode.virtual
@@ -580,14 +583,6 @@
             instnode.dirtyfields[ofs] = self.nodes[valuebox]
             # we never perform this operation here, note
 
-##    def optimize_insert(self, instnode, field, valuenode, valuebox):
-##        assert instnode.virtual
-##        for ofs, node in instnode.curfields.items():
-##            if ofs >= field:
-##                instnode.curfields[ofs + 1] = node
-##        instnode.curfields[field] = valuenode
-##        instnode.cursize += 1
-
     def optimize_loop(self):
         newoperations = []
         exception_might_have_happened = False
@@ -784,8 +779,8 @@
                     assert isinstance(ofs, AbstractDescr)
                     newoperations.append(ResOperation(rop.SETFIELD_GC,
                        [node.source, valuenode.source], None, ofs))
-            node.dirtyfields = {}
-            node.cleanfields = {}
+            node.dirtyfields = r_dict(av_eq, av_hash)
+            node.cleanfields = r_dict(av_eq, av_hash)
 
     def match_exactly(self, old_loop):
         old_operations = old_loop.operations
@@ -866,11 +861,6 @@
                              boxes_from_frame, index_in_alloc)
         metainterp.execute_and_record(rop.SETARRAYITEM_GC,
                                       [box, ofs, itembox], ad)
-##    if storage.setitems:
-##        #history.execute_and_record('guard_no_exception', [], 'void', False)
-##        # XXX this needs to check for exceptions somehow
-##        # create guard_no_excpetion somehow, needs tests
-##        pass
     newboxes = []
     for index in storage.indices:
         if index < 0:

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	Thu Mar 12 18:26:17 2009
@@ -83,8 +83,11 @@
         self.fields = fields
 
     def mutate_nodes(self, instnode):
+        from pypy.jit.metainterp.optimize import av_eq, av_hash
+        from pypy.rlib.objectmodel import r_dict
+        
         FixedClassSpecNode.mutate_nodes(self, instnode)
-        curfields = {}
+        curfields = r_dict(av_eq, av_hash)
         for ofs, subspecnode in self.fields:
             subinstnode = instnode.origfields[ofs]
             # should really be there



More information about the Pypy-commit mailing list