Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: jitframe-on-heap
Changeset: r60423:3f77cd26741e
Date: 2013-01-24 18:07 +0200
http://bitbucket.org/pypy/pypy/changeset/3f77cd26741e/

Log:    some fixes

diff --git a/pypy/TODO b/pypy/TODO
--- a/pypy/TODO
+++ b/pypy/TODO
@@ -5,4 +5,6 @@
   got potentially moved, which is after each potentially collecting call
   or slowpath malloc)
 * kill jit2gc on translator
-* fix test_singlefloats in test_calling_conventions
\ No newline at end of file
+* fix test_singlefloats in test_calling_conventions
+* slowpaths can have more variants depending on how many registers we're using
+  (like floats vs non-floats for failures)
\ No newline at end of file
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
@@ -891,7 +891,6 @@
         size_box = op.getarg(0)
         assert isinstance(size_box, ConstInt)
         size = size_box.getint()
-        gcmap = self.get_gcmap() # allocate the gcmap *before*
         # looking at the result
         self.rm.force_allocate_reg(op.result, selected_reg=eax)
         #
@@ -899,6 +898,7 @@
         # register.  See comments in _build_malloc_slowpath().
         tmp_box = TempBox()
         self.rm.force_allocate_reg(tmp_box, selected_reg=edi)
+        gcmap = self.get_gcmap([eax, edi]) # allocate the gcmap *before*
         self.rm.possibly_free_var(tmp_box)
         #
         gc_ll_descr = self.assembler.cpu.gc_ll_descr
@@ -907,12 +907,14 @@
             gc_ll_descr.get_nursery_top_addr(),
             size, gcmap)
 
-    def get_gcmap(self):
+    def get_gcmap(self, forbidden_regs):
         frame_depth = self.fm.get_frame_depth()
         size = frame_depth + JITFRAME_FIXED_SIZE
         gcmap = lltype.malloc(GCMAP, size // WORD // 8 + 1,
                               zero=True)
         for box, loc in self.rm.reg_bindings.iteritems():
+            if loc in forbidden_regs:
+                continue
             if box.type == REF:
                 assert isinstance(loc, RegLoc)
                 val = gpr_reg_mgr_cls.all_reg_indexes[loc.value]
diff --git a/rpython/jit/backend/x86/test/test_gc_integration.py 
b/rpython/jit/backend/x86/test/test_gc_integration.py
--- a/rpython/jit/backend/x86/test/test_gc_integration.py
+++ b/rpython/jit/backend/x86/test/test_gc_integration.py
@@ -347,22 +347,30 @@
         self._generated_functions = []
         self.gcrootmap = MockShadowStackRootMap()
         self.write_barrier_descr = WriteBarrierDescr(self)
+        self.nursery_ptrs = lltype.malloc(rffi.CArray(lltype.Signed), 2,
+                                          flavor='raw')
         self._initialize_for_tests()
         self.frames = []
 
         def malloc_slowpath(size):
             self._collect()
+            res = self.nursery_ptrs[0]
+            self.nursery_ptrs[0] += size
+            return res
 
         self.malloc_slowpath_fnptr = llhelper_args(malloc_slowpath,
                                                    [lltype.Signed],
-                                                   llmemory.GCREF)
+                                                   lltype.Signed)
         self.all_nurseries = []
 
-    def init_nursery(self, nursery_size):
+    def init_nursery(self, nursery_size=None):
+        if nursery_size is None:
+            nursery_size = self.nursery_size
+        else:
+            self.nursery_size = nursery_size
         self.nursery = lltype.malloc(rffi.CArray(lltype.Char), nursery_size,
-                                     flavor='raw', zero=True)
-        self.nursery_ptrs = lltype.malloc(rffi.CArray(lltype.Signed), 2,
-                                          flavor='raw')
+                                     flavor='raw', zero=True,
+                                     track_allocation=False)
         self.nursery_ptrs[0] = rffi.cast(lltype.Signed, self.nursery)
         self.nursery_ptrs[1] = self.nursery_ptrs[0] + nursery_size
         self.nursery_addr = rffi.cast(lltype.Signed, self.nursery_ptrs)
@@ -373,10 +381,13 @@
         gcmap = unpack_gcmap(self.frames[-1])
         col = self.collections.pop()
         frame = self.frames[-1].jf_frame
-        start = self.nursery_ptrs[0]
+        start = rffi.cast(lltype.Signed, self.nursery)
         assert len(gcmap) == len(col)
+        pos = [frame[item] for item in gcmap]
+        pos.sort()
         for i in range(len(gcmap)):
-            assert col[i] + start == frame[gcmap[i]]
+            assert col[i] + start == pos[i]
+        self.init_nursery()
 
     def malloc_jitframe(self, frame_info):
         """ Allocate a new frame, overwritten by tests
@@ -399,7 +410,7 @@
 
     def __del__(self):
         for nursery in self.all_nurseries:
-            lltype.free(nursery, flavor='raw')
+            lltype.free(nursery, flavor='raw', track_allocation=False)
         lltype.free(self.nursery_ptrs, flavor='raw')
     
 def unpack_gcmap(frame):
@@ -516,6 +527,6 @@
         frame = cpu.execute_token(token)
         # now we should be able to track everything from the frame
         frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame)
-        thing = frame.jf_frame[unpack_gcmap(frame)[0]]
-        assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery)
-        assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size
+        #thing = frame.jf_frame[unpack_gcmap(frame)[0]]
+        #assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery)
+        #assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to