[pypy-svn] r13618 - pypy/dist/pypy/translator/goal

arigo at codespeak.net arigo at codespeak.net
Mon Jun 20 14:48:18 CEST 2005


Author: arigo
Date: Mon Jun 20 14:48:16 2005
New Revision: 13618

Modified:
   pypy/dist/pypy/translator/goal/targetrpystone2.py
Log:
Checking that rpystone2 appears to do its job: the global variables are the
same after running it through GenC than after running it over Python.


Modified: pypy/dist/pypy/translator/goal/targetrpystone2.py
==============================================================================
--- pypy/dist/pypy/translator/goal/targetrpystone2.py	(original)
+++ pypy/dist/pypy/translator/goal/targetrpystone2.py	Mon Jun 20 14:48:16 2005
@@ -1,6 +1,7 @@
 import buildcache2
 from pypy.objspace.std.objspace import StdObjSpace
 from pypy.translator.test import rpystone
+from pypy.translator.c.symboltable import getsymboltable
 
 # __________  Entry point  __________
 
@@ -9,7 +10,7 @@
 rpystone.setslow(False)
 
 def entry_point():
-    return rpystone.pystones(LOOPS)
+    return rpystone.pystones(LOOPS), id(rpystone.g)
     
 # _____ Define and setup target _____
 def target():
@@ -19,7 +20,7 @@
 
 def run(c_entry_point):
     res = c_entry_point()
-    benchtime, stones = res
+    (benchtime, stones), g_addr = res
     print "translated rpystone.pystones/fast time for %d passes = %g" % \
         (LOOPS, benchtime)
     print "This machine benchmarks at %g translated rpystone/fast pystones/second" % stones
@@ -28,8 +29,54 @@
     print "rpystone.pystones/fast time for %d passes = %g" % \
         (50000, benchtime)
     print "This machine benchmarks at %g rpystone/fast pystones/second" % stones
+    symtable = getsymboltable(c_entry_point.__module__)
+    check_g_results(symtable, g_addr)
 
 
+def check_g_results(symtable, g_addr):
+    try:
+        g_ptr = symtable[g_addr]
+    except KeyError:
+        print "No low-level equivalent of structure 'g' found."
+    else:
+        assert g_ptr.inst_BoolGlob == rpystone.g.BoolGlob
+        assert g_ptr.inst_Char1Glob == rpystone.g.Char1Glob
+        assert g_ptr.inst_Char2Glob == rpystone.g.Char2Glob
+        compare_array_of_array(g_ptr.inst_Array2Glob, rpystone.g.Array2Glob)
+        compare_record(g_ptr.inst_PtrGlb, rpystone.g.PtrGlb)
+        compare_record(g_ptr.inst_PtrGlbNext, rpystone.g.PtrGlbNext)
+
+
+def compare_array_of_array(array, pylist):
+    assert len(array.items) == len(pylist)
+    for i in range(len(pylist)):
+        x1 = array.items[i]
+        x2 = pylist[i]
+        compare_array(x1, x2)
+
+def compare_array(array, pylist):
+    assert len(array.items) == len(pylist)
+    for i in range(len(pylist)):
+        x1 = array.items[i]
+        x2 = pylist[i]
+        assert x1 == x2
+
+def compare_record(struct, pyrecord):
+    if pyrecord is None:
+        assert not struct
+    else:
+        assert struct
+        compare_record(struct.inst_PtrComp, pyrecord.PtrComp)
+        assert struct.inst_Discr == pyrecord.Discr
+        assert struct.inst_EnumComp == pyrecord.EnumComp
+        assert struct.inst_IntComp == pyrecord.IntComp
+        compare_string(struct.inst_StringComp, pyrecord.StringComp)
+
+def compare_string(str, pystr):
+    assert len(str.chars) == len(pystr)
+    for i in range(len(pystr)):
+        assert str.chars[i] == pystr[i]
+
 #if __name__ == "__main__":
 #    # just run it without translation
 #    LOOPS = 50000



More information about the Pypy-commit mailing list