[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