提交 b923a87c 编写于 作者: P pchelko

8035626: [parfait] JNI exception pending in...

8035626: [parfait] JNI exception pending in jdk/src/windows/native/sun/windows/awt_Toolkit.cpp, awt_Toolkit.h
Reviewed-by: anthony, art, serb
上级 7fb5273d
/*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -172,35 +172,22 @@ void AwtToolkit::SetBusy(BOOL busy) {
if (awtAutoShutdownClass == NULL) {
jclass awtAutoShutdownClassLocal = env->FindClass("sun/awt/AWTAutoShutdown");
if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
env->ExceptionDescribe();
env->ExceptionClear();
}
DASSERT(awtAutoShutdownClassLocal != NULL);
if (awtAutoShutdownClassLocal == NULL) {
return;
}
if (!awtAutoShutdownClassLocal) throw std::bad_alloc();
awtAutoShutdownClass = (jclass)env->NewGlobalRef(awtAutoShutdownClassLocal);
env->DeleteLocalRef(awtAutoShutdownClassLocal);
if (!awtAutoShutdownClass) throw std::bad_alloc();
notifyBusyMethodID = env->GetStaticMethodID(awtAutoShutdownClass,
"notifyToolkitThreadBusy", "()V");
if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
env->ExceptionDescribe();
env->ExceptionClear();
}
DASSERT(notifyBusyMethodID != NULL);
if (!notifyBusyMethodID) throw std::bad_alloc();
notifyFreeMethodID = env->GetStaticMethodID(awtAutoShutdownClass,
"notifyToolkitThreadFree", "()V");
if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
env->ExceptionDescribe();
env->ExceptionClear();
}
DASSERT(notifyBusyMethodID != NULL);
DASSERT(notifyFreeMethodID != NULL);
if (notifyBusyMethodID == NULL || notifyFreeMethodID == NULL) {
return;
}
if (!notifyFreeMethodID) throw std::bad_alloc();
} /* awtAutoShutdownClass == NULL*/
if (busy) {
......@@ -776,9 +763,11 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message,
jclass systemColorClass = env->FindClass("java/awt/SystemColor");
DASSERT(systemColorClass);
if (!systemColorClass) throw std::bad_alloc();
jmethodID mid = env->GetStaticMethodID(systemColorClass, "updateSystemColors", "()V");
DASSERT(mid);
if (!mid) throw std::bad_alloc();
env->CallStaticVoidMethod(systemColorClass, mid);
......@@ -1038,6 +1027,8 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message,
// Notify Java side - call WToolkit.displayChanged()
jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
DASSERT(clazz != NULL);
if (!clazz) throw std::bad_alloc();
env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
GetInstance().m_displayChanged = TRUE;
......@@ -2050,15 +2041,20 @@ Java_java_awt_Toolkit_initIDs(JNIEnv *env, jclass cls) {
AwtToolkit::getDefaultToolkitMID =
env->GetStaticMethodID(cls,"getDefaultToolkit","()Ljava/awt/Toolkit;");
AwtToolkit::getFontMetricsMID =
env->GetMethodID(cls, "getFontMetrics",
"(Ljava/awt/Font;)Ljava/awt/FontMetrics;");
AwtToolkit::insetsMID =
env->GetMethodID(env->FindClass("java/awt/Insets"), "<init>", "(IIII)V");
DASSERT(AwtToolkit::getDefaultToolkitMID != NULL);
CHECK_NULL(AwtToolkit::getDefaultToolkitMID);
AwtToolkit::getFontMetricsMID =
env->GetMethodID(cls, "getFontMetrics", "(Ljava/awt/Font;)Ljava/awt/FontMetrics;");
DASSERT(AwtToolkit::getFontMetricsMID != NULL);
DASSERT(AwtToolkit::insetsMID != NULL);
CHECK_NULL(AwtToolkit::getFontMetricsMID);
jclass insetsClass = env->FindClass("java/awt/Insets");
DASSERT(insetsClass != NULL);
CHECK_NULL(insetsClass);
AwtToolkit::insetsMID = env->GetMethodID(insetsClass, "<init>", "(IIII)V");
DASSERT(AwtToolkit::insetsMID != NULL);
CHECK_NULL(AwtToolkit::insetsMID);
CATCH_BAD_ALLOC;
}
......@@ -2085,10 +2081,12 @@ Java_sun_awt_windows_WToolkit_initIDs(JNIEnv *env, jclass cls)
AwtToolkit::windowsSettingChangeMID =
env->GetMethodID(cls, "windowsSettingChange", "()V");
DASSERT(AwtToolkit::windowsSettingChangeMID != 0);
CHECK_NULL(AwtToolkit::windowsSettingChangeMID);
AwtToolkit::displayChangeMID =
env->GetStaticMethodID(cls, "displayChanged", "()V");
DASSERT(AwtToolkit::displayChangeMID != 0);
CHECK_NULL(AwtToolkit::displayChangeMID);
// Set various global IDs needed by JAWT code. Note: these
// variables cannot be set by JAWT code directly due to
......@@ -2099,24 +2097,37 @@ Java_sun_awt_windows_WToolkit_initIDs(JNIEnv *env, jclass cls)
// negligible penalty.
jclass sDataClassLocal = env->FindClass("sun/java2d/SurfaceData");
DASSERT(sDataClassLocal != 0);
CHECK_NULL(sDataClassLocal);
jclass vImgClassLocal = env->FindClass("sun/awt/image/SunVolatileImage");
DASSERT(vImgClassLocal != 0);
CHECK_NULL(vImgClassLocal);
jclass vSMgrClassLocal =
env->FindClass("sun/awt/image/VolatileSurfaceManager");
DASSERT(vSMgrClassLocal != 0);
CHECK_NULL(vSMgrClassLocal);
jclass componentClassLocal = env->FindClass("java/awt/Component");
DASSERT(componentClassLocal != 0);
CHECK_NULL(componentClassLocal);
jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager",
"Lsun/awt/image/VolatileSurfaceManager;");
DASSERT(jawtSMgrID != 0);
CHECK_NULL(jawtSMgrID);
jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent",
"Lsun/java2d/SurfaceData;");
DASSERT(jawtSDataID != 0);
CHECK_NULL(jawtSDataID);
jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J");
DASSERT(jawtPDataID != 0);
CHECK_NULL(jawtPDataID);
// Save these classes in global references for later use
jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal);
CHECK_NULL(jawtVImgClass);
jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal);
CATCH_BAD_ALLOC;
......@@ -2377,7 +2388,11 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
TRY;
if (AwtToolkit::GetScreenInsets(screen, &rect)) {
insets = env->NewObject(env->FindClass("java/awt/Insets"),
jclass insetsClass = env->FindClass("java/awt/Insets");
DASSERT(insetsClass != NULL);
CHECK_NULL_RETURN(insetsClass, NULL);
insets = env->NewObject(insetsClass,
AwtToolkit::insetsMID,
rect.top,
rect.left,
......
/*
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -80,7 +80,7 @@ class JNILocalFrame {
int result = m_env->PushLocalFrame(size);
if (result < 0) {
DASSERT(FALSE);
JNU_ThrowOutOfMemoryError(m_env, "Can't allocate localRefs");
throw std::bad_alloc();
}
}
INLINE ~JNILocalFrame() { m_env->PopLocalFrame(NULL); }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册