diff --git a/src/windows/native/sun/windows/awt_Toolkit.cpp b/src/windows/native/sun/windows/awt_Toolkit.cpp index ba8d6de26739caabb26c94ade39f52fcc7622c04..2ef0f0c798142114aedc01e2162d095debc98e71 100644 --- a/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -1,5 +1,5 @@ /* - * 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"), "", "(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, "", "(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, diff --git a/src/windows/native/sun/windows/awt_Toolkit.h b/src/windows/native/sun/windows/awt_Toolkit.h index 5ee5e4965bc2c95e4cbef0bcfdfb4b9334b55cb9..3782aac8cf7bea8a637d11e6a08c6072a0d528a4 100644 --- a/src/windows/native/sun/windows/awt_Toolkit.h +++ b/src/windows/native/sun/windows/awt_Toolkit.h @@ -1,5 +1,5 @@ /* - * 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); }