From 50fbc85c03fcebf3c9ccd9bf8b717643126ccb69 Mon Sep 17 00:00:00 2001 From: dav Date: Tue, 25 Mar 2008 15:16:03 +0300 Subject: [PATCH] 6610244: modal dialog closes with fatal error if -Xcheck:jni is set Summary: obtain WWindowPeer class every time it is required Reviewed-by: art --- src/windows/native/sun/windows/awt_Dialog.cpp | 10 ++- src/windows/native/sun/windows/awt_Window.cpp | 10 +-- src/windows/native/sun/windows/awt_Window.h | 7 +- .../Dialog/CrashXCheckJni/CrashXCheckJni.java | 64 +++++++++++++++++++ 4 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java diff --git a/src/windows/native/sun/windows/awt_Dialog.cpp b/src/windows/native/sun/windows/awt_Dialog.cpp index 0c98fc0d9..948fc0883 100644 --- a/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/src/windows/native/sun/windows/awt_Dialog.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -428,8 +428,12 @@ void AwtDialog::ModalActivateNextWindow(HWND dialogHWnd, { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jlongArray windows = (jlongArray)(env->CallStaticObjectMethod(AwtWindow::wwindowPeerCls, - AwtWindow::getActiveWindowsMID)); + jclass wwindowPeerCls = env->FindClass("sun/awt/windows/WWindowPeer"); + jmethodID getActiveWindowsMID = env->GetStaticMethodID(wwindowPeerCls, + "getActiveWindowHandles", "()[J"); + DASSERT(getActiveWindowsMID != NULL); + jlongArray windows = (jlongArray)(env->CallStaticObjectMethod(wwindowPeerCls, + getActiveWindowsMID)); if (windows == NULL) { return; } diff --git a/src/windows/native/sun/windows/awt_Window.cpp b/src/windows/native/sun/windows/awt_Window.cpp index 7e2f31fb1..2d94c7793 100644 --- a/src/windows/native/sun/windows/awt_Window.cpp +++ b/src/windows/native/sun/windows/awt_Window.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -122,9 +122,6 @@ jfieldID AwtWindow::warningStringID; jfieldID AwtWindow::locationByPlatformID; jfieldID AwtWindow::autoRequestFocusID; -jclass AwtWindow::wwindowPeerCls; -jmethodID AwtWindow::getActiveWindowsMID; - jfieldID AwtWindow::sysXID; jfieldID AwtWindow::sysYID; jfieldID AwtWindow::sysWID; @@ -2159,11 +2156,6 @@ Java_sun_awt_windows_WWindowPeer_initIDs(JNIEnv *env, jclass cls) { TRY; - AwtWindow::wwindowPeerCls = cls; - AwtWindow::getActiveWindowsMID = - env->GetStaticMethodID(cls, "getActiveWindowHandles", "()[J"); - DASSERT(AwtWindow::getActiveWindowsMID != NULL); - AwtWindow::sysXID = env->GetFieldID(cls, "sysX", "I"); AwtWindow::sysYID = env->GetFieldID(cls, "sysY", "I"); AwtWindow::sysWID = env->GetFieldID(cls, "sysW", "I"); diff --git a/src/windows/native/sun/windows/awt_Window.h b/src/windows/native/sun/windows/awt_Window.h index 8e654a2d8..bc706d97a 100644 --- a/src/windows/native/sun/windows/awt_Window.h +++ b/src/windows/native/sun/windows/awt_Window.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -57,11 +57,6 @@ public: static jfieldID screenID; /* screen number passed over from WindowPeer */ static jfieldID autoRequestFocusID; - /* WWindowPeer class */ - static jclass wwindowPeerCls; - /* long[] getActiveWindowHandles() method in WWindowPeer */ - static jmethodID getActiveWindowsMID; - // The coordinates at the peer. static jfieldID sysXID; static jfieldID sysYID; diff --git a/test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java b/test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java new file mode 100644 index 000000000..377fae51c --- /dev/null +++ b/test/java/awt/Dialog/CrashXCheckJni/CrashXCheckJni.java @@ -0,0 +1,64 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test + @bug 6610244 + @library ../../regtesthelpers + @build Util Sysout AbstractTest + @summary modal dialog closes with fatal error if -Xcheck:jni is set + @author Andrei Dmitriev : area=awt.dialog + @run main/othervm -Xcheck:jni CrashXCheckJni +*/ + +import java.awt.*; +import java.awt.event.*; +import java.util.Timer; +import java.util.TimerTask; +import test.java.awt.regtesthelpers.Util; +import test.java.awt.regtesthelpers.AbstractTest; +import test.java.awt.regtesthelpers.Sysout; + +public class CrashXCheckJni { + + public static void main(String []s) + { + final Dialog fd = new Dialog(new Frame(), true); + Timer t = new Timer(); + t.schedule(new TimerTask() { + + public void run() { + System.out.println("RUNNING TASK"); + fd.setVisible(false); + fd.dispose(); + System.out.println("FINISHING TASK"); + } + }, 3000L); + + fd.setVisible(true); + t.cancel(); + Util.waitForIdle(null); + + AbstractTest.pass(); + } +} -- GitLab