提交 d262410c 编写于 作者: B bagiras

8035625: [parfait] JNI exception pending in jdk/src/windows/native/sun/windows/awt_MenuItem.cpp

Reviewed-by: serb, pchelko
上级 e83e333c
/* /*
* Copyright (c) 1996, 2011, 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -152,6 +152,9 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu) ...@@ -152,6 +152,9 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu)
if (dw == ERROR_OUTOFMEMORY) if (dw == ERROR_OUTOFMEMORY)
{ {
jstring errorMsg = JNU_NewStringPlatform(env, L"too many menu handles"); jstring errorMsg = JNU_NewStringPlatform(env, L"too many menu handles");
if (errorMsg == NULL) {
throw std::bad_alloc();
}
createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError",
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
errorMsg); errorMsg);
...@@ -164,16 +167,19 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu) ...@@ -164,16 +167,19 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu)
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&buf, 0, NULL); (LPTSTR)&buf, 0, NULL);
jstring s = JNU_NewStringPlatform(env, buf); jstring s = JNU_NewStringPlatform(env, buf);
if (s == NULL) {
throw std::bad_alloc();
}
createError = JNU_NewObjectByName(env, "java/lang/InternalError", createError = JNU_NewObjectByName(env, "java/lang/InternalError",
"(Ljava/lang/String;)V", s); "(Ljava/lang/String;)V", s);
LocalFree(buf); LocalFree(buf);
env->DeleteLocalRef(s); env->DeleteLocalRef(s);
} }
env->SetObjectField(self, AwtObject::createErrorID, createError); if (createError == NULL) {
if (createError != NULL) throw std::bad_alloc();
{
env->DeleteLocalRef(createError);
} }
env->SetObjectField(self, AwtObject::createErrorID, createError);
env->DeleteLocalRef(createError);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
...@@ -238,12 +244,18 @@ AwtMenuItem::GetFont(JNIEnv *env) ...@@ -238,12 +244,18 @@ AwtMenuItem::GetFont(JNIEnv *env)
jobject self = GetPeer(env); jobject self = GetPeer(env);
jobject target = env->GetObjectField(self, AwtObject::targetID); jobject target = env->GetObjectField(self, AwtObject::targetID);
jobject font = JNU_CallMethodByName(env, 0, target, "getFont_NoClientCode", "()Ljava/awt/Font;").l; jobject font = JNU_CallMethodByName(env, 0, target, "getFont_NoClientCode", "()Ljava/awt/Font;").l;
env->DeleteLocalRef(target);
if (env->ExceptionCheck()) {
throw std::bad_alloc();
}
if (font == NULL) { if (font == NULL) {
font = env->NewLocalRef(GetDefaultFont(env)); font = env->NewLocalRef(GetDefaultFont(env));
if (env->ExceptionCheck()) {
throw std::bad_alloc();
}
} }
env->DeleteLocalRef(target);
return font; return font;
} }
...@@ -251,13 +263,22 @@ jobject ...@@ -251,13 +263,22 @@ jobject
AwtMenuItem::GetDefaultFont(JNIEnv *env) { AwtMenuItem::GetDefaultFont(JNIEnv *env) {
if (AwtMenuItem::systemFont == NULL) { if (AwtMenuItem::systemFont == NULL) {
jclass cls = env->FindClass("sun/awt/windows/WMenuItemPeer"); jclass cls = env->FindClass("sun/awt/windows/WMenuItemPeer");
DASSERT(cls != NULL); if (cls == NULL) {
throw std::bad_alloc();
}
AwtMenuItem::systemFont = AwtMenuItem::systemFont =
env->CallStaticObjectMethod(cls, AwtMenuItem::getDefaultFontMID); env->CallStaticObjectMethod(cls, AwtMenuItem::getDefaultFontMID);
DASSERT(AwtMenuItem::systemFont); if (env->ExceptionCheck()) {
env->DeleteLocalRef(cls);
throw std::bad_alloc();
}
AwtMenuItem::systemFont = env->NewGlobalRef(AwtMenuItem::systemFont); AwtMenuItem::systemFont = env->NewGlobalRef(AwtMenuItem::systemFont);
if (systemFont == NULL) {
env->DeleteLocalRef(cls);
throw std::bad_alloc();
}
} }
return AwtMenuItem::systemFont; return AwtMenuItem::systemFont;
} }
...@@ -284,8 +305,19 @@ AwtMenuItem::DrawSelf(DRAWITEMSTRUCT& drawInfo) ...@@ -284,8 +305,19 @@ AwtMenuItem::DrawSelf(DRAWITEMSTRUCT& drawInfo)
DWORD crBack,crText; DWORD crBack,crText;
HBRUSH hbrBack; HBRUSH hbrBack;
jobject font = GetFont(env); jobject font;
try {
font = GetFont(env);
} catch (std::bad_alloc&) {
env->DeleteLocalRef(target);
throw;
}
jstring text = GetJavaString(env); jstring text = GetJavaString(env);
if (env->ExceptionCheck()) {
env->DeleteLocalRef(target);
throw std::bad_alloc();
}
size = AwtFont::getMFStringSize(hDC, font, text); size = AwtFont::getMFStringSize(hDC, font, text);
/* 4700350: If the font size is taller than the menubar, change to the /* 4700350: If the font size is taller than the menubar, change to the
...@@ -294,7 +326,13 @@ AwtMenuItem::DrawSelf(DRAWITEMSTRUCT& drawInfo) ...@@ -294,7 +326,13 @@ AwtMenuItem::DrawSelf(DRAWITEMSTRUCT& drawInfo)
*/ */
if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) { if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) {
env->DeleteLocalRef(font); env->DeleteLocalRef(font);
font = env->NewLocalRef(GetDefaultFont(env)); try {
font = env->NewLocalRef(GetDefaultFont(env));
} catch (std::bad_alloc&) {
env->DeleteLocalRef(target);
env->DeleteLocalRef(text);
throw;
}
size = AwtFont::getMFStringSize(hDC, font, text); size = AwtFont::getMFStringSize(hDC, font, text);
} }
...@@ -452,6 +490,10 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo) ...@@ -452,6 +490,10 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo)
/* font is a java.awt.Font */ /* font is a java.awt.Font */
jobject font = GetFont(env); jobject font = GetFont(env);
jstring text = GetJavaString(env); jstring text = GetJavaString(env);
if (env->ExceptionCheck()) {
env->DeleteLocalRef(font);
throw std::bad_alloc();
}
SIZE size = AwtFont::getMFStringSize(hDC, font, text); SIZE size = AwtFont::getMFStringSize(hDC, font, text);
/* 4700350: If the font size is taller than the menubar, change to the /* 4700350: If the font size is taller than the menubar, change to the
...@@ -459,7 +501,14 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo) ...@@ -459,7 +501,14 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo)
* client area. -bchristi * client area. -bchristi
*/ */
if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) { if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) {
jobject defFont = GetDefaultFont(env); jobject defFont;
try {
defFont = GetDefaultFont(env);
} catch (std::bad_alloc&) {
env->DeleteLocalRef(text);
env->DeleteLocalRef(font);
throw;
}
env->DeleteLocalRef(font); env->DeleteLocalRef(font);
font = env->NewLocalRef(defFont); font = env->NewLocalRef(defFont);
size = AwtFont::getMFStringSize(hDC, font, text); size = AwtFont::getMFStringSize(hDC, font, text);
...@@ -468,13 +517,31 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo) ...@@ -468,13 +517,31 @@ void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo)
jstring fontName = jstring fontName =
(jstring)JNU_CallMethodByName(env, 0,font, "getName", (jstring)JNU_CallMethodByName(env, 0,font, "getName",
"()Ljava/lang/String;").l; "()Ljava/lang/String;").l;
if (env->ExceptionCheck()) {
env->DeleteLocalRef(text);
env->DeleteLocalRef(font);
throw std::bad_alloc();
}
/* fontMetrics is a Hsun_awt_windows_WFontMetrics */ /* fontMetrics is a Hsun_awt_windows_WFontMetrics */
jobject fontMetrics = GetFontMetrics(env, font); jobject fontMetrics = GetFontMetrics(env, font);
if (env->ExceptionCheck()) {
env->DeleteLocalRef(text);
env->DeleteLocalRef(font);
env->DeleteLocalRef(fontName);
throw std::bad_alloc();
}
// int height = env->GetIntField(fontMetrics, AwtFont::heightID); // int height = env->GetIntField(fontMetrics, AwtFont::heightID);
int height = (jint)JNU_CallMethodByName(env, 0, fontMetrics, "getHeight", int height = (jint)JNU_CallMethodByName(env, 0, fontMetrics, "getHeight",
"()I").i; "()I").i;
if (env->ExceptionCheck()) {
env->DeleteLocalRef(text);
env->DeleteLocalRef(font);
env->DeleteLocalRef(fontName);
env->DeleteLocalRef(fontMetrics);
throw std::bad_alloc();
}
measureInfo.itemHeight = height; measureInfo.itemHeight = height;
measureInfo.itemHeight += measureInfo.itemHeight/3; measureInfo.itemHeight += measureInfo.itemHeight/3;
...@@ -520,10 +587,14 @@ jobject AwtMenuItem::GetFontMetrics(JNIEnv *env, jobject font) ...@@ -520,10 +587,14 @@ jobject AwtMenuItem::GetFontMetrics(JNIEnv *env, jobject font)
if (env->PushLocalFrame(2) < 0) if (env->PushLocalFrame(2) < 0)
return NULL; return NULL;
jclass cls = env->FindClass("java/awt/Toolkit"); jclass cls = env->FindClass("java/awt/Toolkit");
CHECK_NULL_RETURN(cls, NULL);
jobject toolkitLocal = jobject toolkitLocal =
env->CallStaticObjectMethod(cls, AwtToolkit::getDefaultToolkitMID); env->CallStaticObjectMethod(cls, AwtToolkit::getDefaultToolkitMID);
env->DeleteLocalRef(cls);
CHECK_NULL_RETURN(toolkitLocal, NULL);
toolkit = env->NewGlobalRef(toolkitLocal); toolkit = env->NewGlobalRef(toolkitLocal);
DASSERT(!safe_ExceptionOccurred(env)); env->DeleteLocalRef(toolkitLocal);
CHECK_NULL_RETURN(toolkit, NULL);
env->PopLocalFrame(0); env->PopLocalFrame(0);
} }
/* /*
...@@ -739,6 +810,10 @@ void AwtMenuItem::_SetLabel(void *param) { ...@@ -739,6 +810,10 @@ void AwtMenuItem::_SetLabel(void *param) {
{ {
empty = JNU_NewStringPlatform(env, TEXT("")); empty = JNU_NewStringPlatform(env, TEXT(""));
} }
if (env->ExceptionCheck()) {
badAlloc = 1;
goto ret;
}
LPCTSTR labelPtr; LPCTSTR labelPtr;
if (empty != NULL) if (empty != NULL)
{ {
...@@ -846,10 +921,9 @@ Java_java_awt_MenuComponent_initIDs(JNIEnv *env, jclass cls) ...@@ -846,10 +921,9 @@ Java_java_awt_MenuComponent_initIDs(JNIEnv *env, jclass cls)
TRY; TRY;
AwtMenuItem::fontID = env->GetFieldID(cls, "font", "Ljava/awt/Font;"); AwtMenuItem::fontID = env->GetFieldID(cls, "font", "Ljava/awt/Font;");
CHECK_NULL(AwtMenuItem::fontID);
AwtMenuItem::appContextID = env->GetFieldID(cls, "appContext", "Lsun/awt/AppContext;"); AwtMenuItem::appContextID = env->GetFieldID(cls, "appContext", "Lsun/awt/AppContext;");
DASSERT(AwtMenuItem::fontID != NULL);
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
} }
...@@ -868,11 +942,9 @@ Java_java_awt_MenuItem_initIDs(JNIEnv *env, jclass cls) ...@@ -868,11 +942,9 @@ Java_java_awt_MenuItem_initIDs(JNIEnv *env, jclass cls)
TRY; TRY;
AwtMenuItem::labelID = env->GetFieldID(cls, "label", "Ljava/lang/String;"); AwtMenuItem::labelID = env->GetFieldID(cls, "label", "Ljava/lang/String;");
CHECK_NULL(AwtMenuItem::labelID);
AwtMenuItem::enabledID = env->GetFieldID(cls, "enabled", "Z"); AwtMenuItem::enabledID = env->GetFieldID(cls, "enabled", "Z");
DASSERT(AwtMenuItem::labelID != NULL);
DASSERT(AwtMenuItem::enabledID != NULL);
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
} }
...@@ -892,8 +964,6 @@ Java_java_awt_CheckboxMenuItem_initIDs(JNIEnv *env, jclass cls) ...@@ -892,8 +964,6 @@ Java_java_awt_CheckboxMenuItem_initIDs(JNIEnv *env, jclass cls)
AwtMenuItem::stateID = env->GetFieldID(cls, "state", "Z"); AwtMenuItem::stateID = env->GetFieldID(cls, "state", "Z");
DASSERT(AwtMenuItem::stateID != NULL);
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
} }
...@@ -917,15 +987,13 @@ Java_sun_awt_windows_WMenuItemPeer_initIDs(JNIEnv *env, jclass cls) ...@@ -917,15 +987,13 @@ Java_sun_awt_windows_WMenuItemPeer_initIDs(JNIEnv *env, jclass cls)
TRY; TRY;
AwtMenuItem::isCheckboxID = env->GetFieldID(cls, "isCheckbox", "Z"); AwtMenuItem::isCheckboxID = env->GetFieldID(cls, "isCheckbox", "Z");
CHECK_NULL(AwtMenuItem::isCheckboxID);
AwtMenuItem::shortcutLabelID = env->GetFieldID(cls, "shortcutLabel", AwtMenuItem::shortcutLabelID = env->GetFieldID(cls, "shortcutLabel",
"Ljava/lang/String;"); "Ljava/lang/String;");
CHECK_NULL(AwtMenuItem::shortcutLabelID);
AwtMenuItem::getDefaultFontMID = AwtMenuItem::getDefaultFontMID =
env->GetStaticMethodID(cls, "getDefaultFont", "()Ljava/awt/Font;"); env->GetStaticMethodID(cls, "getDefaultFont", "()Ljava/awt/Font;");
DASSERT(AwtMenuItem::isCheckboxID != NULL);
DASSERT(AwtMenuItem::shortcutLabelID != NULL);
DASSERT(AwtMenuItem::getDefaultFontMID != NULL);
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册