[pypy-commit] pypy value-classes: Generate fieldboxes and faux virtual state

sbauman pypy.commits at gmail.com
Tue Sep 27 01:17:42 EDT 2016


Author: Spenser Bauman <sabauma at gmail.com>
Branch: value-classes
Changeset: r87408:3d7fa60a7ac3
Date: 2016-09-26 23:19 -0400
http://bitbucket.org/pypy/pypy/changeset/3d7fa60a7ac3/

Log:	Generate fieldboxes and faux virtual state

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
@@ -226,8 +226,11 @@
         if not known_class.is_value_class():
             raise VirtualStatesCantMatch("different kinds of structs")
 
+        # import pdb; pdb.set_trace()
         raise VirtualStatesCantMatch("different kinds of structs")
 
+        import pdb; pdb.set_trace()
+
         # TODO: Probably should rename state.extra_guards to extra_ops
         extra_guards = state.extra_guards
         cpu = state.cpu
@@ -260,15 +263,31 @@
         #     non-virtual object which we are promoting to a virtual. How do we
         #     generate this new virtual state so we can operate recursively)
 
+        if runtime_box is not None:
+            opinfo = state.optimizer.getptrinfo(box)
+            assert opinfo is None or isinstance(opinfo, AbstractStructPtrInfo)
+        else:
+            opinfo = None
+
         # We need to build a virtual version which conforms with the expected
         # virtual object.
         # This will probably look a lot like
         # AbstractVirtualStateInfo._generate_guards
-        fields = [None] * len(self.fielddescrs)
+        fields = []
         for i, descr in enumerate(self.fielddescrs):
-            opnum = rop.getfield_for_descr(descr)
-            fields[i] = getfield_op = ResOperation(opnum, [box], descr=descr)
-            extra_guards.append(getfield_op)
+            if runtime_box is not None and opinfo is not None:
+                fieldbox = opinfo._fields[descr.get_index()]
+                fieldbox_runtime = state.get_runtime_field(runtime_box, descr)
+            else:
+                opnum = rop.getfield_for_descr(descr)
+                fieldbox = ResOperation(opnum, [box], descr=descr)
+                extra_guards.append(fieldbox)
+                fieldbox_runtime = None
+            fields.append(fieldbox)
+            faux_field_state = not_virtual(cpu, fieldbox.type, opinfo)
+            fieldstate = self.fieldstate[i]
+            fieldstate.generate_guards(faux_field_state, fieldbox,
+                                       fieldbox_runtime, state)
 
     def debug_header(self, indent):
         debug_print(indent + 'VirtualStateInfo(%d):' % self.position)
@@ -542,6 +561,8 @@
             other_intbound = other.intbound
         if self.intbound is None:
             return
+        if other.intbound is None:
+            return
         if self.intbound.contains_bound(other_intbound):
             return
         if (runtime_box is not None and


More information about the pypy-commit mailing list