[pypy-commit] pypy resume-refactor: fix a case in resumebuilder

fijal noreply at buildbot.pypy.org
Sun Jan 12 14:16:28 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68609:e239dd41741b
Date: 2014-01-12 13:38 +0100
http://bitbucket.org/pypy/pypy/changeset/e239dd41741b/

Log:	fix a case in resumebuilder

diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -492,7 +492,10 @@
             if box in self.bindings_to_frame_reg:
                 return self.frame_reg
             if must_exist:
-                return self.frame_manager.bindings[box]
+                try:
+                    return self.frame_manager.bindings[box]
+                except KeyError:
+                    raise
             return self.frame_manager.loc(box)
 
     def return_constant(self, v, forbidden_vars=[], selected_reg=None):
diff --git a/rpython/jit/backend/llsupport/resumebuilder.py b/rpython/jit/backend/llsupport/resumebuilder.py
--- a/rpython/jit/backend/llsupport/resumebuilder.py
+++ b/rpython/jit/backend/llsupport/resumebuilder.py
@@ -57,7 +57,14 @@
         if op.getopnum() == rop.RESUME_PUT:
             box = op.getarg(0)
             args = op.getarglist()
-            pos = self.regalloc.loc(box).get_jitframe_position()
+            try:
+                pos = self.regalloc.loc(box, must_exist=True).get_jitframe_position()
+            except KeyError:
+                # the thing is not *yet* anywhere, which means we'll record
+                # we know about it, but not store the resume_put just yet
+                self.current_attachment[box] = -1
+                self.frontend_pos[box] = (args[1], args[2])
+                return
             self.current_attachment[box] = pos
             self.frontend_pos[box] = (args[1], args[2])
             args[0] = ConstInt(pos)
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -362,12 +362,12 @@
         while mc.get_relative_pos() < self.min_bytes_before_label:
             mc.NOP()
 
-    def loc(self, v):
+    def loc(self, v, must_exist=False):
         if v is None: # xxx kludgy
             return None
         if v.type == FLOAT:
-            return self.xrm.loc(v)
-        return self.rm.loc(v)
+            return self.xrm.loc(v, must_exist=must_exist)
+        return self.rm.loc(v, must_exist=must_exist)
 
     def _consider_guard(self, op):
         loc = self.rm.make_sure_var_in_reg(op.getarg(0))


More information about the pypy-commit mailing list