[pypy-svn] r51387 - in pypy/dist/pypy/jit/codegen/cli: . test

antocuni at codespeak.net antocuni at codespeak.net
Mon Feb 11 16:32:40 CET 2008


Author: antocuni
Date: Mon Feb 11 16:32:36 2008
New Revision: 51387

Modified:
   pypy/dist/pypy/jit/codegen/cli/dumpgenerator.py
   pypy/dist/pypy/jit/codegen/cli/operation.py
   pypy/dist/pypy/jit/codegen/cli/rgenop.py
   pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
Log:
labels must be marked just before the operations they refer to; one
more test passes



Modified: pypy/dist/pypy/jit/codegen/cli/dumpgenerator.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/dumpgenerator.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/dumpgenerator.py	Mon Feb 11 16:32:36 2008
@@ -2,15 +2,17 @@
     def __init__(self, il, filename='dynamicmethod.il'):
         self.il = il
         self.out = file(filename, 'w')
-        self.localcount = 0
+        self.locals = {}
         self.labels = {}
 
     def _fmt(self, arg):
-        from System.Reflection import Emit
+        from System.Reflection import Emit, FieldInfo
         if isinstance(arg, Emit.LocalBuilder):
             return 'v%d' % arg.LocalIndex
         elif isinstance(arg, Emit.Label):
             return 'label%d' % self.labels[arg]
+        elif isinstance(arg, FieldInfo):
+            return '%s %s::%s' % (arg.FieldType.FullName, arg.DeclaringType.FullName, arg.Name)
         return repr(arg)
 
     def Emit(self, opcode, *args):
@@ -18,8 +20,22 @@
         self.out.write('    %s %s\n' % (opcode.Name, arglist))
         return self.il.Emit(opcode, *args)
 
+    def EmitCall(self, opcode, meth, vartypes):
+        assert vartypes is None
+        rettype = meth.ReturnType.FullName
+        clsname = meth.DeclaringType.FullName
+        params = meth.GetParameters()
+        types = [p.ParameterType.FullName for p in params]
+        arglist = ', '.join(types)
+        desc = '%s %s::%s(%s)' % (rettype, clsname, meth.Name, arglist)
+        self.out.write('    %s %s\n' % (opcode.Name, desc))
+        return self.il.EmitCall(opcode, meth, vartypes)
+
     def DeclareLocal(self, t):
-        return self.il.DeclareLocal(t)
+        v = self.il.DeclareLocal(t)
+        vname = self._fmt(v)
+        self.locals[vname] = t
+        return v
 
     def DefineLabel(self):
         lbl = self.il.DefineLabel()
@@ -31,3 +47,8 @@
         self.out.write('\n%s:\n' % self._fmt(lbl))
         return self.il.MarkLabel(lbl)
 
+    def __del__(self):
+        decls = ['%s %s' % (t.FullName, name) for name, t in self.locals.iteritems()]
+        self.out.write('.locals init (')
+        self.out.write(', '.join(decls))
+        self.out.write(')\n')

Modified: pypy/dist/pypy/jit/codegen/cli/operation.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/operation.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/operation.py	Mon Feb 11 16:32:36 2008
@@ -72,6 +72,17 @@
         self.gv_x.load(self.il)
         self.gv_res().store(self.il)
 
+class MarkLabel(Operation):
+
+    def __init__(self, il, label):
+        self.il = il
+        self.label = label
+
+    def restype(self):
+        return None
+
+    def emit(self):
+        self.il.MarkLabel(self.label)
 
 class FollowLink(Operation):
     

Modified: pypy/dist/pypy/jit/codegen/cli/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/rgenop.py	Mon Feb 11 16:32:36 2008
@@ -310,7 +310,7 @@
             op.emit()
             args_gv[i] = op.gv_res()
         label = self.il.DefineLabel()
-        self.il.MarkLabel(label)
+        self.emit(ops.MarkLabel(self.il, label))
         return Label(label, args_gv)
 
     def _jump_if(self, gv_condition, opcode):

Modified: pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/cli/test/test_rgenop.py	Mon Feb 11 16:32:36 2008
@@ -23,6 +23,7 @@
         'test_multiple_cmps',
         'test_flipped_cmp_with_immediate',
         'test_tight_loop',
+        'test_jump_to_block_with_many_vars',
         ]
 
     for p in prefixes:



More information about the Pypy-commit mailing list