1 /*
2  * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 #ifndef SHARE_VM_UTILITIES_PRESERVEEXCEPTION_HPP
26 #define SHARE_VM_UTILITIES_PRESERVEEXCEPTION_HPP
27 
28 #include "runtime/handles.hpp"
29 #include "runtime/thread.hpp"
30 
31 // This file provides more support for exception handling; see also exceptions.hpp
32 class PreserveExceptionMark {
33  private:
34   Thread*     _thread;
35   Handle      _preserved_exception_oop;
36   int         _preserved_exception_line;
37   const char* _preserved_exception_file;
38 
39  public:
40   PreserveExceptionMark(Thread*& thread);
41   ~PreserveExceptionMark();
42 };
43 
44 
45 // This is a clone of PreserveExceptionMark which asserts instead
46 // of failing when what it wraps generates a pending exception.
47 // It also addresses bug 6431341.
48 class CautiouslyPreserveExceptionMark {
49  private:
50   Thread*     _thread;
51   Handle      _preserved_exception_oop;
52   int         _preserved_exception_line;
53   const char* _preserved_exception_file;
54 
55  public:
56   CautiouslyPreserveExceptionMark(Thread* thread);
57   ~CautiouslyPreserveExceptionMark();
58 };
59 
60 
61 // Like PreserveExceptionMark but allows new exceptions to be generated in
62 // the body of the mark. If a new exception is generated then the original one
63 // is discarded.
64 class WeakPreserveExceptionMark {
65 private:
66   Thread*     _thread;
67   Handle      _preserved_exception_oop;
68   int         _preserved_exception_line;
69   const char* _preserved_exception_file;
70 
71   void        preserve();
72   void        restore();
73 
74   public:
WeakPreserveExceptionMark(Thread * pThread)75     WeakPreserveExceptionMark(Thread* pThread) :  _thread(pThread), _preserved_exception_oop()  {
76       if (pThread->has_pending_exception()) {
77         preserve();
78       }
79     }
~WeakPreserveExceptionMark()80     ~WeakPreserveExceptionMark() {
81       if (_preserved_exception_oop.not_null()) {
82         restore();
83       }
84     }
85 };
86 
87 
88 
89 // use global exception mark when allowing pending exception to be set and
90 // saving and restoring them
91 #define PRESERVE_EXCEPTION_MARK                    Thread* THREAD; PreserveExceptionMark __em(THREAD);
92 
93 #endif // SHARE_VM_UTILITIES_PRESERVEEXCEPTION_HPP
94