[pypy-commit] pypy default: add a -live- to greenfield op since it can call nonstandard virtualizable, how to reproduce a crash with a test
fijal
pypy.commits at gmail.com
Thu Mar 17 10:16:12 EDT 2016
Author: fijal
Branch:
Changeset: r83108:75ef4a7f1830
Date: 2016-03-17 16:15 +0200
http://bitbucket.org/pypy/pypy/changeset/75ef4a7f1830/
Log: add a -live- to greenfield op since it can call nonstandard
virtualizable, how to reproduce a crash with a test
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -784,11 +784,13 @@
return []
# check for _immutable_fields_ hints
immut = v_inst.concretetype.TO._immutable_field(c_fieldname.value)
+ need_live = False
if immut:
if (self.callcontrol is not None and
self.callcontrol.could_be_green_field(v_inst.concretetype.TO,
c_fieldname.value)):
pure = '_greenfield'
+ need_live = True
else:
pure = '_pure'
else:
@@ -815,10 +817,12 @@
descr1 = self.cpu.fielddescrof(
v_inst.concretetype.TO,
quasiimmut.get_mutate_field_name(c_fieldname.value))
- op1 = [SpaceOperation('-live-', [], None),
+ return [SpaceOperation('-live-', [], None),
SpaceOperation('record_quasiimmut_field',
[v_inst, descr, descr1], None),
op1]
+ if need_live:
+ return [SpaceOperation('-live-', [], None), op1]
return op1
def rewrite_op_setfield(self, op, override_type=None):
diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py
--- a/rpython/jit/codewriter/test/test_jtransform.py
+++ b/rpython/jit/codewriter/test/test_jtransform.py
@@ -1012,7 +1012,8 @@
v1 = varoftype(lltype.Ptr(S))
v2 = varoftype(lltype.Char)
op = SpaceOperation('getfield', [v1, Constant('x', lltype.Void)], v2)
- op1 = Transformer(FakeCPU(), FakeCC()).rewrite_operation(op)
+ op0, op1 = Transformer(FakeCPU(), FakeCC()).rewrite_operation(op)
+ assert op0.opname == '-live-'
assert op1.opname == 'getfield_gc_i_greenfield'
assert op1.args == [v1, ('fielddescr', S, 'x')]
assert op1.result == v2
More information about the pypy-commit
mailing list