[pypy-svn] r64805 - pypy/branch/pyjitpl5/pypy/jit/backend/test

arigo at codespeak.net arigo at codespeak.net
Wed Apr 29 14:57:19 CEST 2009


Author: arigo
Date: Wed Apr 29 14:57:17 2009
New Revision: 64805

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py
Log:
Basic SETFIELD_GC tests.


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py	Wed Apr 29 14:57:17 2009
@@ -21,7 +21,8 @@
 
     def do(self, opnum, argboxes, descr=None):
         v_result = execute(self.cpu, opnum, argboxes, descr)
-        v_result = BoxInt(v_result.value)
+        if isinstance(v_result, ConstInt):
+            v_result = BoxInt(v_result.value)
         self.loop.operations.append(ResOperation(opnum, argboxes, v_result,
                                                  descr))
         return v_result
@@ -103,8 +104,8 @@
                 print >>s, '              )'
                 written[S] = True
             print >>s, '    p = lltype.malloc(%s)' % (S._name,)
-            for name in S._names:
-                print >>s, '    p.%s = %d' % (name, getattr(container, name))
+            for name, value in fields.items():
+                print >>s, '    p.%s = %d' % (name, value)
             writevar(v, 'preb')
             print >>s, '    %s.value =' % (names[v],),
             print >>s, 'lltype.cast_opaque_ptr(llmemory.GCREF, p)'
@@ -207,14 +208,28 @@
             builder.should_fail_by_num = len(builder.loop.operations) - 1
 
 class GetFieldOp(AbstractOperation):
-    def produce_into(self, builder, r):
+    def field_name(self, builder, r):
         v = builder.get_structptr_var(r)
         S = lltype.typeOf(v.value._obj.container)
         name = r.choice(S._names)
         descr = builder.cpu.fielddescrof(S, name)
         descr._random_info = 'cpu.fielddescrof(%s, %r)' % (S._name, name)
+        return v, descr
+
+    def produce_into(self, builder, r):
+        v, descr = self.field_name(builder, r)
         self.put(builder, [v], descr)
 
+class SetFieldOp(GetFieldOp):
+    def produce_into(self, builder, r):
+        v, descr = self.field_name(builder, r)
+        if r.random() < 0.3:
+            w = ConstInt(r.random_integer())
+        else:
+            w = r.choice(builder.intvars)
+        builder.do(self.opnum, [v, w], descr)
+
+
 # ____________________________________________________________
 
 OPERATIONS = []
@@ -259,8 +274,10 @@
 OPERATIONS.append(UnaryOperation(rop.INT_IS_TRUE, boolres=True))
 OPERATIONS.append(BooleanUnaryOperation(rop.BOOL_NOT, boolres=True))
 
-OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC))
-OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC_PURE))
+for i in range(3):      # make more common
+    OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC))
+    OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC_PURE))
+    OPERATIONS.append(SetFieldOp(rop.SETFIELD_GC))
 
 # ____________________________________________________________
 
@@ -335,6 +352,11 @@
     for v in endvars:
         expected[v] = v.value
 
+    for v, fields in builder.prebuilt_ptr_consts:
+        container = v.value._obj.container
+        for name, value in fields.items():
+            setattr(container, name, value)
+
     for i, v in enumerate(valueboxes):
         cpu.set_future_value_int(i, v.value)
     op = cpu.execute_operations(loop)



More information about the Pypy-commit mailing list