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

arigo at codespeak.net arigo at codespeak.net
Mon May 4 22:08:51 CEST 2009


Author: arigo
Date: Mon May  4 22:08:49 2009
New Revision: 65035

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/test/test_ll_random.py
Log:
Test structure fields of type rffi.UCHAR and (disabled for now) rffi.SHORT.


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/test/test_ll_random.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/test/test_ll_random.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/test/test_ll_random.py	Mon May  4 22:08:49 2009
@@ -1,5 +1,5 @@
 import py
-from pypy.rpython.lltypesystem import lltype, llmemory, rclass
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rffi
 from pypy.jit.backend.test import test_random
 from pypy.jit.metainterp.resoperation import ResOperation, rop
 from pypy.jit.metainterp.history import ConstInt, ConstPtr, ConstAddr, BoxPtr
@@ -8,6 +8,7 @@
 from pypy.rpython.llinterp import LLException
 
 class LLtypeOperationBuilder(test_random.OperationBuilder):
+    HAVE_SHORT_FIELDS = False
 
     def __init__(self, *args, **kw):
         test_random.OperationBuilder.__init__(self, *args, **kw)
@@ -36,7 +37,16 @@
             fields.append(('parent', rclass.OBJECT))
             kwds['hints'] = {'vtable': with_vtable._obj}
         for i in range(r.randrange(1, 5)):
-            fields.append(('f%d' % i, lltype.Signed))
+            rval = r.random()
+            if rval < 0.5:
+                TYPE = lltype.Signed
+            elif rval < 0.75:
+                TYPE = rffi.UCHAR
+            else:
+                TYPE = rffi.SHORT
+                if not self.HAVE_SHORT_FIELDS:
+                    TYPE = lltype.Signed
+            fields.append(('f%d' % i, TYPE))
         S = lltype.GcStruct('S%d' % self.counter, *fields, **kwds)
         self.counter += 1
         return S
@@ -65,7 +75,8 @@
             p = lltype.malloc(S)
         for fieldname in lltype.typeOf(p).TO._names:
             if fieldname != 'parent':
-                setattr(p, fieldname, r.random_integer())
+                TYPE = getattr(S, fieldname)
+                setattr(p, fieldname, rffi.cast(TYPE, r.random_integer()))
         return p
 
     def field_values(self, p):
@@ -124,12 +135,13 @@
         name = r.choice(names)
         descr = builder.cpu.fielddescrof(S, name)
         descr._random_info = 'cpu.fielddescrof(%s, %r)' % (S._name, name)
-        return v, descr
+        TYPE = getattr(S, name)
+        return v, descr, TYPE
 
     def produce_into(self, builder, r):
         while True:
             try:
-                v, descr = self.field_descr(builder, r)
+                v, descr, _ = self.field_descr(builder, r)
                 self.put(builder, [v], descr)
             except lltype.UninitializedMemoryAccess:
                 continue
@@ -137,11 +149,14 @@
 
 class SetFieldOperation(GetFieldOperation):
     def produce_into(self, 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)
+        v, descr, TYPE = self.field_descr(builder, r)
+        while True:
+            if r.random() < 0.3:
+                w = ConstInt(r.random_integer())
+            else:
+                w = r.choice(builder.intvars)
+            if rffi.cast(lltype.Signed, rffi.cast(TYPE, w.value)) == w.value:
+                break
         builder.do(self.opnum, [v, w], descr)
 
 class NewOperation(test_random.AbstractOperation):



More information about the Pypy-commit mailing list