[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