[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