New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8269223: -Xcheck:jni WARNINGs working with fonts on Linux #4572
Changes from 4 commits
1622a16
d1bc82e
9cc7c8e
050c2e9
13b0868
4b2febe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
@@ -866,7 +866,8 @@ void D3DRQ_FlushBuffer(void *pParam) | ||
|
||
if (!JNU_IsNull(env, pFlush->runnable)) { | ||
J2dTraceLn(J2D_TRACE_VERBOSE, " executing runnable"); | ||
JNU_CallMethodByName(env, NULL, pFlush->runnable, "run", "()V"); | ||
jboolean ignoreException; | ||
JNU_CallMethodByName(env, &ignoreException, pFlush->runnable, "run", "()V"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the purpose of this change? the only difference is that in the second case the ExceptionCheck will be called, does it affect something? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does it actually suppress the "Xcheck:jni" or it clears a raised exception? If an exception is still "raised" after this call we should do some additional steps to log/clean it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, the exception will still be "raised" after this call. Since there are no JNI calls (at least those that are forbidden to make with an exception pending) between here and return back to Java, I believe no additional steps are necessary. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Then I suggest logging them via some of the trace macros. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, added some logging. |
||
} | ||
} | ||
|
||
@@ -6569,11 +6569,11 @@ JNIEXPORT void JNICALL | ||
Java_java_awt_Component_initIDs(JNIEnv *env, jclass cls) | ||
{ | ||
TRY; | ||
jclass inputEventClazz = env->FindClass("java/awt/event/InputEvent"); | ||
CHECK_NULL(inputEventClazz); | ||
jmethodID getButtonDownMasksID = env->GetStaticMethodID(inputEventClazz, "getButtonDownMasks", "()[I"); | ||
CHECK_NULL(getButtonDownMasksID); | ||
jintArray obj = (jintArray)env->CallStaticObjectMethod(inputEventClazz, getButtonDownMasksID); | ||
jboolean ignoreException; | ||
jintArray obj = (jintArray)JNU_CallStaticMethodByName(env, &ignoreException, | ||
"java/awt/event/InputEvent", | ||
"getButtonDownMasks", "()[I").l; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. obj might be null? Can not we just add CHECK_NULL(obj) here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. obj indeed might be null, especially since all kinds of things could go wrong during class/method resolution. Added |
||
CHECK_NULL(obj); | ||
jint * tmp = env->GetIntArrayElements(obj, JNI_FALSE); | ||
CHECK_NULL(tmp); | ||
jsize len = env->GetArrayLength(obj); | ||
@@ -0,0 +1,68 @@ | ||
/* | ||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
* Copyright (c) 2021, JetBrains s.r.o.. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
* or visit www.oracle.com if you need additional information or have any | ||
* questions. | ||
*/ | ||
|
||
/* @test | ||
* @bug 8269223 | ||
* @summary Verifies that -Xcheck:jni issues no warnings from freetypeScaler.c | ||
* @library /test/lib | ||
* @key headful | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What about this test is headful ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh you are getting metrics for a JFrame ? That's not going to exercise any new font code so is pointless except to make it so the test has to be headful. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. But There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So what's wrong with ? No frame needed. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Indeed. Changed the test per your suggestions. |
||
* @run main FreeTypeScalerJNICheck | ||
*/ | ||
import javax.swing.*; | ||
import java.awt.*; | ||
import java.awt.geom.Rectangle2D; | ||
import java.awt.image.*; | ||
import java.io.*; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we get rid of all these wild card imports ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, replaced with single-class imports. |
||
import jdk.test.lib.process.ProcessTools; | ||
import jdk.test.lib.process.OutputAnalyzer; | ||
|
||
public class FreeTypeScalerJNICheck { | ||
public static void main(String[] args) throws Exception { | ||
if (args.length > 0 && args[0].equals("runtest")) { | ||
runTest(); | ||
} else { | ||
ProcessBuilder pb = ProcessTools.createTestJvm("-Xcheck:jni", FreeTypeScalerJNICheck.class.getName(), "runtest"); | ||
OutputAnalyzer oa = ProcessTools.executeProcess(pb); | ||
oa.shouldContain("Done").shouldNotContain("WARNING").shouldHaveExitValue(0); | ||
} | ||
} | ||
|
||
public static void runTest() { | ||
String families[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); | ||
JFrame frame = new JFrame("test"); | ||
BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); | ||
Graphics2D g2d = bi.createGraphics(); | ||
|
||
for (String ff : families) | ||
{ | ||
Font font = Font.decode(ff); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gosh, does anyone still use decode() ? I keep forgetting it exists. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, changed to |
||
Rectangle2D bounds = font.getStringBounds("test", g2d.getFontRenderContext()); | ||
FontMetrics metrics = frame.getFontMetrics(font); | ||
System.out.println(bounds.getHeight() + metrics.getHeight()); // use bounds and metrics | ||
} | ||
|
||
System.out.println("Done"); | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://docs.oracle.com/en/java/javase/11/docs/specs/jni/functions.html#exceptiondescribe
"The pending exception is cleared as a side-effect of calling this function"
So you certainly don't need both of these and I would prefer that Describe only be used if really debugging where we think there's a REAL chance of an exception rather than just to keep JNI happy.
And the upcall that is likely (readBlock) itself will log any IOException (and catch it) in the event of an I/O error so I really think this is unlikely to be useful here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, makes sense. I made
CHECK_EXCEPTION()
call eitherClear...
orDescribe...
based on the value ofdebugFonts
.Please, take a look.