[pypy-commit] pypy resume-refactor: finish this test

fijal noreply at buildbot.pypy.org
Wed Jan 22 18:23:21 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68849:abb0362b055f
Date: 2014-01-18 13:51 +0100
http://bitbucket.org/pypy/pypy/changeset/abb0362b055f/

Log:	finish this test

diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1873,7 +1873,6 @@
         self.attach_debug_info(op)
         return resbox
 
-
     def attach_debug_info(self, op):
         if (not we_are_translated() and op is not None
             and getattr(self, 'framestack', None)):
diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py
--- a/rpython/jit/resume/frontend.py
+++ b/rpython/jit/resume/frontend.py
@@ -201,18 +201,20 @@
             return self.consts[pos]
         else:
             assert tag == TAGVIRTUAL
-            virtual = self.virtual_list[pos]
+            virtual = self.virtuals[pos]
             virtual_box = self.allocate_struct(virtual)
             for fielddescr, encoded_field_pos in virtual.fields.iteritems():
-                self.setfield(virtual, fielddescr, encoded_field_pos)
+                self.setfield_gc(virtual_box, encoded_field_pos, fielddescr)
             self.cache[encoded_pos] = virtual_box
             return virtual_box
 
     def allocate_struct(self, virtual):
         return self.metainterp.execute_and_record(rop.NEW, virtual.descr)
 
-    def setfield(self, virtual, fielddescr, encoded_field_pos):
-        xxx
+    def setfield_gc(self, box, encoded_field_pos, fielddescr):
+        field_box = self.get_box_value(encoded_field_pos, fielddescr.kind)
+        self.metainterp.execute_and_record(rop.SETFIELD_GC, fielddescr,
+                                           box, field_box)
 
     def store_int_box(self, res, pos, miframe, i, jitframe_pos):
         box = self.get_box_value(jitframe_pos, INT)
@@ -227,7 +229,14 @@
         if box is None:
             return
         miframe.registers_r[i] = box
-        res[-1][pos] = box
+        tag, index = self.decode(jitframe_pos)
+        if tag == TAGBOX:
+            res[-1][pos] = box
+        elif tag == TAGVIRTUAL:
+            self.metainterp.history.record(rop.RESUME_PUT,
+                                           [box, ConstInt(len(res) - 1),
+                                            ConstInt(pos)], None, None)
+            # we can't have virtual ints
         return
         xxx
         if jitframe_pos in self.cache:
diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py
--- a/rpython/jit/resume/reader.py
+++ b/rpython/jit/resume/reader.py
@@ -25,9 +25,7 @@
     def __init__(self, staticdata):
         self.framestack = []
         self.staticdata = staticdata
