[rtems-tools commit] Move the reraise logic into the tool kit.

Chris Johns chrisj at rtems.org
Thu Sep 21 08:28:57 UTC 2017


Module:    rtems-tools
Branch:    master
Commit:    fa81491764861e63785a3faa241c488469087209
Changeset: http://git.rtems.org/rtems-tools/commit/?id=fa81491764861e63785a3faa241c488469087209

Author:    Chris Johns <chrisj at rtems.org>
Date:      Thu Sep 21 17:45:39 2017 +1000

Move the reraise logic into the tool kit.

---

 rtemstoolkit/__init__.py |   2 +
 rtemstoolkit/reraise.py  | 107 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+)

diff --git a/rtemstoolkit/__init__.py b/rtemstoolkit/__init__.py
index f3fbbcd..ca2d619 100644
--- a/rtemstoolkit/__init__.py
+++ b/rtemstoolkit/__init__.py
@@ -38,6 +38,7 @@ all = ['check',
        'mailer',
        'options',
        'path',
+       'reraise',
        'version']
 
 from . import check
@@ -50,4 +51,5 @@ from . import macros
 from . import mailer
 from . import options
 from . import path
+from . import reraise
 from . import version
diff --git a/rtemstoolkit/reraise.py b/rtemstoolkit/reraise.py
new file mode 100644
index 0000000..4b80861
--- /dev/null
+++ b/rtemstoolkit/reraise.py
@@ -0,0 +1,107 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2013-2017 Chris Johns (chrisj at rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from __future__ import print_function
+
+import sys
+
+#
+# The following fragment is taken from https://bitbucket.org/gutworth/six
+# to raise an exception. The python2 code cause a syntax error with python3.
+#
+# Copyright (c) 2010-2016 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+# Taken from six.
+#
+if sys.version_info[0] == 3:
+    def reraise(tp, value, tb = None):
+        raise value.with_traceback(tb)
+else:
+    def exec_(_code_, _globs_ = None, _locs_ = None):
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+    exec_("""def reraise(tp, value, tb = None):
+    raise tp, value, tb
+""")
+
+if __name__ == "__main__":
+    try:
+        import threading
+        import time
+        result = None
+        finished = False
+        def _thread():
+            global finished
+            global result
+            try:
+                raise ValueError('raised inside a thread, reaise is working')
+            except:
+                result = sys.exc_info()
+            finished = True
+        thread = threading.Thread(target = _thread, name = 'test')
+        thread.start()
+        while not finished:
+            time.sleep(0.05)
+        if result is not None:
+            reraise(*result)
+        else:
+            print('error: no exception raised and caught')
+    except ValueError as ve:
+        print('exception caught: %s' % (str(ve)))
+    except KeyboardInterrupt:
+        print('abort: user terminated')
+    except:
+        print('unknown exception caught')



More information about the vc mailing list