Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60740:c8a77fc582c4
Date: 2013-01-30 18:29 +0200
http://bitbucket.org/pypy/pypy/changeset/c8a77fc582c4/

Log:    memcpy called like that cannot collect (and does not free the GIL
        either)

diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1143,9 +1143,10 @@
         return genop_cmp_guard_float
 
     def _emit_call(self, x, arglocs, start=0, tmp=eax,
-                   argtypes=None, callconv=FFI_DEFAULT_ABI):
+                   argtypes=None, callconv=FFI_DEFAULT_ABI, can_collect=True):
         if IS_X86_64:
-            return self._emit_call_64(x, arglocs, start, argtypes)
+            return self._emit_call_64(x, arglocs, start, argtypes,
+                                      can_collect=can_collect)
         XXX
         p = 0
         n = len(arglocs)
@@ -1183,7 +1184,7 @@
         # the called function just added 'p' to ESP, by subtracting it again.
         self.mc.SUB_ri(esp.value, p)
 
-    def _emit_call_64(self, x, arglocs, start, argtypes):
+    def _emit_call_64(self, x, arglocs, start, argtypes, can_collect=True):
         src_locs = []
         dst_locs = []
         xmm_src_locs = []
@@ -1261,13 +1262,16 @@
             dst_locs.append(r10)
             x = r10
         remap_frame_layout(self, src_locs, dst_locs, X86_64_SCRATCH_REG)
-        self.push_gcmap(self.mc, self._regalloc.get_gcmap([eax], noregs=True),
-                        store=True)
+        if can_collect:
+            self.push_gcmap(self.mc, self._regalloc.get_gcmap([eax], 
noregs=True),
+                            store=True)
         self.mc.CALL(x)
-        self._reload_frame_if_necessary(self.mc)
+        if can_collect:
+            self._reload_frame_if_necessary(self.mc)
         if align:
             self.mc.ADD_ri(esp.value, align * WORD)
-        self.pop_gcmap(self.mc)
+        if can_collect:
+            self.pop_gcmap(self.mc)
 
     def _reload_frame_if_necessary(self, mc):
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
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
@@ -1151,7 +1151,8 @@
         self.rm.before_call()
         self.xrm.before_call()
         self.assembler._emit_call(imm(self.assembler.memcpy_addr),
-                                  [dstaddr_loc, srcaddr_loc, length_loc])
+                                  [dstaddr_loc, srcaddr_loc, length_loc],
+                                  can_collect=False)
         self.rm.possibly_free_var(length_box)
         self.rm.possibly_free_var(dstaddr_box)
         self.rm.possibly_free_var(srcaddr_box)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to