[pypy-svn] r28881 - in pypy/dist/pypy/translator/cli: . src test

antocuni at codespeak.net antocuni at codespeak.net
Fri Jun 16 15:38:05 CEST 2006


Author: antocuni
Date: Fri Jun 16 15:37:51 2006
New Revision: 28881

Added:
   pypy/dist/pypy/translator/cli/test/test_primitive.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/cli/function.py
   pypy/dist/pypy/translator/cli/src/pypylib.cs
Log:
Added support for suggested_primitive.

Added support for time.time().



Modified: pypy/dist/pypy/translator/cli/function.py
==============================================================================
--- pypy/dist/pypy/translator/cli/function.py	(original)
+++ pypy/dist/pypy/translator/cli/function.py	Fri Jun 16 15:37:51 2006
@@ -46,10 +46,40 @@
     def _is_raise_block(self, block):
         return (not block.exits) and len(block.inputargs) == 2        
 
+    def _render_primitive(self, ilasm):
+        self.ilasm = ilasm
+        graph = self.graph
+        func_name = graph.func.func_name
+        returntype, returnvar = self.cts.llvar_to_cts(graph.getreturnvar())
+
+        if self.is_method:
+            args = self.args[1:] # self is implicit
+            meth_type = 'virtual' # TODO: mark as virtual only when strictly necessary
+        else:
+            args = self.args
+            meth_type = 'static'
+
+        self.ilasm.begin_function(self.name, args, returntype, self.is_entrypoint, meth_type)        
+        if func_name == 'll_time_time':
+            ilasm.opcode('call float64 [pypylib]pypy.runtime.Utils::Time()')
+        else:
+            assert False, 'Unknown primitive function: %s' % func
+
+        self.ilasm.opcode('ret')
+        self.ilasm.end_function()
+        if self.is_method:
+            pass # TODO
+        else:
+            self.db.record_function(self.graph, self.name)
+
     def render(self, ilasm):
         if self.db.graph_name(self.graph) is not None and not self.is_method:
             return # already rendered
 
+        if getattr(self.graph.func, 'suggested_primitive', False):
+            self._render_primitive(ilasm) # XXX: refactoring needed
+            return
+
         self.ilasm = ilasm
         graph = self.graph
         returntype, returnvar = self.cts.llvar_to_cts(graph.getreturnvar())
@@ -61,7 +91,7 @@
             args = self.args
             meth_type = 'static'
 
-        self.ilasm.begin_function(self.name, args, returntype, self.is_entrypoint, meth_type)
+        self.ilasm.begin_function(self.name, args, returntype, self.is_entrypoint, meth_type)        
         self.ilasm.locals(self.locals)
 
         return_blocks = []

Modified: pypy/dist/pypy/translator/cli/src/pypylib.cs
==============================================================================
--- pypy/dist/pypy/translator/cli/src/pypylib.cs	(original)
+++ pypy/dist/pypy/translator/cli/src/pypylib.cs	Fri Jun 16 15:37:51 2006
@@ -85,6 +85,12 @@
         {
             return Convert.ToInt32(s, base_);
         }
+
+        public static double Time()
+        {
+            TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
+            return t.TotalSeconds;
+        }
     }
 
     public class StringBuilder

Added: pypy/dist/pypy/translator/cli/test/test_primitive.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/cli/test/test_primitive.py	Fri Jun 16 15:37:51 2006
@@ -0,0 +1,13 @@
+import os
+import time
+
+from pypy.translator.cli.test.runtest import CliTest
+
+class TestPrimitive(CliTest):
+
+    def test_time_time(self):
+        def fn():
+            return time.time()
+        t1 = self.interpret(fn, [])
+        t2 = self.interpret(fn, [])
+        assert t1 <= t2



More information about the Pypy-commit mailing list