[pypy-commit] pypy gc_no_cleanup_nursery: codewriter support for new_array_clear
fijal
noreply at buildbot.pypy.org
Thu Sep 25 11:12:37 CEST 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73694:cef273238737
Date: 2014-09-25 11:11 +0200
http://bitbucket.org/pypy/pypy/changeset/cef273238737/
Log: codewriter support for new_array_clear
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
@@ -612,18 +612,14 @@
# XXX only strings or simple arrays for now
ARRAY = op.args[0].value
arraydescr = self.cpu.arraydescrof(ARRAY)
- op1 = SpaceOperation('new_array', [op.args[2], arraydescr],
- op.result)
if op.args[1].value.get('zero', False):
- # complicated logic here - we only need to emit zero_contents
- # in case this is an array of non-gcptrs and non-structs
- if isinstance(ARRAY.OF, lltype.Ptr) and ARRAY.OF._needsgc():
- pass
- elif isinstance(ARRAY.OF, lltype.Struct):
- pass
- else:
- return self.zero_contents([op1], op.result, ARRAY)
- return op1
+ opname = 'new_array_clear'
+ elif ((isinstance(ARRAY.OF, lltype.Ptr) and ARRAY.OF._needsgc()) or
+ isinstance(ARRAY.OF, lltype.Struct)):
+ opname = 'new_array_clear'
+ else:
+ opname = 'new_array'
+ return SpaceOperation(opname, [op.args[2], arraydescr], op.result)
def zero_contents(self, ops, v, TYPE):
if isinstance(TYPE, lltype.Struct):
@@ -639,9 +635,7 @@
self.extend_with(ops, self.rewrite_op_setfield(op,
override_type=TYPE))
elif isinstance(TYPE, lltype.Array):
- arraydescr = self.cpu.arraydescrof(TYPE)
- ops.append(SpaceOperation('clear_array_contents',
- [v, arraydescr], None))
+ assert False # this operation disappeared
else:
raise TypeError("Expected struct or array, got '%r'", (TYPE,))
if len(ops) == 1:
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
@@ -1061,9 +1061,8 @@
v2 = varoftype(c_A.value)
c_flags = Constant({"flavor": "gc", "zero": True}, lltype.Void)
op = SpaceOperation('malloc_varsize', [c_A, c_flags, v1], v2)
- op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
- assert op1.opname == 'new_array'
- assert op2.opname == 'clear_array_contents'
+ op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ assert op1.opname == 'new_array_clear'
def test_str_concat():
# test that the oopspec is present and correctly transformed
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1152,6 +1152,7 @@
@arguments("cpu", "i", "d", returns="r")
def bhimpl_new_array(cpu, length, arraydescr):
return cpu.bh_new_array(length, arraydescr)
+ bhimpl_new_array_clear = bhimpl_new_array
@arguments("cpu", "r", "i", "d", returns="i")
def bhimpl_getarrayitem_gc_i(cpu, array, index, arraydescr):
More information about the pypy-commit
mailing list