[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