[pypy-commit] pypy default: Test and fix. Probably fixes <Spacelee on pypy-dev>.

arigo noreply at buildbot.pypy.org
Mon Feb 27 14:41:59 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r52926:e91c5cdac576
Date: 2012-02-27 14:41 +0100
http://bitbucket.org/pypy/pypy/changeset/e91c5cdac576/

Log:	Test and fix. Probably fixes <Spacelee on pypy-dev>.

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
@@ -1,6 +1,6 @@
 import sys
 from pypy.rlib.rarithmetic import ovfcheck
-from pypy.jit.metainterp.history import ConstInt, BoxPtr, ConstPtr
+from pypy.jit.metainterp.history import ConstInt, BoxPtr, ConstPtr, BoxInt
 from pypy.jit.metainterp.resoperation import ResOperation, rop
 from pypy.jit.codewriter import heaptracker
 from pypy.jit.backend.llsupport.symbolic import WORD
@@ -96,8 +96,8 @@
     def handle_new_fixedsize(self, descr, op):
         assert isinstance(descr, SizeDescr)
         size = descr.size
-        self.gen_malloc_nursery(size, op.result)
-        self.gen_initialize_tid(op.result, descr.tid)
+        in_nursery = self.gen_malloc_nursery(size, op.result)
+        self.gen_initialize_tid(op.result, descr.tid, in_nursery)
 
     def handle_new_array(self, arraydescr, op):
         v_length = op.getarg(0)
@@ -113,8 +113,8 @@
         elif arraydescr.itemsize == 0:
             total_size = arraydescr.basesize
         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)
+            in_nursery = self.gen_malloc_nursery(total_size, op.result)
+            self.gen_initialize_tid(op.result, arraydescr.tid, in_nursery)
             self.gen_initialize_len(op.result, v_length, arraydescr.lendescr)
         elif self.gc_ll_descr.kind == 'boehm':
             self.gen_boehm_malloc_array(arraydescr, v_length, op.result)
@@ -212,7 +212,7 @@
         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
+            return False
         #
         op = None
         if self._op_malloc_nursery is not None:
@@ -238,12 +238,26 @@
         self._previous_size = size
         self._v_last_malloced_nursery = v_result
         self.recent_mallocs[v_result] = None
+        return True
 
-    def gen_initialize_tid(self, v_newgcobj, tid):
+    def gen_initialize_tid(self, v_newgcobj, tid, in_nursery):
         if self.gc_ll_descr.fielddescr_tid is not None:
             # produce a SETFIELD to initialize the GC header
+            v_tid = ConstInt(tid)
+            if not in_nursery:
+                # important: must preserve the gcflags!  rare case.
+                v_tidbase = BoxInt()
+                v_tidcombined = BoxInt()
+                op = ResOperation(rop.GETFIELD_RAW,
+                                  [v_newgcobj], v_tidbase,
+                                  descr=self.gc_ll_descr.fielddescr_tid)
+                self.newops.append(op)
+                op = ResOperation(rop.INT_OR,
+                                  [v_tidbase, v_tid], v_tidcombined)
+                self.newops.append(op)
+                v_tid = v_tidcombined
             op = ResOperation(rop.SETFIELD_GC,
-                              [v_newgcobj, ConstInt(tid)], None,
+                              [v_newgcobj, v_tid], None,
                               descr=self.gc_ll_descr.fielddescr_tid)
             self.newops.append(op)
 
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
@@ -371,7 +371,9 @@
             p0 = call_malloc_gc(ConstClass(malloc_fixedsize), \
                                 %(bdescr.basesize + 104)d,    \
                                 descr=malloc_fixedsize_descr)
-            setfield_gc(p0, 8765, descr=tiddescr)
+            i0 = getfield_raw(p0, descr=tiddescr)
+            i1 = int_or(i0, 8765)
+            setfield_gc(p0, i1, descr=tiddescr)
             setfield_gc(p0, 103, descr=blendescr)
             jump()
         """)
@@ -437,7 +439,9 @@
             [p1]
             p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 104, \
                                 descr=malloc_fixedsize_descr)
-            setfield_gc(p0, 9315, descr=tiddescr)
+            i0 = getfield_raw(p0, descr=tiddescr)
+            i1 = int_or(i0, 9315)
+            setfield_gc(p0, i1, descr=tiddescr)
             setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
             jump()
         """)


More information about the pypy-commit mailing list