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_PRIMS_WHITEBOX_HPP 26 #define SHARE_VM_PRIMS_WHITEBOX_HPP 27 28 #include "jni.h" 29 30 #include "utilities/exceptions.hpp" 31 #include "memory/allocation.hpp" 32 #include "oops/oopsHierarchy.hpp" 33 #include "oops/symbol.hpp" 34 #include "runtime/interfaceSupport.hpp" 35 36 // Unconditionally clear pedantic pending JNI checks 37 class ClearPendingJniExcCheck : public StackObj { 38 private: 39 JavaThread* _thread; 40 public: 41 ClearPendingJniExcCheck(JNIEnv* env) : _thread(JavaThread::thread_from_jni_environment(env)) {} 42 ~ClearPendingJniExcCheck() { 43 _thread->clear_pending_jni_exception_check(); 44 } 45 }; 46 47 // Entry macro to transition from JNI to VM state. 48 49 #define WB_ENTRY(result_type, header) JNI_ENTRY(result_type, header) \ 50 ClearPendingJniExcCheck _clearCheck(env); 51 52 #define WB_END JNI_END 53 #define WB_METHOD_DECLARE(result_type) extern "C" result_type JNICALL 54 55 #define CHECK_JNI_EXCEPTION_(env, value) \ 56 do { \ 57 JavaThread* THREAD = JavaThread::thread_from_jni_environment(env); \ 58 if (HAS_PENDING_EXCEPTION) { \ 59 return(value); \ 60 } \ 61 } while (0) 62 63 #define CHECK_JNI_EXCEPTION(env) \ 64 do { \ 65 JavaThread* THREAD = JavaThread::thread_from_jni_environment(env); \ 66 if (HAS_PENDING_EXCEPTION) { \ 67 return; \ 68 } \ 69 } while (0) 70 71 class CodeBlob; 72 class CodeHeap; 73 class JavaThread; 74 75 class WhiteBox : public AllStatic { 76 private: 77 static bool _used; 78 public: 79 static volatile bool compilation_locked; 80 static bool used() { return _used; } 81 static void set_used() { _used = true; } 82 static int offset_for_field(const char* field_name, oop object, 83 Symbol* signature_symbol); 84 static const char* lookup_jstring(const char* field_name, oop object); 85 static bool lookup_bool(const char* field_name, oop object); 86 static int get_blob_type(const CodeBlob* code); 87 static CodeHeap* get_code_heap(int blob_type); 88 static CodeBlob* allocate_code_blob(int size, int blob_type); 89 static int array_bytes_to_length(size_t bytes); 90 static void register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, 91 JNINativeMethod* method_array, int method_count); 92 static void register_extended(JNIEnv* env, jclass wbclass, JavaThread* thread); 93 static bool compile_method(Method* method, int comp_level, int bci, Thread* THREAD); 94 }; 95 96 97 98 #endif // SHARE_VM_PRIMS_WHITEBOX_HPP | 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_PRIMS_WHITEBOX_HPP 26 #define SHARE_VM_PRIMS_WHITEBOX_HPP 27 28 #include "jni.h" 29 30 #include "utilities/exceptions.hpp" 31 #include "memory/allocation.hpp" 32 #include "oops/oopsHierarchy.hpp" 33 #include "oops/symbol.hpp" 34 35 #define WB_METHOD_DECLARE(result_type) extern "C" result_type JNICALL 36 37 // Unconditionally clear pedantic pending JNI checks 38 class ClearPendingJniExcCheck : public StackObj { 39 private: 40 JavaThread* _thread; 41 public: 42 ClearPendingJniExcCheck(JNIEnv* env) : _thread(JavaThread::thread_from_jni_environment(env)) {} 43 ~ClearPendingJniExcCheck() { 44 _thread->clear_pending_jni_exception_check(); 45 } 46 }; 47 48 class CodeBlob; 49 class CodeHeap; 50 class JavaThread; 51 52 class WhiteBox : public AllStatic { 53 private: 54 static bool _used; 55 public: 56 static volatile bool compilation_locked; 57 static bool used() { return _used; } 58 static void set_used() { _used = true; } 59 static int offset_for_field(const char* field_name, oop object, 60 Symbol* signature_symbol); 61 static const char* lookup_jstring(const char* field_name, oop object); 62 static bool lookup_bool(const char* field_name, oop object); 63 static int get_blob_type(const CodeBlob* code); 64 static CodeHeap* get_code_heap(int blob_type); 65 static CodeBlob* allocate_code_blob(int size, int blob_type); 66 static int array_bytes_to_length(size_t bytes); 67 static void register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, 68 JNINativeMethod* method_array, int method_count); 69 static void register_extended(JNIEnv* env, jclass wbclass, JavaThread* thread); 70 static bool compile_method(Method* method, int comp_level, int bci, Thread* THREAD); 71 }; 72 73 #endif // SHARE_VM_PRIMS_WHITEBOX_HPP |