[pypy-commit] pypy gc_no_cleanup_nursery: ZERO_PTR_FIELD in test_ll_random

fijal noreply at buildbot.pypy.org
Mon Sep 15 03:08:45 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73541:9708b696cace
Date: 2014-09-14 19:07 -0600
http://bitbucket.org/pypy/pypy/changeset/9708b696cace/

Log:	ZERO_PTR_FIELD in test_ll_random

diff --git a/rpython/jit/backend/test/test_ll_random.py b/rpython/jit/backend/test/test_ll_random.py
--- a/rpython/jit/backend/test/test_ll_random.py
+++ b/rpython/jit/backend/test/test_ll_random.py
@@ -95,7 +95,10 @@
             fields.append(('parent', rclass.OBJECT))
             kwds['hints'] = {'vtable': with_vtable._obj}
         for i in range(r.randrange(1, 5)):
-            TYPE = self.get_random_primitive_type(r)
+            if r.random() < 0.1:
+                TYPE = llmemory.GCREF
+            else:
+                TYPE = self.get_random_primitive_type(r)
             fields.append(('f%d' % i, TYPE))
         S = type('S%d' % self.counter, *fields, **kwds)
         self.counter += 1
@@ -246,13 +249,41 @@
             op = ResOperation(self.opnum, [v, c_vtable2], None)
             return op, False
 
+class ZeroPtrFieldOperation(test_random.AbstractOperation):
+    def field_descr(self, builder, r):
+        v, S = builder.get_structptr_var(r, )
+        names = S._names
+        if names[0] == 'parent':
+            names = names[1:]
+        choice = []
+        for name in names:
+            FIELD = getattr(S, name)
+            if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
+                choice.append(name)
+        if not choice:
+            raise test_random.CannotProduceOperation
+        name = r.choice(choice)
+        descr = builder.cpu.fielddescrof(S, name)
+        return v, descr.offset
+        
+    def produce_into(self, builder, r):
+        v, offset = self.field_descr(builder, r)
+        builder.do(self.opnum, [v, ConstInt(offset)], None)
+
 class GetFieldOperation(test_random.AbstractOperation):
     def field_descr(self, builder, r):
         v, S = builder.get_structptr_var(r, )
         names = S._names
         if names[0] == 'parent':
             names = names[1:]
-        name = r.choice(names)
+        choice = []
+        for name in names:
+            FIELD = getattr(S, name)
+            if not isinstance(FIELD, lltype.Ptr):
+                choice.append(name)
+        if not choice:
+            raise test_random.CannotProduceOperation
+        name = r.choice(choice)
         descr = builder.cpu.fielddescrof(S, name)
         descr._random_info = 'cpu.fielddescrof(..., %r)' % (name,)
         descr._random_type = S
@@ -274,7 +305,14 @@
                                          array_of_structs=True)
         array = v.getref(lltype.Ptr(A))
         v_index = builder.get_index(len(array), r)
-        name = r.choice(A.OF._names)
+        choice = []
+        for name in A.OF._names:
+            FIELD = getattr(A.OF, name)
+            if not isinstance(FIELD, lltype.Ptr):
+                choice.append(name)
+        if not choice:
+            raise test_random.CannotProduceOperation
+        name = r.choice(choice)
         descr = builder.cpu.interiorfielddescrof(A, name)
         descr._random_info = 'cpu.interiorfielddescrof(..., %r)' % (name,)
         descr._random_type = A
@@ -682,6 +720,7 @@
     OPERATIONS.append(GetFieldOperation(rop.GETFIELD_GC))
     OPERATIONS.append(GetInteriorFieldOperation(rop.GETINTERIORFIELD_GC))
     OPERATIONS.append(SetFieldOperation(rop.SETFIELD_GC))
+    OPERATIONS.append(ZeroPtrFieldOperation(rop.ZERO_PTR_FIELD))
     OPERATIONS.append(SetInteriorFieldOperation(rop.SETINTERIORFIELD_GC))
     OPERATIONS.append(NewOperation(rop.NEW))
     OPERATIONS.append(NewOperation(rop.NEW_WITH_VTABLE))
diff --git a/rpython/jit/backend/test/test_random.py b/rpython/jit/backend/test/test_random.py
--- a/rpython/jit/backend/test/test_random.py
+++ b/rpython/jit/backend/test/test_random.py
@@ -52,10 +52,13 @@
 
     def do(self, opnum, argboxes, descr=None):
         self.fakemetainterp._got_exc = None
-        v_result = execute_nonspec(self.cpu, self.fakemetainterp,
-                                   opnum, argboxes, descr)
-        if isinstance(v_result, Const):
-            v_result = v_result.clonebox()
+        if opnum == rop.ZERO_PTR_FIELD:
+            v_result = None
+        else:
+            v_result = execute_nonspec(self.cpu, self.fakemetainterp,
+                                       opnum, argboxes, descr)
+            if isinstance(v_result, Const):
+                v_result = v_result.clonebox()
         self.loop.operations.append(ResOperation(opnum, argboxes, v_result,
                                                  descr))
         return v_result


More information about the pypy-commit mailing list