[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