Author: Spenser Bauman <saba...@gmail.com>
Branch: value-classes
Changeset: r87426:27384c89faf6
Date: 2016-09-27 20:11 -0400
http://bitbucket.org/pypy/pypy/changeset/27384c89faf6/

Log:    Guard recursion in generate_guards

diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -21,6 +21,8 @@
 
 
 class GenerateGuardState(object):
+    _attrs_ = ('optimizer', 'cpu', 'extra_guards', 'renum', 'bad', 
'force_boxes')
+
     def __init__(self, optimizer=None, guards=None, renum=None, bad=None, 
force_boxes=False):
         self.optimizer = optimizer
         self.cpu = optimizer.cpu
@@ -233,12 +235,10 @@
 
     def make_virtual_copy(self, box, info, optimizer):
         optvirtualize = optimizer.optvirtualize
-        # newop = ResOperation(rop.NEW_WITH_VTABLE, [], descr=self.typedescr)
         opinfo = optvirtualize.make_virtual(self.known_class, box, 
self.typedescr)
         for i in range(len(info._fields)):
             descr = self.fielddescrs[i]
             opinfo._fields[i] = self.getfield(box, info, descr, optimizer)
-        # optimizer.emit_operation(newop)
         return opinfo
 
     def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
@@ -250,13 +250,12 @@
             return AbstractVirtualStructStateInfo.enum_forced_boxes(
                     self, boxes, box, optimizer, force_boxes)
 
-        optvirtualize = optimizer.optimizer
         assert isinstance(info, AbstractStructPtrInfo)
 
         # TODO: Do we need to create a new object via NEW_WITH_VTABLE, or will 
the
         # allocation be handled properly?
         opinfo = self.make_virtual_copy(box, info, optimizer.optimizer)
-        for i in range(min(len(self.fielddescrs), len(info._fields))):
+        for i in range(min(len(self.fielddescrs), len(opinfo._fields))):
             state = self.fieldstate[i]
             if state is None:
                 continue
@@ -328,10 +327,11 @@
                 fieldbox = ResOperation(opnum, [box], descr=descr)
                 extra_guards.append(fieldbox)
                 fieldbox_runtime = None
-            other_field_state = not_virtual(cpu, fieldbox.type, opinfo)
             fieldstate = self.fieldstate[i]
-            fieldstate.generate_guards(other_field_state, fieldbox,
-                                       fieldbox_runtime, state)
+            if fieldstate is not None:
+                other_field_state = not_virtual(cpu, fieldbox.type, opinfo)
+                fieldstate.generate_guards(other_field_state, fieldbox,
+                                           fieldbox_runtime, state)
 
     def debug_header(self, indent):
         debug_print(indent + 'VirtualStateInfo(%d):' % self.position)
diff --git a/rpython/jit/metainterp/test/test_virtual.py 
b/rpython/jit/metainterp/test/test_virtual.py
--- a/rpython/jit/metainterp/test/test_virtual.py
+++ b/rpython/jit/metainterp/test/test_virtual.py
@@ -1043,7 +1043,6 @@
             return 0
 
         self.meta_interp(f, [])
-        import pdb; pdb.set_trace()
 
     def test_aliased_virtual_states(self):
         # All cases are covered when forcing one component of the virtual state
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to