8025280: [parfait] warnings from b107 for jdk.src.share.native.sun.java2d.loops: JNI exception pending, JNI critical region violation
authorjchen
Thu, 03 Oct 2013 13:16:31 -0700
changeset 20421 8fab9959a1bc
parent 20420 549b20d82587
child 20422 1a47790e7d9b
8025280: [parfait] warnings from b107 for jdk.src.share.native.sun.java2d.loops: JNI exception pending, JNI critical region violation Reviewed-by: prr, jgodinez
jdk/src/share/native/sun/java2d/loops/Blit.c
jdk/src/share/native/sun/java2d/loops/BlitBg.c
jdk/src/share/native/sun/java2d/loops/DrawPath.c
jdk/src/share/native/sun/java2d/loops/DrawPolygons.c
jdk/src/share/native/sun/java2d/loops/FillPath.c
jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c
jdk/src/share/native/sun/java2d/loops/MaskBlit.c
jdk/src/share/native/sun/java2d/loops/MaskFill.c
jdk/src/share/native/sun/java2d/loops/ScaledBlit.c
jdk/src/share/native/sun/java2d/loops/TransformHelper.c
--- 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);