[pypy-svn] r49943 - in pypy/dist/pypy/translator/llvm: . test

rxe at codespeak.net rxe at codespeak.net
Wed Dec 19 22:45:37 CET 2007


Author: rxe
Date: Wed Dec 19 22:45:35 2007
New Revision: 49943

Modified:
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/test/test_standalone.py
Log:
catch exception in entrypoint

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Wed Dec 19 22:45:35 2007
@@ -25,21 +25,29 @@
 def augment_entrypoint(translator, entrypoint):
     bk = translator.annotator.bookkeeper
     graph_entrypoint = bk.getdesc(entrypoint).getuniquegraph()
-    s_result = translator.annotator.binding(graph_entrypoint.getreturnvar())
 
     get_argc = rffi.llexternal('_pypy_getargc', [], rffi.INT)
     get_argv = rffi.llexternal('_pypy_getargv', [], rffi.CCHARPP)
 
+    import os
+        
     def new_entrypoint():
         argc = get_argc()
         argv = get_argv()
         args = [rffi.charp2str(argv[i]) for i in range(argc)]
-        return entrypoint(args)
 
+        result = 255
+        try:
+            result = entrypoint(args)
+        except Exception, exc:
+            os.write(2, 'DEBUG: An uncaught exception was raised in entrypoint: ' + str(exc) + '\n')
+
+        return result
+    
     entrypoint._annenforceargs_ = [s_list_of_strings]
     mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper)
-
-    graph = mixlevelannotator.getgraph(new_entrypoint, [], s_result)
+    res = annmodel.lltype_to_annotation(lltype.Signed)
+    graph = mixlevelannotator.getgraph(new_entrypoint, [], res)
     mixlevelannotator.finish()
     mixlevelannotator.backend_optimize()
     
@@ -116,9 +124,8 @@
         # XXX please dont ask!
         from pypy.translator.c.genc import CStandaloneBuilder
         cbuild = CStandaloneBuilder(self.translator, func, config=self.config)
-        #cbuild.stackless = self.stackless
         c_db = cbuild.generate_graphs_for_llinterp()
-
+    
         self.db = Database(self, self.translator)
         self.db.gcpolicy = GcPolicy.new(self.db, self.config)
         self.db.gctransformer = c_db.gctransformer
@@ -135,9 +142,6 @@
 
         # set up externs nodes
         self.setup_externs(c_db, self.db)
-
-        self.translator.rtyper.specialize_more_blocks()
-        self.db.setup_all()
         self._checkpoint('setup_all externs')
         
         self._print_node_stats()
@@ -175,7 +179,7 @@
             self.function_count[name] += 1
             Node.nodename_count[name] = self.function_count[name] + 1
             name += '_%d' % self.function_count[name]
-            entry_node.name =  name
+            entry_node.name = name
         else:
             self.function_count[name] = 1
 

Modified: pypy/dist/pypy/translator/llvm/test/test_standalone.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_standalone.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_standalone.py	Wed Dec 19 22:45:35 2007
@@ -86,3 +86,19 @@
     exe_name = 'test_strtod'
     compile_standalone(entry_point, exe_name=exe_name)
     data = cmdexec(exe_name, '3.13e1')
+
+def test_exception_leaking():
+    def entry_point(argv):
+        if len(argv) > 5:
+            raise ValueError
+        print 'ok'
+        return 0
+
+    exe_name = 'test_exception_leaking'
+    compile_standalone(entry_point, exe_name=exe_name)
+    data = cmdexec(exe_name, 'abc', 'def')
+    assert data.startswith('ok')
+    try:
+        data = cmdexec(exe_name, 'abc', 'def', 'abc', 'def', 'abc', 'def')
+    except py.process.cmdexec.Error, exc:
+        assert exc.err.startswith('DEBUG')



More information about the Pypy-commit mailing list