[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