[pypy-svn] r46294 - in pypy/dist/pypy/translator: cli jvm oosupport

antocuni at codespeak.net antocuni at codespeak.net
Mon Sep 3 22:24:38 CEST 2007


Author: antocuni
Date: Mon Sep  3 22:24:36 2007
New Revision: 46294

Modified:
   pypy/dist/pypy/translator/cli/ilgenerator.py
   pypy/dist/pypy/translator/cli/metavm.py
   pypy/dist/pypy/translator/jvm/generator.py
   pypy/dist/pypy/translator/oosupport/metavm.py
Log:
refactor metavm._Call: now most of the logic is shared between jvm and cli



Modified: pypy/dist/pypy/translator/cli/ilgenerator.py
==============================================================================
--- pypy/dist/pypy/translator/cli/ilgenerator.py	(original)
+++ pypy/dist/pypy/translator/cli/ilgenerator.py	Mon Sep  3 22:24:36 2007
@@ -308,6 +308,10 @@
     def emit(self, instr, *args):
         self.ilasm.opcode(instr, *args)
 
+    def call_primitive(self, op, module, name):
+        func_name = '[pypylib]pypy.builtin.%s::%s' % (module, name)
+        self.call_op(op, func_name)
+        
     def call_graph(self, graph, func_name=None):
         if func_name is None: # else it is a suggested primitive
             self.db.pending_function(graph)

Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py	(original)
+++ pypy/dist/pypy/translator/cli/metavm.py	Mon Sep  3 22:24:36 2007
@@ -2,36 +2,21 @@
 from pypy.rpython.ootypesystem import ootype
 from pypy.translator.oosupport.metavm import Generator, InstructionList, MicroInstruction,\
      PushAllArgs, StoreResult, GetField, SetField, DownCast
+from pypy.translator.oosupport.metavm import _Call as _OOCall
 from pypy.translator.cli.comparer import EqualityComparer
 from pypy.translator.cli.cts import WEAKREF
 from pypy.translator.cli.dotnet import _static_meth, NativeInstance
 
 STRING_HELPER_CLASS = '[pypylib]pypy.runtime.String'
 
-class _Call(MicroInstruction):
+class _Call(_OOCall):
+    
     def render(self, generator, op):
         callee = op.args[0].value
         if isinstance(callee, _static_meth):
             self._render_native_function(generator, callee, op.args)
-        elif hasattr(callee, "graph"):
-            graph = callee.graph
-            method_name = oopspec.get_method_name(graph, op)
-            if method_name is None:
-                self._render_function(generator, graph, op.args)
-            else:
-                self._render_method(generator, method_name, op.args[1:])
         else:
-            self._render_primitive_function(generator, callee, op)
-
-
-    def _load_arg_or_null(self, generator, arg):
-        if arg.concretetype is ootype.Void:
-            if arg.value is None:
-                generator.ilasm.opcode('ldnull') # special-case: use None as a null value
-            else:
-                assert False, "Don't know how to load this arg"
-        else:
-            generator.load(arg)
+            _OOCall.render(self, generator, op)
 
     def _render_native_function(self, generator, funcdesc, args):
         for func_arg in args[1:]: # push parameters
@@ -45,17 +30,20 @@
         signature = '%s %s::%s(%s)' % (ret_type, funcdesc._cls._name, funcdesc._name, arg_list)
         generator.call_signature(signature)
 
-    def _render_function(self, generator, graph, args):
-        primitive = getattr(graph.func, 'suggested_primitive', False)
-        for func_arg in args[1:]: # push parameters
-            generator.load(func_arg)
-
-        if primitive:
-            _, module = graph.func.__module__.rsplit('.', 1)
-            func_name = '[pypylib]pypy.builtin.%s::%s' % (module, graph.func.func_name)
-            generator.call_graph(graph, func_name)
+    def _load_arg_or_null(self, generator, arg):
+        if arg.concretetype is ootype.Void:
+            if arg.value is None:
+                generator.ilasm.opcode('ldnull') # special-case: use None as a null value
+            else:
+                assert False, "Don't know how to load this arg"
         else:
