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

arigo at codespeak.net arigo at codespeak.net
Wed Apr 29 15:08:09 CEST 2009


Author: arigo
Date: Wed Apr 29 15:08:09 2009
New Revision: 64806

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py
Log:
Basic NEW 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 15:08:09 2009
@@ -31,7 +31,7 @@
         if self.boolvars and r.random() < 0.8:
             v = r.choice(self.boolvars)
         elif self.ptrvars and r.random() < 0.4:
-            v = r.choice(self.ptrvars)
+            v, S = r.choice(self.ptrvars)
             if r.random() < 0.5:
                 v = self.do(rop.OONONNULL, [v])
             else:
@@ -43,14 +43,15 @@
 
     def get_structptr_var(self, r):
         if self.ptrvars and r.random() < 0.8:
-            v = r.choice(self.ptrvars)
+            v, S = r.choice(self.ptrvars)
         elif self.prebuilt_ptr_consts and r.random() < 0.7:
-            v, _ = r.choice(self.prebuilt_ptr_consts)
+            v, S, _ = r.choice(self.prebuilt_ptr_consts)
         else:
             p = self.get_random_structure(r)
+            S = lltype.typeOf(p).TO
             v = ConstPtr(lltype.cast_opaque_ptr(llmemory.GCREF, p))
-            self.prebuilt_ptr_consts.append((v, self.field_values(p)))
-        return v
+            self.prebuilt_ptr_consts.append((v, S, self.field_values(p)))
+        return v, S
 
     def get_random_structure_type(self, r):
         fields = []
@@ -86,7 +87,7 @@
         #
         for v in self.intvars:
             writevar(v, 'v')
-        for v in self.ptrvars:
+        for v, S in self.ptrvars:
             writevar(v, 'p')
         for op in self.loop.operations:
             v = op.result
@@ -94,9 +95,7 @@
                 writevar(v, 'tmp')
         #
         written = {}
-        for v, fields in self.prebuilt_ptr_consts:
-            container = v.value._obj.container
-            S = lltype.typeOf(container)
+        for v, S, fields in self.prebuilt_ptr_consts:
             if S not in written:
                 print >>s, '    %s = lltype.GcStruct(%r,' % (S._name, S._name)
                 for name in S._names:
@@ -207,28 +206,42 @@
             builder.should_fail_by = op.suboperations[0]
             builder.should_fail_by_num = len(builder.loop.operations) - 1
 
-class GetFieldOp(AbstractOperation):
-    def field_name(self, builder, r):
-        v = builder.get_structptr_var(r)
-        S = lltype.typeOf(v.value._obj.container)
+class GetFieldOperation(AbstractOperation):
+    def field_descr(self, builder, r):
+        v, S = builder.get_structptr_var(r)
         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)
+        while True:
+            try:
+                v, descr = self.field_descr(builder, r)
+                self.put(builder, [v], descr)
+            except lltype.UninitializedMemoryAccess:
+                continue
+            break
 
-class SetFieldOp(GetFieldOp):
+class SetFieldOperation(GetFieldOperation):
     def produce_into(self, builder, r):
-        v, descr = self.field_name(builder, r)
+        v, descr = self.field_descr(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)
 
+class NewOperation(AbstractOperation):
+    def size_descr(self, builder, S):
+        descr = builder.cpu.sizeof(S)
+        descr._random_info = 'cpu.sizeof(%s)' % (S._name,)
+        return descr
+
+    def produce_into(self, builder, r):
+        S = builder.get_random_structure_type(r)
+        v_ptr = builder.do(self.opnum, [], self.size_descr(builder, S))
+        builder.ptrvars.append((v_ptr, S))
 
 # ____________________________________________________________
 
@@ -274,10 +287,11 @@
 OPERATIONS.append(UnaryOperation(rop.INT_IS_TRUE, boolres=True))
 OPERATIONS.append(BooleanUnaryOperation(rop.BOOL_NOT, boolres=True))
 
-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))
+for i in range(4):      # make more common
+    OPERATIONS.append(GetFieldOperation(rop.GETFIELD_GC))
+    OPERATIONS.append(GetFieldOperation(rop.GETFIELD_GC_PURE))
+    OPERATIONS.append(SetFieldOperation(rop.SETFIELD_GC))
+    OPERATIONS.append(NewOperation(rop.NEW))
 
 # ____________________________________________________________
 
@@ -352,7 +366,7 @@
     for v in endvars:
         expected[v] = v.value
 
-    for v, fields in builder.prebuilt_ptr_consts:
+    for v, S, fields in builder.prebuilt_ptr_consts:
         container = v.value._obj.container
         for name, value in fields.items():
             setattr(container, name, value)



More information about the Pypy-commit mailing list