]> git.eshelyaron.com Git - emacs.git/commitdiff
(format_exception): New function.
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 4 Apr 2007 14:48:47 +0000 (14:48 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 4 Apr 2007 14:48:47 +0000 (14:48 +0000)
(eexecfile): Use it instead of traceback.print_exception.
Don't use execfile to avoid a bug in w32.

etc/ChangeLog
etc/emacs.py

index 2f9e52c03c653d2baa3879614a97c181994cdb14..a93960ea9ef835cca747dcc14a0cfec257774c6d 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-04  Slawomir Nowaczyk  <slawomir.nowaczyk.847@student.lu.se>
+
+       * emacs.py (format_exception): New function.
+       (eexecfile): Use it instead of traceback.print_exception.
+       Don't use execfile to avoid a bug in w32.
+
 2007-04-04  Glenn Morris  <rgm@gnu.org>
 
        * MACHINES: Mention preprocessor to use with /opt/SUNWspro/bin/cc
        (section{TODO Items and Checkboxes}): Checkbox keys moved to this
        section, added documentation for the key `C-c #'.
 
-2006-11-05  Slawomir Nowaczyk  <slawek@cs.lth.se>  (tiny change)
+2006-11-05  Slawomir Nowaczyk  <slawek@cs.lth.se>
 
        * emacs.py (eargs): Provide eldoc message for builtin types.
          Make sure eargs always outputs sentinel, to avoid Emacs freeze.
        (eimport): Use __main__ rather than `emacs' namespace.
        (modpath): New fun.
 
-2006-08-20  Slawomir Nowaczyk  <slawomir.nowaczyk.847@student.lu.se>  (tiny change)
+2006-08-20  Slawomir Nowaczyk  <slawomir.nowaczyk.847@student.lu.se>
 
        * emacs.py (eexecfile): Use the __main__ rather than `emacs' namespace.
 
        * pl-refcard.tex (section{Info}): Ditto.  Translation suggested by
        Slawomir Nowaczyk <slawomir.nowaczyk.847@student.lu.se>.
 
-       * cs-refcard.tex (section{Info}): Use `s' instead of `M-s'.  Entry
-       for `i' is not translated yet.
+       * cs-refcard.tex (section{Info}): Use `s' instead of `M-s'.
+       Entry for `i' is not translated yet.
 
        * pt-br-refcard.tex (section{Info}): Ditto.
 
 
        * NEWS: Lots of clarifications and cleanups.
 
-2005-05-05  Slawomir Nowaczyk  <slawek@cs.lth.se>  (tiny change)
+2005-05-05  Slawomir Nowaczyk  <slawek@cs.lth.se>
 
        * TUTORIAL.pl: Updated header.
 
index e38ee70fab5089dfde0f9178523ef8dc937d3da5..0d0f2e75ed38545c62cba6a5c8a3a90714fb0c18 100644 (file)
@@ -25,20 +25,56 @@ from sets import Set
 
 __all__ = ["eexecfile", "eargs", "complete", "ehelp", "eimport", "modpath"]
 
+def format_exception (filename, should_remove_self):
+    type, value, tb = sys.exc_info ()
+    sys.last_type = type
+    sys.last_value = value
+    sys.last_traceback = tb
+    if type is SyntaxError:
+        try: # parse the error message
+            msg, (dummy_filename, lineno, offset, line) = value
+        except:
+            pass # Not the format we expect; leave it alone
+        else:
+            # Stuff in the right filename
+            value = SyntaxError(msg, (filename, lineno, offset, line))
+            sys.last_value = value
+    res = traceback.format_exception_only (type, value)
+    # There are some compilation errors which do not provide traceback so we
+    # should not massage it.
+    if should_remove_self:
+        tblist = traceback.extract_tb (tb)
+        del tblist[:1]
+        res = traceback.format_list (tblist)
+        if res:
+            res.insert(0, "Traceback (most recent call last):\n")
+        res[len(res):] = traceback.format_exception_only (type, value)
+    # traceback.print_exception(type, value, tb)
+    for line in res: print line,
+
 def eexecfile (file):
     """Execute FILE and then remove it.
     Execute the file within the __main__ namespace.
     If we get an exception, print a traceback with the top frame
     (ourselves) excluded."""
+    # We cannot use real execfile since it has a bug where the file stays
+    # locked forever (under w32) if SyntaxError occurs.
+    # --- code based on code.py and PyShell.py.
     try:
-       try: execfile (file, __main__.__dict__)
-       except:
-           (type, value, tb) = sys.exc_info ()
-           # Lose the stack frame for this location.
-           tb = tb.tb_next
-           if tb is None:      # print_exception won't do it
-               print "Traceback (most recent call last):"
-           traceback.print_exception (type, value, tb)
+        try:
+            source = open (file, "r").read()
+            code = compile (source, file, "exec")
+        # Other exceptions (shouldn't be any...) will (correctly) fall
+        # through to "final".
+        except (OverflowError, SyntaxError, ValueError):
+            # FIXME: When can compile() raise anything else than
+            # SyntaxError ????
+            format_exception (file, False)
+            return
+        try:
+            exec code in __main__.__dict__
+        except:
+            format_exception (file, True)
     finally:
        os.remove (file)