8025280: [parfait] warnings from b107 for jdk.src.share.native.sun.java2d.loops: JNI exception pending, JNI critical region violation
Reviewed-by: prr, jgodinez
--- a/jdk/src/share/native/sun/java2d/loops/Blit.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/Blit.c Thu Oct 03 13:16:31 2013 -0700
@@ -60,8 +60,11 @@
}
srcOps = SurfaceData_GetOps(env, srcData);
+ if (srcOps == 0) {
+ return;
+ }
dstOps = SurfaceData_GetOps(env, dstData);
- if (srcOps == 0 || dstOps == 0) {
+ if (dstOps == 0) {
return;
}
--- a/jdk/src/share/native/sun/java2d/loops/BlitBg.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/BlitBg.c Thu Oct 03 13:16:31 2013 -0700
@@ -60,8 +60,11 @@
}
srcOps = SurfaceData_GetOps(env, srcData);
+ if (srcOps == 0) {
+ return;
+ }
dstOps = SurfaceData_GetOps(env, dstData);
- if (srcOps == 0 || dstOps == 0) {
+ if (dstOps == 0) {
return;
}
--- a/jdk/src/share/native/sun/java2d/loops/DrawPath.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/DrawPath.c Thu Oct 03 13:16:31 2013 -0700
@@ -75,7 +75,8 @@
CompositeInfo compInfo;
jint ret;
NativePrimitive *pPrim = GetNativePrim(env, self);
- jint stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID);
+ jint stroke;
+ jboolean throwExc = JNI_FALSE;
if (pPrim == NULL) {
return;
@@ -84,6 +85,8 @@
GrPrim_Sg2dGetCompInfo(env, sg2d, pPrim, &compInfo);
}
+ stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID);
+
sdOps = SurfaceData_GetOps(env, sData);
if (sdOps == 0) {
return;
@@ -112,6 +115,10 @@
maxCoords = (*env)->GetArrayLength(env, coordsArray);
coords = (jfloat*)(*env)->GetPrimitiveArrayCritical(
env, coordsArray, NULL);
+ if (coords == NULL) {
+ SurfaceData_InvokeUnlock(env, sdOps, &rasInfo);
+ return;
+ }
if (ret == SD_SLOWLOCK) {
GrPrim_RefineBounds(&rasInfo.bounds, transX, transY,
@@ -157,22 +164,29 @@
drawHandler.yMax = rasInfo.bounds.y2;
drawHandler.pData = &dHData;
- if (!doDrawPath(&drawHandler, NULL, transX, transY,
- coords, maxCoords, types, numTypes,
- (stroke == sunHints_INTVAL_STROKE_PURE)?
- PH_STROKE_PURE : PH_STROKE_DEFAULT))
- {
- JNU_ThrowArrayIndexOutOfBoundsException(env,
- "coords array");
+ if (types != NULL) {
+ if (!doDrawPath(&drawHandler, NULL, transX, transY,
+ coords, maxCoords, types, numTypes,
+ (stroke == sunHints_INTVAL_STROKE_PURE)?
+ PH_STROKE_PURE : PH_STROKE_DEFAULT))
+ {
+ throwExc = JNI_TRUE;
+ }
+
+ (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types,
+ JNI_ABORT);
}
-
- (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types,
- JNI_ABORT);
}
}
SurfaceData_InvokeRelease(env, sdOps, &rasInfo);
}
(*env)->ReleasePrimitiveArrayCritical(env, coordsArray, coords,
JNI_ABORT);
+
+ if (throwExc) {
+ JNU_ThrowArrayIndexOutOfBoundsException(env,
+ "coords array");
+ }
+
SurfaceData_InvokeUnlock(env, sdOps, &rasInfo);
}
--- a/jdk/src/share/native/sun/java2d/loops/DrawPolygons.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/DrawPolygons.c Thu Oct 03 13:16:31 2013 -0700
@@ -186,10 +186,15 @@
}
xPointsPtr = (*env)->GetPrimitiveArrayCritical(env, xPointsArray, NULL);
- yPointsPtr = (*env)->GetPrimitiveArrayCritical(env, yPointsArray, NULL);
- if (!xPointsPtr || !yPointsPtr) {
+ if (!xPointsPtr) {
ok = JNI_FALSE;
}
+ if (ok) {
+ yPointsPtr = (*env)->GetPrimitiveArrayCritical(env, yPointsArray, NULL);
+ if (!yPointsPtr) {
+ ok = JNI_FALSE;
+ }
+ }
}
if (ok) {
--- a/jdk/src/share/native/sun/java2d/loops/FillPath.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/FillPath.c Thu Oct 03 13:16:31 2013 -0700
@@ -64,7 +64,8 @@
CompositeInfo compInfo;
jint ret;
NativePrimitive *pPrim = GetNativePrim(env, self);
- jint stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID);
+ jint stroke;
+ jboolean throwExc = JNI_FALSE;
if (pPrim == NULL) {
return;
@@ -73,6 +74,8 @@
GrPrim_Sg2dGetCompInfo(env, sg2d, pPrim, &compInfo);
}
+ stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID);
+
sdOps = SurfaceData_GetOps(env, sData);
if (sdOps == 0) {
return;
@@ -102,6 +105,10 @@
maxCoords = (*env)->GetArrayLength(env, coordsArray);
coords = (jfloat*)(*env)->GetPrimitiveArrayCritical(
env, coordsArray, NULL);
+ if (coords == NULL) {
+ SurfaceData_InvokeUnlock(env, sdOps, &rasInfo);
+ return;
+ }
if (ret == SD_SLOWLOCK) {
GrPrim_RefineBounds(&rasInfo.bounds, transX, transY,
@@ -146,24 +153,31 @@
drawHandler.yMax = rasInfo.bounds.y2;
drawHandler.pData = &dHData;
- if (!doFillPath(&drawHandler,
- transX, transY, coords,
- maxCoords, types, numTypes,
- (stroke == sunHints_INTVAL_STROKE_PURE)?
- PH_STROKE_PURE : PH_STROKE_DEFAULT,
- fillRule))
- {
- JNU_ThrowArrayIndexOutOfBoundsException(env,
- "coords array");
+ if (types != NULL) {
+ if (!doFillPath(&drawHandler,
+ transX, transY, coords,
+ maxCoords, types, numTypes,
+ (stroke == sunHints_INTVAL_STROKE_PURE)?
+ PH_STROKE_PURE : PH_STROKE_DEFAULT,
+ fillRule))
+ {
+ throwExc = JNI_TRUE;
+ }
+
+ (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types,
+ JNI_ABORT);
}
-
- (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types,
- JNI_ABORT);
}
}
SurfaceData_InvokeRelease(env, sdOps, &rasInfo);
}
(*env)->ReleasePrimitiveArrayCritical(env, coordsArray, coords,
JNI_ABORT);
+
+ if (throwExc) {
+ JNU_ThrowArrayIndexOutOfBoundsException(env,
+ "coords array");
+ }
+
SurfaceData_InvokeUnlock(env, sdOps, &rasInfo);
}
--- a/jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c Thu Oct 03 13:16:31 2013 -0700
@@ -205,33 +205,36 @@
RegisterFunc RegisterFourByteAbgr;
RegisterFunc RegisterFourByteAbgrPre;
- RegisterAnyByte(env);
- RegisterByteBinary1Bit(env);
- RegisterByteBinary2Bit(env);
- RegisterByteBinary4Bit(env);
- RegisterByteIndexed(env);
- RegisterByteGray(env);
- RegisterIndex8Gray(env);
- RegisterIndex12Gray(env);
- RegisterAnyShort(env);
- RegisterUshort555Rgb(env);
- RegisterUshort565Rgb(env);
- RegisterUshort4444Argb(env);
- RegisterUshort555Rgbx(env);
- RegisterUshortGray(env);
- RegisterUshortIndexed(env);
- RegisterAny3Byte(env);
- RegisterThreeByteBgr(env);
- RegisterAnyInt(env);
- RegisterIntArgb(env);
- RegisterIntArgbPre(env);
- RegisterIntArgbBm(env);
- RegisterIntRgb(env);
- RegisterIntBgr(env);
- RegisterIntRgbx(env);
- RegisterAny4Byte(env);
- RegisterFourByteAbgr(env);
- RegisterFourByteAbgrPre(env);
+ if (!RegisterAnyByte(env) ||
+ !RegisterByteBinary1Bit(env) ||
+ !RegisterByteBinary2Bit(env) ||
+ !RegisterByteBinary4Bit(env) ||
+ !RegisterByteIndexed(env) ||
+ !RegisterByteGray(env) ||
+ !RegisterIndex8Gray(env) ||
+ !RegisterIndex12Gray(env) ||
+ !RegisterAnyShort(env) ||
+ !RegisterUshort555Rgb(env) ||
+ !RegisterUshort565Rgb(env) ||
+ !RegisterUshort4444Argb(env) ||
+ !RegisterUshort555Rgbx(env) ||
+ !RegisterUshortGray(env) ||
+ !RegisterUshortIndexed(env) ||
+ !RegisterAny3Byte(env) ||
+ !RegisterThreeByteBgr(env) ||
+ !RegisterAnyInt(env) ||
+ !RegisterIntArgb(env) ||
+ !RegisterIntArgbPre(env) ||
+ !RegisterIntArgbBm(env) ||
+ !RegisterIntRgb(env) ||
+ !RegisterIntBgr(env) ||
+ !RegisterIntRgbx(env) ||
+ !RegisterAny4Byte(env) ||
+ !RegisterFourByteAbgr(env) ||
+ !RegisterFourByteAbgrPre(env))
+ {
+ return;
+ }
}
#define _StartOf(T) ((T *) (&T##s))
--- a/jdk/src/share/native/sun/java2d/loops/MaskBlit.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/MaskBlit.c Thu Oct 03 13:16:31 2013 -0700
@@ -60,8 +60,11 @@
}
srcOps = SurfaceData_GetOps(env, srcData);
+ if (srcOps == 0) {
+ return;
+ }
dstOps = SurfaceData_GetOps(env, dstData);
- if (srcOps == 0 || dstOps == 0) {
+ if (dstOps == 0) {
return;
}
@@ -96,6 +99,13 @@
(maskArray
? (*env)->GetPrimitiveArrayCritical(env, maskArray, 0)
: 0);
+ if (maskArray != NULL && pMask == NULL) {
+ SurfaceData_InvokeRelease(env, dstOps, &dstInfo);
+ SurfaceData_InvokeRelease(env, srcOps, &srcInfo);
+ SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);
+ SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
+ return;
+ }
jint savesx = srcInfo.bounds.x1;
jint savedx = dstInfo.bounds.x1;
Region_StartIteration(env, &clipInfo);
--- a/jdk/src/share/native/sun/java2d/loops/MaskFill.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/MaskFill.c Thu Oct 03 13:16:31 2013 -0700
@@ -84,6 +84,11 @@
(maskArray
? (*env)->GetPrimitiveArrayCritical(env, maskArray, 0)
: 0);
+ if (maskArray != NULL && pMask == NULL) {
+ SurfaceData_InvokeRelease(env, sdOps, &rasInfo);
+ SurfaceData_InvokeUnlock(env, sdOps, &rasInfo);
+ return;
+ }
maskoff += ((rasInfo.bounds.y1 - y) * maskscan +
(rasInfo.bounds.x1 - x));
(*pPrim->funcs.maskfill)(pDst,
--- a/jdk/src/share/native/sun/java2d/loops/ScaledBlit.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/ScaledBlit.c Thu Oct 03 13:16:31 2013 -0700
@@ -296,8 +296,11 @@
}
srcOps = SurfaceData_GetOps(env, srcData);
+ if (srcOps == 0) {
+ return;
+ }
dstOps = SurfaceData_GetOps(env, dstData);
- if (srcOps == 0 || dstOps == 0) {
+ if (dstOps == 0) {
return;
}
--- a/jdk/src/share/native/sun/java2d/loops/TransformHelper.c Thu Oct 03 11:28:37 2013 +0400
+++ b/jdk/src/share/native/sun/java2d/loops/TransformHelper.c Thu Oct 03 13:16:31 2013 -0700
@@ -326,8 +326,11 @@
}
srcOps = SurfaceData_GetOps(env, srcData);
+ if (srcOps == 0) {
+ return;
+ }
dstOps = SurfaceData_GetOps(env, dstData);
- if (srcOps == 0 || dstOps == 0) {
+ if (dstOps == 0) {
return;
}
@@ -411,7 +414,7 @@
}
if (pEdges == NULL) {
- if (numedges > 0) {
+ if (!(*env)->ExceptionCheck(env) && numedges > 0) {
JNU_ThrowInternalError(env, "Unable to allocate edge list");
}
SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);