[pypy-svn] r68620 - in pypy/trunk/pypy/jit: backend metainterp/test

pedronis at codespeak.net pedronis at codespeak.net
Mon Oct 19 11:51:16 CEST 2009


Author: pedronis
Date: Mon Oct 19 11:51:16 2009
New Revision: 68620

Modified:
   pypy/trunk/pypy/jit/backend/loopviewer.py
   pypy/trunk/pypy/jit/backend/showstats.py
   pypy/trunk/pypy/jit/metainterp/test/oparser.py
   pypy/trunk/pypy/jit/metainterp/test/test_oparser.py
Log:
(cfbolz, pedronis): refactor the oparser a bit to make it possible to not give
it a namespace.


Modified: pypy/trunk/pypy/jit/backend/loopviewer.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/loopviewer.py	(original)
+++ pypy/trunk/pypy/jit/backend/loopviewer.py	Mon Oct 19 11:51:16 2009
@@ -9,17 +9,11 @@
 from pypy.jit.metainterp.history import ConstInt
 from pypy.rpython.lltypesystem import llmemory, lltype
 
-class AllDict(dict):
-    def __getitem__(self, item):
-        return lltype.nullptr(llmemory.GCREF.TO)
-
-alldict = AllDict()
-
 def main(loopnum, loopfile):
     data = py.path.local(loopfile).read()
     loops = split_logs_into_loops(data)
     inp = loops[loopnum]
-    loop = parse(inp, namespace=alldict)
+    loop = parse(inp, no_namespace=True)
     loop.show()
 
 if __name__ == '__main__':

Modified: pypy/trunk/pypy/jit/backend/showstats.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/showstats.py	(original)
+++ pypy/trunk/pypy/jit/backend/showstats.py	Mon Oct 19 11:51:16 2009
@@ -5,16 +5,10 @@
 from pypy.jit.metainterp.resoperation import rop
 from pypy.rpython.lltypesystem import lltype, llmemory
 
-class AllDict(dict):
-    def __getitem__(self, item):
-        return lltype.nullptr(llmemory.GCREF.TO)
-
-alldict = AllDict()
-
 def main(argv):
     parts = split_logs_into_loops(py.path.local(argv[0]).read())
     for oplist in parts:
-        loop = parse(oplist, namespace=alldict)
+        loop = parse(oplist, no_namespace=True)
         num_ops = 0
         num_dmp = 0
         num_guards = 0

Modified: pypy/trunk/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/oparser.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/oparser.py	Mon Oct 19 11:51:16 2009
@@ -50,18 +50,45 @@
 
 
 class OpParser(object):
-    def __init__(self, descr, cpu, namespace, type_system, boxkinds,
+    def __init__(self, input, cpu, namespace, type_system, boxkinds,
                  invent_fail_descr=default_fail_descr):
-        self.descr = descr
+        self.input = input
         self.vars = {}
         self.cpu = cpu
-        self.consts = namespace
+        self._consts = namespace
         self.type_system = type_system
         self.boxkinds = boxkinds or {}
-        self._cache = namespace.setdefault('_CACHE_', {})
+        if namespace is not None:
+            self._cache = namespace.setdefault('_CACHE_', {})
+        else:
+            self._cache = {}
         self.invent_fail_descr = invent_fail_descr
         self.looptoken = LoopToken()
 
+    def get_const(self, name, typ):
+        if self._consts is None:
+            return name
+        obj = self._consts[name]
+        if self.type_system == 'lltype':
+            if typ == 'ptr':
+                return ConstPtr(obj)
+            else:
+                assert typ == 'class'
+                return ConstAddr(llmemory.cast_ptr_to_adr(obj),
+                                 self.cpu)
+        else:
+            if typ == 'ptr':
+                return ConstObj(obj)
+            else:
+                assert typ == 'class'
+                return ConstObj(ootype.cast_to_object(obj))
+
+    def get_descr(self, poss_descr):
+        if poss_descr.startswith('<'):
+            return None
+        else:
+            return self._consts[poss_descr]
+
     def box_for_var(self, elem):
         try:
             return self._cache[self.type_system, elem]
@@ -122,11 +149,7 @@
                                                        llstr(info)))
             if arg.startswith('ConstClass('):
                 name = arg[len('ConstClass('):-1]
