[pypy-commit] pypy op_malloc_gc: - choose an arbitrary upper limit, and beyond it, generate a regular

arigo noreply at buildbot.pypy.org
Mon Dec 19 09:44:43 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r50701:5467c010ecde
Date: 2011-12-19 09:40 +0100
http://bitbucket.org/pypy/pypy/changeset/5467c010ecde/

Log:	- choose an arbitrary upper limit, and beyond it, generate a regular
	malloc_array even if the length is constant

	- fix boehm translation

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -116,6 +116,7 @@
 class GcLLDescr_boehm(GcLLDescription):
     kind                  = 'boehm'
     moving_gc             = False
+    round_up              = False
     gcrootmap             = None
     write_barrier_descr   = None
     fielddescr_tid        = None
@@ -617,6 +618,7 @@
 class GcLLDescr_framework(GcLLDescription):
     DEBUG = False    # forced to True by x86/test/test_zrpy_gc.py
     kind = 'framework'
+    round_up = True
 
     def __init__(self, gcdescr, translator, rtyper, llop1=llop,
                  really_not_translated=False):
diff --git a/pypy/jit/backend/llsupport/rewrite.py b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -112,7 +112,7 @@
                 pass    # total_size is still -1
         elif arraydescr.itemsize == 0:
             total_size = arraydescr.basesize
-        if total_size >= 0:
+        if 0 <= total_size <= 0xffffff:     # up to 16MB, arbitrarily
             self.gen_malloc_nursery(total_size, op.result)
             self.gen_initialize_tid(op.result, arraydescr.tid)
             self.gen_initialize_len(op.result, v_length, arraydescr.lendescr)
@@ -209,11 +209,7 @@
         """Try to generate or update a CALL_MALLOC_NURSERY.
         If that fails, generate a plain CALL_MALLOC_GC instead.
         """
-        if size <= (sys.maxint & ~(WORD-1)):
-            size = self.round_up_for_allocation(size)
-        else:
-            size = sys.maxint  #corner case: generate a malloc that always fail
-        #
+        size = self.round_up_for_allocation(size)
         if not self.gc_ll_descr.can_use_nursery_malloc(size):
             self.gen_malloc_fixedsize(size, v_result)
             return
@@ -319,6 +315,8 @@
         self.gen_write_barrier(v_base, v_value)
 
     def round_up_for_allocation(self, size):
+        if not self.gc_ll_descr.round_up:
+            return size
         if self.gc_ll_descr.translate_support_code:
             from pypy.rpython.lltypesystem import llarena
             return llarena.round_up_for_allocation(
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -149,7 +149,7 @@
             jump()
         """, """
             [p1]
-            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 104, \
+            p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102, \
                                 descr=malloc_fixedsize_descr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
             jump()
@@ -400,6 +400,20 @@
             jump()
         """)
 
+    def test_rewrite_assembler_huge_size(self):
+        # "huge" is defined as "larger than 0xffffff bytes, or 16MB"
+        self.check_rewrite("""
+            []
+            p0 = new_array(20000000, descr=bdescr)
+            jump()
+        """, """
+            []
+            p0 = call_malloc_gc(ConstClass(malloc_array), 1, \
+                                %(bdescr.tid)d, 20000000,    \
+                                descr=malloc_array_descr)
+            jump()
+        """)
+
     def test_new_with_vtable(self):
         self.check_rewrite("""
             []


More information about the pypy-commit mailing list