[pypy-svn] r61796 - pypy/branch/oo-jit/pypy/jit/codegen/cli
antocuni at codespeak.net
antocuni at codespeak.net
Thu Feb 12 17:28:11 CET 2009
Author: antocuni
Date: Thu Feb 12 17:28:11 2009
New Revision: 61796
Modified:
pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py
Log:
ops, this should have been checked in with r61783
Modified: pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py (original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/operation.py Thu Feb 12 17:28:11 2009
@@ -2,7 +2,7 @@
from pypy.rlib.objectmodel import specialize
from pypy.rlib.rarithmetic import intmask
from pypy.rpython.ootypesystem import ootype
-from pypy.translator.cli.dotnet import CLR, typeof, new_array
+from pypy.translator.cli.dotnet import CLR, typeof, new_array, init_array
from pypy.translator.cli import opcodes as cli_opcodes
System = CLR.System
OpCodes = System.Reflection.Emit.OpCodes
@@ -453,10 +453,12 @@
elif step is cli_opcodes.StoreResult:
body.append('self.storeResult()')
elif isinstance(step, str):
- if 'call' in step:
- return # XXX, fix this
- attrname = opcode2attrname(step)
- body.append('self.meth.il.Emit(OpCodes.%s)' % attrname)
+ if step.startswith('call '):
+ signature = step[len('call '):]
+ renderCall(body, signature)
+ else:
+ attrname = opcode2attrname(step)
+ body.append('self.meth.il.Emit(OpCodes.%s)' % attrname)
elif isinstance(step, cli_opcodes.MapException):
# MapException is supported only if it's the only element of the
# instr list, look inside RenderOp
@@ -500,6 +502,32 @@
else:
assert False, 'Unknown exception type'
+def renderCall(body, signature):
+ # signature is like this:
+ # int64 class [mscorlib]System.Foo::Bar(int64, int32)
+
+ typenames = {
+ 'int32': 'System.Int32',
+ 'int64': 'System.Int64',
+ 'float64': 'System.Double',
+ }
+
+ restype, _, signature = signature.split(' ', 3)
+ assert signature.startswith('[mscorlib]'), 'external assemblies '\
+ 'not supported'
+ signature = signature[len('[mscorlib]'):]
+ typename, signature = signature.split('::')
+ methname, signature = signature.split('(')
+ assert signature.endswith(')')
+ params = signature[:-1].split(',')
+ params = map(str.strip, params)
+ params = [typenames.get(p, p) for p in params]
+ params = ['typeof(%s)' % p for p in params]
+
+ body.append("t = System.Type.GetType('%s')" % typename)
+ body.append("params = init_array(System.Type, %s)" % ', '.join(params))
+ body.append("methinfo = t.GetMethod('%s', params)" % methname)
+ body.append("self.meth.il.Emit(OpCodes.Call, methinfo)")
UNARYOPS = fillops(cli_opcodes.unary_ops, "UnaryOp")
BINARYOPS = fillops(cli_opcodes.binary_ops, "BinaryOp")
More information about the Pypy-commit
mailing list