-                if self.type_system == 'lltype':
-                    return ConstAddr(llmemory.cast_ptr_to_adr(self.consts[name]),
-                                     self.cpu)
-                else:
-                    return ConstObj(ootype.cast_to_object(self.consts[name]))
+                return self.get_const(name, 'class')
             elif arg == 'None':
                 return None
             elif arg == 'NULL':
@@ -136,10 +159,7 @@
                     return ConstObj(ConstObj.value)
             elif arg.startswith('ConstPtr('):
                 name = arg[len('ConstPtr('):-1]
-                if self.type_system == 'lltype':
-                    return ConstPtr(self.consts[name])
-                else:
-                    return ConstObj(self.consts[name])
+                return self.get_const(name, 'ptr')
             return self.vars[arg]
 
     def parse_op(self, line):
@@ -168,10 +188,7 @@
 
             poss_descr = allargs[-1].strip()
             if poss_descr.startswith('descr='):
-                if poss_descr.startswith('descr=<'):
-                    descr = None
-                else:
-                    descr = self.consts[poss_descr[len('descr='):]]
+                descr = self.get_descr(poss_descr[len('descr='):])
                 allargs = allargs[:-1]        
             for arg in allargs:
                 arg = arg.strip()
@@ -232,7 +249,7 @@
             return self.parse_op_no_result(line)
 
     def parse(self):
-        lines = self.descr.splitlines()
+        lines = self.input.splitlines()
         ops = []
         newlines = []
         for line in lines:
@@ -284,11 +301,12 @@
         inpargs = self.parse_header_line(line[1:-1])
         return base_indent, inpargs
 
-def parse(descr, cpu=None, namespace=None, type_system='lltype',
-          boxkinds=None, invent_fail_descr=default_fail_descr):
-    if namespace is None:
+def parse(input, cpu=None, namespace=None, type_system='lltype',
+          boxkinds=None, invent_fail_descr=default_fail_descr,
+          no_namespace=False):
+    if namespace is None and not no_namespace:
         namespace = {}
-    return OpParser(descr, cpu, namespace, type_system, boxkinds,
+    return OpParser(input, cpu, namespace, type_system, boxkinds,
                     invent_fail_descr).parse()
 
 def pure_parse(*args, **kwds):

Modified: pypy/trunk/pypy/jit/metainterp/test/test_oparser.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_oparser.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_oparser.py	Mon Oct 19 11:51:16 2009
@@ -161,8 +161,7 @@
     loop = parse(x)
     # assert did not explode
 
-def test_split_logs_into_loops():
-    text = '''\
+examplelog = '''\
 # Loop0 (loop), 12 ops
 [i0, i1]
 debug_merge_point('(no jitdriver.get_printable_location!)')
@@ -220,12 +219,19 @@
 debug_merge_point('(no jitdriver.get_printable_location!)')
 jump(i6, i4, descr=<Loop0>)
 '''
-    parts = split_logs_into_loops(text)
+
+def test_split_logs_into_loops():
+    parts = split_logs_into_loops(examplelog)
     assert len(parts) == 5
-    assert "\n".join(parts) == text.strip()
+    assert "\n".join(parts) == examplelog.strip()
     for part, typ in zip(parts,
             ["Loop0", "Loop1",
              "bridge out of Guard5",
              "bridge out of Guard9",
              "bridge out of Guard12"]):
         assert part.startswith("# %s" % typ)
+
+def test_parse_no_namespace():
+    parts = split_logs_into_loops(examplelog)
+    for part in parts:
+        loop = parse(part, no_namespace=True)



More information about the Pypy-commit mailing list