Author: Hakan Ardo <[email protected]>
Branch: jit-usable_retrace_3
Changeset: r60209:db653f81ea07
Date: 2013-01-19 15:03 +0100
http://bitbucket.org/pypy/pypy/changeset/db653f81ea07/

Log:    Rearange code to make value.getfiled always return a propert
        OptValue

diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py 
b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -77,8 +77,15 @@
         self._fields = {}
         self._cached_sorted_fields = None
 
-    def getfield(self, ofs, default):
-        return self._fields.get(ofs, default)
+    def getfield(self, ofs, optimizer):
+        assert optimizer
+        fieldvalue = self._fields.get(ofs, None)
+        if fieldvalue is None:
+            fieldvalue = optimizer.new_const(ofs)
+        return fieldvalue
+
+    def field_is_set(self, ofs):
+        return ofs in self._fields
 
     def setfield(self, ofs, fieldvalue):
         assert isinstance(fieldvalue, optimizer.OptValue)
@@ -442,16 +449,13 @@
         # If this is an immutable field (as indicated by op.is_always_pure())
         # then it's safe to reuse the virtual's field, even if it has been
         # forced, because it should never be written to again.
-        if value.is_forced_virtual() and op.is_always_pure():
-            fieldvalue = value.getfield(op.getdescr(), None)
-            if fieldvalue is not None:
-                self.make_equal_to(op.result, fieldvalue)
-                return
+        if value.is_forced_virtual() and op.is_always_pure() and 
value.field_is_set(op.getdescr()):
+            fieldvalue = value.getfield(op.getdescr(), self.optimizer)
+            self.make_equal_to(op.result, fieldvalue)
+            return
         if value.is_virtual():
             assert isinstance(value, AbstractVirtualValue)
-            fieldvalue = value.getfield(op.getdescr(), None)
-            if fieldvalue is None:
-                fieldvalue = self.optimizer.new_const(op.getdescr())
+            fieldvalue = value.getfield(op.getdescr(), self.optimizer)
             self.make_equal_to(op.result, fieldvalue)
         else:
             value.ensure_nonnull()
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py 
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -140,32 +140,32 @@
         while i < len(self.fielddescrs) and j < len(other.fielddescrs):
             if other.fielddescrs[j] is self.fielddescrs[i]:
                 new_field_value = 
self.fieldstate[i].make_guardable_generalization_of(other.fieldstate[j],
-                                                       
value.getfield(self.fielddescrs[i], None), optimizer)
+                                                       
value.getfield(self.fielddescrs[i], optimizer), optimizer)
                 if new_field_value:
                     value.setfield(self.fielddescrs[i], new_field_value)
                 i += 1
                 j += 1
             elif self.fielddescrs[i].sort_key() < 
other.fielddescrs[j].sort_key():
                 new_field_value = 
self.fieldstate[i].make_guardable_generalization_of_null(
-                                                       
value.getfield(self.fielddescrs[i], None), optimizer)
+                                                       
value.getfield(self.fielddescrs[i], optimizer), optimizer)
                 if new_field_value:
                     value.setfield(self.fielddescrs[i], new_field_value)
                 i += 1
             else:
                 new_field_value = 
other.fieldstate[j].make_guardable_generalization_of_null(
-                                                       
value.getfield(other.fielddescrs[j], None), optimizer)
+                                                       
value.getfield(other.fielddescrs[j], optimizer), optimizer)
                 if new_field_value:
                     value.setfield(other.fielddescrs[j], new_field_value)
                 j += 1
         while i < len(self.fielddescrs):
             new_field_value = 
self.fieldstate[i].make_guardable_generalization_of_null(
-                                                   
value.getfield(self.fielddescrs[i], None), optimizer)
+                                                   
value.getfield(self.fielddescrs[i], optimizer), optimizer)
             if new_field_value:
                 value.setfield(self.fielddescrs[i], new_field_value)
             i += 1
         while j < len(other.fielddescrs):
             new_field_value = 
other.fieldstate[j].make_guardable_generalization_of_null(
-                                                   
value.getfield(other.fielddescrs[j], None), optimizer)
+                                                   
value.getfield(other.fielddescrs[j], optimizer), optimizer)
             if new_field_value:
                 value.setfield(other.fielddescrs[j], new_field_value)
             j += 1
@@ -188,9 +188,7 @@
         if not value.is_virtual():
             raise BadVirtualState
         for i in range(len(self.fielddescrs)):
-            v = value.getfield(self.fielddescrs[i], None)
-            if v is None:
-                v = optimizer.new_const(self.fielddescrs[i])
+            v = value.getfield(self.fielddescrs[i], optimizer)
             s = self.fieldstate[i]
             if s.position > self.position:
                 s.enum_forced_boxes(boxes, v, optimizer, doforce)
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py 
b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -13,7 +13,7 @@
 from pypy.jit.metainterp.history import TreeLoop, JitCellToken
 from pypy.jit.metainterp.optimizeopt.test.test_optimizeopt import 
FakeMetaInterpStaticData
 from pypy.jit.metainterp.resoperation import ResOperation, rop
-from pypy.jit.metainterp.optimizeopt.optimizer import LEVEL_UNKNOWN, 
LEVEL_CONSTANT, Optimizer
+from pypy.jit.metainterp.optimizeopt.optimizer import LEVEL_UNKNOWN, 
LEVEL_CONSTANT, Optimizer, CVAL_ZERO
 import itertools
 
 class TestBasic:
@@ -1205,6 +1205,10 @@
 
     def make_equal_to(self, box, value, replace=False):
         self.values[box] = value
+
+    def new_const(self, descr):
+        assert isinstance(descr, FakeDescr)
+        return CVAL_ZERO
     
     optearlyforce = None
     opaque_pointers = {}
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to