[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