[pypy-svn] r68341 - in pypy/trunk/pypy: jit/metainterp/test translator/cli translator/oosupport
antocuni at codespeak.net
antocuni at codespeak.net
Mon Oct 12 16:50:47 CEST 2009
Author: antocuni
Date: Mon Oct 12 16:50:44 2009
New Revision: 68341
Modified:
pypy/trunk/pypy/jit/metainterp/test/test_basic.py
pypy/trunk/pypy/translator/cli/constant.py
pypy/trunk/pypy/translator/cli/cts.py
pypy/trunk/pypy/translator/oosupport/constant.py
pypy/trunk/pypy/translator/oosupport/metavm.py
Log:
add a jit test for math.modf, and fix the cli backend to run it
Modified: pypy/trunk/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_basic.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_basic.py Mon Oct 12 16:50:44 2009
@@ -945,6 +945,32 @@
res = self.interp_operations(f, [-10])
assert res == 456 * 2
+ def test_residual_external_call(self):
+ class CustomPolicy(JitPolicy):
+ def look_inside_function(self, func):
+ mod = func.__module__ or '?'
+ if mod == 'pypy.rpython.lltypesystem.module.ll_math':
+ # XXX temporary, contains force_cast
+ return False
+ return super(CustomPolicy, self).look_inside_function(func)
+
+ import math
+ myjitdriver = JitDriver(greens = [], reds = ['x', 'y', 'res'])
+ def f(x, y):
+ x = float(x)
+ res = 0
+ while y > 0:
+ myjitdriver.can_enter_jit(x=x, y=y, res=res)
+ myjitdriver.jit_merge_point(x=x, y=y, res=res)
+ rpart, ipart = math.modf(x)
+ res += ipart
+ y -= 1
+ return res
+ res = self.meta_interp(f, [6, 7], policy=CustomPolicy())
+ assert res == 42
+ self.check_loop_count(1)
+
+
class TestOOtype(BasicTests, OOJitMixin):
def test_oohash(self):
@@ -1031,6 +1057,7 @@
+
class BaseLLtypeTests(BasicTests):
def test_oops_on_nongc(self):
Modified: pypy/trunk/pypy/translator/cli/constant.py
==============================================================================
--- pypy/trunk/pypy/translator/cli/constant.py (original)
+++ pypy/trunk/pypy/translator/cli/constant.py Mon Oct 12 16:50:44 2009
@@ -288,7 +288,7 @@
class CLIStaticMethodConst(CLIBaseConstMixin, StaticMethodConst):
def create_pointer(self, gen):
assert not self.is_null()
- signature = self.cts.graph_to_signature(self.value.graph)
+ signature = self.cts.static_meth_to_signature(self.value)
gen.ilasm.opcode('ldnull')
gen.ilasm.opcode('ldftn', signature)
gen.ilasm.new('instance void class %s::.ctor(object, native int)' % self.delegate_type)
Modified: pypy/trunk/pypy/translator/cli/cts.py
==============================================================================
--- pypy/trunk/pypy/translator/cli/cts.py (original)
+++ pypy/trunk/pypy/translator/cli/cts.py Mon Oct 12 16:50:44 2009
@@ -305,20 +305,33 @@
def ctor_name(self, t):
return 'instance void %s::.ctor()' % self.lltype_to_cts(t)
+ def static_meth_to_signature(self, sm):
+ from pypy.translator.oosupport import metavm
+ graph = getattr(sm, 'graph', None)
+ if graph:
+ return self.graph_to_signature(graph)
+ module, name = metavm.get_primitive_name(sm)
+ func_name = '[pypylib]pypy.builtin.%s::%s' % (module, name)
+ T = ootype.typeOf(sm)
+ return self.format_signatue(func_name, T.ARGS, T.RESULT)
+
def graph_to_signature(self, graph, is_method = False, func_name = None):
- ret_type, ret_var = self.llvar_to_cts(graph.getreturnvar())
func_name = func_name or graph.name
func_name = self.escape_name(func_name)
namespace = getattr(graph.func, '_namespace_', None)
if namespace:
func_name = '%s::%s' % (namespace, func_name)
- args = [arg for arg in graph.getargs() if arg.concretetype is not ootype.Void]
+ ARGS = [arg.concretetype for arg in graph.getargs() if arg.concretetype is not ootype.Void]
if is_method:
- args = args[1:]
+ ARGS = ARGS[1:]
+ RESULT = graph.getreturnvar().concretetype
+ return self.format_signatue(func_name, ARGS, RESULT)
- arg_types = [self.lltype_to_cts(arg.concretetype).typename() for arg in args]
+ def format_signatue(self, func_name, ARGS, RESULT):
+ arg_types = [self.lltype_to_cts(ARG).typename() for ARG in ARGS]
arg_list = ', '.join(arg_types)
+ ret_type = self.lltype_to_cts(RESULT)
return '%s %s(%s)' % (ret_type, func_name, arg_list)
Modified: pypy/trunk/pypy/translator/oosupport/constant.py
==============================================================================
--- pypy/trunk/pypy/translator/oosupport/constant.py (original)
+++ pypy/trunk/pypy/translator/oosupport/constant.py Mon Oct 12 16:50:44 2009
@@ -748,7 +748,8 @@
def record_dependencies(self):
if self.value is ootype.null(self.value._TYPE):
return
- self.db.pending_function(self.value.graph)
+ if hasattr(self.value, 'graph'):
+ self.db.pending_function(self.value.graph)
self.delegate_type = self.db.record_delegate(self.value._TYPE)
def initialize_data(self, constgen, gen):
Modified: pypy/trunk/pypy/translator/oosupport/metavm.py
==============================================================================
--- pypy/trunk/pypy/translator/oosupport/metavm.py (original)
+++ pypy/trunk/pypy/translator/oosupport/metavm.py Mon Oct 12 16:50:44 2009
@@ -437,23 +437,23 @@
generator.branch_conditionally(False, self.label)
-class _Call(MicroInstruction):
+def get_primitive_name(sm):
+ try:
+ sm.graph
+ return None
+ except AttributeError:
+ pass
+ try:
+ return 'rffi', sm._obj.oo_primitive
+ except AttributeError:
+ pass
+ return sm._name.rsplit('.', 1)
- def _get_primitive_name(self, callee):
- try:
- callee.graph
- return None
- except AttributeError:
- pass
- try:
- return 'rffi', callee._obj.oo_primitive
- except AttributeError:
- pass
- return callee._name.rsplit('.', 1)
+class _Call(MicroInstruction):
def render(self, generator, op):
callee = op.args[0].value
- is_primitive = self._get_primitive_name(callee)
+ is_primitive = get_primitive_name(callee)
if is_primitive:
module, name = is_primitive
More information about the Pypy-commit
mailing list