[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