[pypy-commit] pypy fast-newarray: write a test and fix it

fijal noreply at buildbot.pypy.org
Mon Apr 15 23:09:46 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-newarray
Changeset: r63393:4c0c30b1f265
Date: 2013-04-15 23:09 +0200
http://bitbucket.org/pypy/pypy/changeset/4c0c30b1f265/

Log:	write a test and fix it

diff --git a/rpython/jit/backend/llsupport/test/test_gc_integration.py b/rpython/jit/backend/llsupport/test/test_gc_integration.py
--- a/rpython/jit/backend/llsupport/test/test_gc_integration.py
+++ b/rpython/jit/backend/llsupport/test/test_gc_integration.py
@@ -181,6 +181,12 @@
                                                          [lltype.Signed] * 3,
                                                          lltype.Signed)
 
+        def malloc_str(size):
+            self.calls.append(('str', size))
+            return 13
+        self.generate_function('malloc_str', malloc_str, [lltype.Signed],
+                               lltype.Signed)
+
     def get_nursery_free_addr(self):
         return rffi.cast(lltype.Signed, self.addrs)
 
@@ -284,23 +290,26 @@
 
     def test_malloc_nursery_varsize_slowpath(self):
         self.cpu = self.getcpu(None)
-        ops = '''
+        ops = """
         [i0, i1, i2]
         p0 = call_malloc_nursery_varsize(0, 8, i0, descr=arraydescr)
         p1 = call_malloc_nursery_varsize(0, 5, i1, descr=arraydescr)
         p3 = call_malloc_nursery_varsize(0, 5, i2, descr=arraydescr)
+        # overflow
         p4 = call_malloc_nursery_varsize(0, 5, i2, descr=arraydescr)
-        # overflow
+        # we didn't collect, so still overflow
+        p5 = call_malloc_nursery_varsize(1, 5, i2, descr=strdescr)
         guard_false(i0) [p0, p1, p3, p4]
-        '''
+        """
         A = lltype.GcArray(lltype.Signed)
         arraydescr = self.cpu.arraydescrof(A)
         arraydescr.tid = 15
         self.interpret(ops, [10, 3, 3],
-                       namespace={'arraydescr': arraydescr})
+                       namespace={'arraydescr': arraydescr,
+                                  'strdescr': arraydescr})
         # check the returned pointers
         gc_ll_descr = self.cpu.gc_ll_descr
-        assert gc_ll_descr.calls == [(8, 15, 10), (5, 15, 3)]
+        assert gc_ll_descr.calls == [(8, 15, 10), (5, 15, 3), ('str', 3)]
         # one fit, one was too large, one was not fitting
 
     def test_malloc_slowpath(self):
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
@@ -2390,11 +2390,17 @@
             self.mc.MOV_si(WORD, itemsize)
             self.mc.MOV(RawEspLoc(WORD * 2, INT), lengthloc)
             self.mc.MOV_si(WORD * 3, arraydescr.tid)
+            addr = self.malloc_slowpath_varsize
         else:
+            if kind == 1:
+                addr = self.malloc_slowpath_str
+            else:
+                assert kind == 2
+                addr = self.malloc_slowpath_unicode
             self.mc.MOV(RawEspLoc(WORD, INT), lengthloc)
         # save the gcmap
         self.push_gcmap(self.mc, gcmap, mov=True)
-        self.mc.CALL(imm(self.malloc_slowpath_varsize))
+        self.mc.CALL(imm(addr))
         offset = self.mc.get_relative_pos() - jmp_adr1
         assert 0 < offset <= 127
         self.mc.overwrite(jmp_adr1-1, chr(offset))


More information about the pypy-commit mailing list