-        self.consts = [] # XXX cache?
-        self.virtuals = {}
-        self.virtual_list = []
+        self.virtuals = []
 
     def rebuild(self, faildescr):
         self._rebuild_until(faildescr.rd_resume_bytecode,
@@ -65,17 +63,17 @@
     def encode(self, box):
         xxx
 
-    def resume_new(self, box, descr):
-        xxx
-        # XXX make it a list
-        v = Virtual(len(self.virtual_list), descr)
-        self.virtuals[box] = v
-        self.virtual_list.append(v)
+    def resume_new(self, v_pos, descr):
+        v = Virtual(v_pos, descr)
+        if v_pos >= len(self.virtuals):
+            self.virtuals += [None] * (len(self.virtuals) - v_pos + 1)
+        self.virtuals[v_pos] = v
 
-    def resume_setfield_gc(self, box, fieldbox, descr):
+    def resume_setfield_gc(self, pos, fieldpos, descr):
         # XXX optimize fields
-        xxx
-        self.virtuals[box].fields[descr] = self.encode(fieldbox)
+        tag, index = self.decode(pos)
+        assert tag == rescode.TAGVIRTUAL # for now
+        self.virtuals[index].fields[descr] = fieldpos
 
     def resume_clear(self, frame_no, frontend_position):
         xxx
diff --git a/rpython/jit/resume/test/test_frontend.py b/rpython/jit/resume/test/test_frontend.py
--- a/rpython/jit/resume/test/test_frontend.py
+++ b/rpython/jit/resume/test/test_frontend.py
@@ -5,7 +5,7 @@
      ConstInt
 from rpython.jit.resume.frontend import rebuild_from_resumedata
 from rpython.jit.resume.rescode import ResumeBytecode, TAGBOX,\
-     ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT
+     ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT, TAGVIRTUAL
 from rpython.jit.resume.reader import AbstractResumeReader
 from rpython.jit.resume.test.support import MockStaticData
 from rpython.jit.metainterp.resoperation import rop
@@ -44,12 +44,20 @@
 class AnyBox(object):
     def __eq__(self, other):
         return True
-        
+
+class EqConstInt(ConstInt):
+    def __eq__(self, other):
+        return self.same_box(other)
+
+class mylist(list):
+    def record(self, opnum, argboxes, resbox, descr):
+        self.append(tuple([opnum, descr] + argboxes))
+    
 class MockMetaInterp(object):
     def __init__(self):
         self.cpu = MockCPU()
         self.framestack = []
-        self.history = []
+        self.history = mylist()
 
     def execute_and_record(self, *args):
         self.history.append(args)
@@ -160,12 +168,12 @@
         builder.enter_frame(-1, jitcode1)
         builder.resume_put(TAGBOX | (42 << 2), 0, 0)
         rd1 = builder.build()
-        lgt1 = len(rd1.opcodes)
+        lgt1 = len(rd1)
 
         builder = ResumeBytecodeBuilder()
         builder.resume_put(TAGBOX | (2 << 2), 0, 1)
         rd2 = builder.build()
-        lgt2 = len(rd2.opcodes)
+        lgt2 = len(rd2)
         
         descr = Descr()
         descr.rd_bytecode_position = lgt2
@@ -173,6 +181,7 @@
         b = ResumeBytecode(rd2, [], parent, parent_position=lgt1)
         descr.rd_resume_bytecode = b
         metainterp = MockMetaInterp()
+        metainterp.staticdata = MockStaticData([jitcode1], [])
         metainterp.cpu = MockCPU()
         rebuild_from_resumedata(metainterp, "myframe", descr)
         f = metainterp.framestack[-1]
@@ -182,23 +191,32 @@
 
     def test_new(self):
         jitcode1 = JitCode("jitcode")
+        jitcode1.global_index = 0
         jitcode1.setup(num_regs_i=0, num_regs_r=1, num_regs_f=0)
-        base = parse("""
-        []
-        enter_frame(-1, descr=jitcode)
-        p0 = resume_new()
-        resume_setfield_gc(p0, 13)
-        resume_put(p0, 0, 0)
-        leave_frame()
-        """, namespace={'jitcode':jitcode1})
+        builder = ResumeBytecodeBuilder()
         descr = Descr()
-        descr.rd_resume_bytecode = ResumeBytecode(base.operations)
-        descr.rd_bytecode_position = 4
+        descr.global_descr_index = 0
+        builder.enter_frame(-1, jitcode1)
+        builder.resume_new(0, descr)
+        d2 = Descr()
+        d2.kind = INT
+        d2.global_descr_index = 1
+        builder.resume_setfield_gc(TAGVIRTUAL | (0 << 2),
+                                   TAGSMALLINT | (1 << 2), d2)
+        builder.resume_put(TAGVIRTUAL | (0 << 2), 0, 0)
+        rd = builder.build()
+        descr = Descr()
+        descr.rd_resume_bytecode = ResumeBytecode(rd, [])
+        descr.rd_bytecode_position = len(rd)
         metainterp = MockMetaInterp()
+        metainterp.staticdata = MockStaticData([jitcode1], [descr, d2])
         metainterp.cpu = MockCPU()
         rebuild_from_resumedata(metainterp, "myframe", descr)
-        assert metainterp.history == [(rop.NEW, None),
-                                      (rop.SETFIELD_GC, None, AnyBox())]
+        expected = [(rop.NEW, descr),
+                    (rop.SETFIELD_GC, d2, AnyBox(), EqConstInt(1)),
+                    (rop.RESUME_PUT, None, AnyBox(), EqConstInt(0),
+                     EqConstInt(0))]
+        assert metainterp.history == expected
 
     def test_reconstructing_resume_reader(self):
         jitcode1 = JitCode("jitcode")


More information about the pypy-commit mailing list