[pypy-svn] r65123 - in pypy/branch/pyjitpl5/pypy/jit/backend: cli cli/test llgraph test
antocuni at codespeak.net
antocuni at codespeak.net
Thu May 7 10:44:58 CEST 2009
Author: antocuni
Date: Thu May 7 10:44:55 2009
New Revision: 65123
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/cli/method.py
pypy/branch/pyjitpl5/pypy/jit/backend/cli/runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/cli/test/test_zrpy_send.py
pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/test/support.py
Log:
- refactor emit_op_call and emit_op_oosend to share common logic
- implement emit_op_getfield_gc, to make test_send_to_single_target_method passing
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/cli/method.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/cli/method.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/cli/method.py Thu May 7 10:44:55 2009
@@ -328,36 +328,44 @@
raise NotImplementedError
def emit_op_call(self, op):
- calldescr = op.descr
- assert isinstance(calldescr, runner.StaticMethDescr)
- delegate_type = dotnet.class2type(calldescr.funcclass)
- meth_invoke = delegate_type.GetMethod('Invoke')
- av_sm, args_av = op.args[0], op.args[1:]
- av_sm.load(self)
- self.il.Emit(OpCodes.Castclass, delegate_type)
- for av_arg in args_av:
- av_arg.load(self)
- self.il.EmitCall(OpCodes.Callvirt, meth_invoke, None)
- if calldescr.has_result:
- self.store_result(op)
+ descr = op.descr
+ assert isinstance(descr, runner.StaticMethDescr)
+ delegate_type = descr.get_delegate_clitype()
+ meth_invoke = descr.get_meth_info()
+ self._emit_call(op, delegate_type, meth_invoke, descr.has_result)
emit_op_call_pure = emit_op_call
def emit_op_oosend(self, op):
- methdescr = op.descr
- assert isinstance(methdescr, runner.MethDescr)
- clitype = dotnet.class2type(methdescr.selfclass)
- methinfo = clitype.GetMethod(str(methdescr.methname))
+ descr = op.descr
+ assert isinstance(descr, runner.MethDescr)
+ clitype = descr.get_self_clitype()
+ methinfo = descr.get_meth_info()
+ self._emit_call(op, clitype, methinfo, descr.has_result)
+
+ emit_op_oosend_pure = emit_op_oosend
+
+ def _emit_call(self, op, clitype, methinfo, has_result):
av_sm, args_av = op.args[0], op.args[1:]
av_sm.load(self)
self.il.Emit(OpCodes.Castclass, clitype)
for av_arg in args_av:
av_arg.load(self)
self.il.Emit(OpCodes.Callvirt, methinfo)
- if methdescr.has_result:
+ if has_result:
self.store_result(op)
- emit_op_oosend_pure = emit_op_oosend
+ def emit_op_getfield_gc(self, op):
+ descr = op.descr
+ assert isinstance(descr, runner.FieldDescr)
+ clitype = descr.get_self_clitype()
+ fieldinfo = descr.get_field_info()
+ op.args[0].load(self)
+ self.il.Emit(OpCodes.Castclass, clitype)
+ self.il.Emit(OpCodes.Ldfld, fieldinfo)
+ self.store_result(op)
+
+ emit_op_getfield_gc_pure = emit_op_getfield_gc
def not_implemented(self, op):
@@ -380,9 +388,7 @@
emit_op_arraylen_gc = not_implemented
emit_op_unicodesetitem = not_implemented
emit_op_getfield_raw_pure = not_implemented
- emit_op_getfield_gc_pure = not_implemented
emit_op_getarrayitem_gc = not_implemented
- emit_op_getfield_gc = not_implemented
emit_op_strlen = not_implemented
emit_op_newstr = not_implemented
emit_op_strsetitem = not_implemented
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/cli/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/cli/runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/cli/runner.py Thu May 7 10:44:55 2009
@@ -5,7 +5,7 @@
from pypy.jit.metainterp.resoperation import rop, opname
from pypy.jit.backend import model
from pypy.jit.backend.minimal.runner import cached_method
-from pypy.jit.backend.llgraph.runner import TypeDescr, FieldDescr
+from pypy.jit.backend.llgraph.runner import TypeDescr, KeyManager
from pypy.translator.cli import dotnet
from pypy.translator.cli.dotnet import CLR
@@ -133,6 +133,8 @@
# ----------------------------------------------------------------------
+key_manager = KeyManager()
+
class StaticMethDescr(AbstractDescr):
@@ -149,6 +151,13 @@
self.funcclass = dotnet.classof(FUNC)
self.has_result = (FUNC.RESULT != ootype.Void)
+ def get_delegate_clitype(self):
+ return dotnet.class2type(self.funcclass)
+
+ def get_meth_info(self):
+ clitype = self.get_delegate_clitype()
+ return clitype.GetMethod('Invoke')
+
class MethDescr(AbstractMethDescr):
@@ -169,9 +178,54 @@
self.callmeth = callmeth
self.selfclass = ootype.runtimeClass(SELFTYPE)
self.methname = methname
-
self.has_result = (METH.RESULT != ootype.Void)
+ def get_self_clitype(self):
+ return dotnet.class2type(self.selfclass)
+
+ def get_meth_info(self):
+ clitype = self.get_self_clitype()
+ return clitype.GetMethod(str(self.methname))
+
+
+class FieldDescr(AbstractDescr):
+
+ getfield = None
+ _keys = KeyManager()
+
+ def __init__(self, TYPE, fieldname):
+ from pypy.jit.backend.llgraph.runner import boxresult
+ _, T = TYPE._lookup_field(fieldname)
+ def getfield(objbox):
+ obj = ootype.cast_from_object(TYPE, objbox.getobj())
+ value = getattr(obj, fieldname)
+ return boxresult(T, value)
+ def setfield(objbox, valuebox):
+ obj = ootype.cast_from_object(TYPE, objbox.getobj())
+ value = unwrap(T, valuebox)
+ setattr(obj, fieldname, value)
+
+ self.getfield = getfield
+ self.setfield = setfield
+ self.selfclass = ootype.runtimeClass(TYPE)
+ self.fieldname = fieldname
+ self.key = key_manager.getkey((TYPE, fieldname))
+
+ def sort_key(self):
+ return self.key
+
+ def equals(self, other):
+ assert isinstance(other, FieldDescr)
+ return self.key == other.key
+
+ def get_self_clitype(self):
+ return dotnet.class2type(self.selfclass)
+
+ def get_field_info(self):
+ clitype = self.get_self_clitype()
+ return clitype.GetField(str(self.fieldname))
+
+
CPU = CliCPU
import pypy.jit.metainterp.executor
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/cli/test/test_zrpy_send.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/cli/test/test_zrpy_send.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/cli/test/test_zrpy_send.py Thu May 7 10:44:55 2009
@@ -10,7 +10,6 @@
def skip(self):
py.test.skip('in-progress')
- test_send_to_single_target_method = skip
test_oosend_base = skip
test_three_receivers = skip
test_oosend_different_initial_class = skip
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py Thu May 7 10:44:55 2009
@@ -539,6 +539,9 @@
self.keys[key] = n
return n
+ def _freeze_(self):
+ raise Exception("KeyManager is not supposed to be turned into a pbc")
+
descr_cache = {}
class OODescr(history.AbstractDescr):
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/test/support.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/test/support.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/test/support.py Thu May 7 10:44:55 2009
@@ -14,7 +14,8 @@
def _compile_and_run(self, t, entry_point, entry_point_graph, args):
raise NotImplementedError
- def meta_interp(self, function, args, repeat=1, **kwds): # XXX ignored
+ # XXX backendopt is ignored
+ def meta_interp(self, function, args, repeat=1, backendopt=None, **kwds): # XXX ignored
from pypy.jit.metainterp.warmspot import WarmRunnerDesc
from pypy.annotation.listdef import s_list_of_strings
from pypy.annotation import model as annmodel
More information about the Pypy-commit
mailing list