[pypy-svn] r36579 - pypy/dist/pypy/translator/cli

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Jan 12 15:52:17 CET 2007


Author: cfbolz
Date: Fri Jan 12 15:52:15 2007
New Revision: 36579

Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/ilgenerator.py
   pypy/dist/pypy/translator/cli/metavm.py
Log:
(cfbolz, antocuni reviewing): try to make the name-only static methods work
with cli.


Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Fri Jan 12 15:52:15 2007
@@ -208,6 +208,19 @@
 
         return '%s %s(%s)' % (ret_type, func_name, arg_list)
 
+    def op_to_signature(self, op, func_name):
+        ret_type, ret_var = self.llvar_to_cts(op.result)
+        func_name = self.escape_name(func_name)
+
+        args = [arg for arg in op.args[1:]
+                    if arg.concretetype is not ootype.Void]
+
+        arg_types = [self.lltype_to_cts(arg.concretetype) for arg in args]
+        arg_list = ', '.join(arg_types)
+
+        return '%s %s(%s)' % (ret_type, func_name, arg_list)
+
+
     def method_signature(self, TYPE, name_or_desc):
         # TODO: use callvirt only when strictly necessary
         if isinstance(TYPE, ootype.Instance):

Modified: pypy/dist/pypy/translator/cli/ilgenerator.py
==============================================================================
--- pypy/dist/pypy/translator/cli/ilgenerator.py	(original)
+++ pypy/dist/pypy/translator/cli/ilgenerator.py	Fri Jan 12 15:52:15 2007
@@ -283,6 +283,9 @@
     def function_signature(self, graph, func_name=None):
         return self.cts.graph_to_signature(graph, False, func_name)
 
+    def op_signature(self, op, func_name):
+        return self.cts.op_to_signature(op, func_name)
+
     def class_name(self, TYPE):
         if isinstance(TYPE, ootype.Instance):
             return self.db.class_name(TYPE)
@@ -298,6 +301,10 @@
         func_sig = self.function_signature(graph, func_name)
         self.ilasm.call(func_sig)
 
+    def call_op(self, op, func_name):
+        func_sig = self.op_signature(op, func_name)
+        self.ilasm.call(func_sig)
+
     def call_signature(self, signature):
         self.ilasm.call(signature)
 

Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py	(original)
+++ pypy/dist/pypy/translator/cli/metavm.py	Fri Jan 12 15:52:15 2007
@@ -13,13 +13,16 @@
         callee = op.args[0].value
         if isinstance(callee, _static_meth):
             self._render_native_function(generator, callee, op.args)
-        else:
+        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:
@@ -86,6 +89,13 @@
                method_name == 'll_current_value':
                 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]



More information about the Pypy-commit mailing list