-            generator.call_graph(graph)
+            generator.load(arg)
+
+
+class _CallMethod(_Call):
+    def render(self, generator, op):
+        method = op.args[0]
+        self._render_method(generator, method.value, op.args[1:])
 
     def _render_method(self, generator, method_name, args):
         this = args[0]
@@ -95,20 +83,8 @@
                      method_name == 'll_current_key')):
                 generator.ilasm.pop()
 
-    def _render_primitive_function(self, generator, callee, op):
-        for func_arg in op.args[1:]: # push parameters
-            self._load_arg_or_null(generator, func_arg)
-        module, name = callee._name.split(".")
-        func_name = '[pypylib]pypy.builtin.%s::%s' % (module, name)
-        generator.call_op(op, func_name)
-
-class _CallMethod(_Call):
-    def render(self, generator, op):
-        method = op.args[0]
-        self._render_method(generator, method.value, op.args[1:])
-
 
-class _IndirectCall(_Call):
+class _IndirectCall(_CallMethod):
     def render(self, generator, op):
         # discard the last argument because it's used only for analysis
         self._render_method(generator, 'Invoke', op.args[:-1])

Modified: pypy/dist/pypy/translator/jvm/generator.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/generator.py	(original)
+++ pypy/dist/pypy/translator/jvm/generator.py	Mon Sep  3 22:24:36 2007
@@ -1014,7 +1014,8 @@
             # we have to "deal with it"
             self.prepare_generic_result(RETTYPE)
 
-    def call_primitive(self, graph):
+    def call_primitive(self, op, module, name):
+        graph = op.args[0].value # XXX
         argtypes, rettype = self.db.types_for_graph(graph)
         mthd = Method.s(jPyPy, graph.func.func_name, argtypes, rettype)
         self.emit(mthd)

Modified: pypy/dist/pypy/translator/oosupport/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/oosupport/metavm.py	(original)
+++ pypy/dist/pypy/translator/oosupport/metavm.py	Mon Sep  3 22:24:36 2007
@@ -172,7 +172,7 @@
         Stack: argN, arg2, arg1, this, ... -> ret, ... """
         raise NotImplementedError
 
-    def call_primitive(self, graph):
+    def call_primitive(self, op, module, name):
         """ Like call_graph, but it has been suggested that the method be
         rendered as a primitive.
 
@@ -395,23 +395,34 @@
     def render(self, generator, op):
         generator.branch_conditionally(False, self.label)
 
+
 class _Call(MicroInstruction):
+
+    def _get_primitive_name(self, callee):
+        try:
+            graph = callee.graph
+        except AttributeError:
+            return callee._name.rsplit('.', 1)
+        else:
+            if getattr(graph.func, 'suggested_primitive', False):
+                _, module = graph.func.__module__.rsplit('.', 1)
+                return module, graph.func.func_name
+            else:
+                return None
+
     def render(self, generator, op):
         callee = op.args[0].value
-        graph = callee.graph
-        method_name = None # XXX oopspec.get_method_name(graph, op)
+        is_primitive = self._get_primitive_name(callee)
 
         for arg in op.args[1:]:
             generator.load(arg)
         
-        if method_name is None:
-            if getattr(graph.func, 'suggested_primitive', False):
-                generator.call_primitive(graph)
-            else:
-                generator.call_graph(graph)
+        if is_primitive:
+            module, name = is_primitive
+            generator.call_primitive(op, module, name)
         else:
-            this = op.args[1]
-            generator.call_method(this.concretetype, method_name)
+            generator.call_graph(callee.graph)
+
             
 class _CallMethod(MicroInstruction):
     def render(self, generator, op):



More information about the Pypy-commit mailing list