OpenJDK / jdk8u / jdk8u / jdk
changeset 9304:e15c548763e4
8034104: [parfait] warnings from jdk/src/macosx/native/sun/awt/CTextPipe.m: JNI exception pending, JNI critical region violation
Reviewed-by: jgodinez, serb
author | prr |
---|---|
date | Mon, 31 Mar 2014 16:03:48 -0700 |
parents | 0326ba1d2cbd |
children | 7ab172b1ddbc |
files | src/macosx/native/sun/awt/CTextPipe.m |
diffstat | 1 files changed, 27 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/macosx/native/sun/awt/CTextPipe.m Mon Mar 31 16:03:45 2014 -0700 +++ b/src/macosx/native/sun/awt/CTextPipe.m Mon Mar 31 16:03:48 2014 -0700 @@ -147,7 +147,7 @@ CGAffineTransform invTx = CGAffineTransformInvert(strike->fTx); - NSUInteger i; + NSInteger i; for (i = 0; i < length; i++) { CGGlyph glyph = glyphs[i]; @@ -355,19 +355,31 @@ static JNF_CLASS_CACHE(jc_StandardGlyphVector_GlyphTransformInfo, "sun/font/StandardGlyphVector$GlyphTransformInfo"); static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_transforms, jc_StandardGlyphVector_GlyphTransformInfo, "transforms", "[D"); jdoubleArray g_gtiTransformsArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_transforms); //(*env)->GetObjectField(env, gti, g_gtiTransforms); + if (g_gtiTransformsArray == NULL) { + return; + } jdouble *g_gvTransformsAsDoubles = (*env)->GetPrimitiveArrayCritical(env, g_gtiTransformsArray, NULL); + if (g_gvTransformsAsDoubles == NULL) { + (*env)->DeleteLocalRef(env, g_gtiTransformsArray); + return; + } static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_indices, jc_StandardGlyphVector_GlyphTransformInfo, "indices", "[I"); jintArray g_gtiTXIndicesArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_indices); jint *g_gvTXIndicesAsInts = (*env)->GetPrimitiveArrayCritical(env, g_gtiTXIndicesArray, NULL); - + if (g_gvTXIndicesAsInts == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTransformsArray, g_gvTransformsAsDoubles, JNI_ABORT); + (*env)->DeleteLocalRef(env, g_gtiTransformsArray); + (*env)->DeleteLocalRef(env, g_gtiTXIndicesArray); + return; + } // slowest case, we have per-glyph transforms, and possibly glyph substitution as well JavaCT_DrawGlyphVector(qsdo, strike, useSubstituion, uniChars, glyphs, advances, g_gvTXIndicesAsInts, g_gvTransformsAsDoubles, length); (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTransformsArray, g_gvTransformsAsDoubles, JNI_ABORT); - (*env)->DeleteLocalRef(env, g_gtiTransformsArray); + (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTXIndicesArray, g_gvTXIndicesAsInts, JNI_ABORT); - (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTXIndicesArray, g_gvTXIndicesAsInts, JNI_ABORT); + (*env)->DeleteLocalRef(env, g_gtiTransformsArray); (*env)->DeleteLocalRef(env, g_gtiTXIndicesArray); } @@ -403,6 +415,9 @@ { // fill the glyph buffer jint *glyphsAsInts = (*env)->GetPrimitiveArrayCritical(env, glyphsArray, NULL); + if (glyphsAsInts == NULL) { + return; + } // if a glyph code from Java is negative, that means it is really a unicode value // which we can use in CoreText to strike the character in another font @@ -429,11 +444,15 @@ // fill the advance buffer static JNF_MEMBER_CACHE(jm_StandardGlyphVector_positions, jc_StandardGlyphVector, "positions", "[F"); jfloatArray posArray = JNFGetObjectField(env, gVector, jm_StandardGlyphVector_positions); - if (posArray != NULL) - { + jfloat *positions = NULL; + if (posArray != NULL) { // in this case, the positions have already been pre-calculated for us on the Java side - - jfloat *positions = (*env)->GetPrimitiveArrayCritical(env, posArray, NULL); + positions = (*env)->GetPrimitiveArrayCritical(env, posArray, NULL); + if (positions == NULL) { + (*env)->DeleteLocalRef(env, posArray); + } + } + if (positions != NULL) { CGPoint prev; prev.x = positions[0]; prev.y = positions[1];