--- a/jdk/src/share/native/sun/font/layout/SunLayoutEngine.cpp Fri Mar 21 21:56:50 2014 +0400
+++ b/jdk/src/share/native/sun/font/layout/SunLayoutEngine.cpp Fri Mar 21 11:32:23 2014 -0700
@@ -56,50 +56,13 @@
JNIEXPORT void JNICALL
Java_sun_font_SunLayoutEngine_initGVIDs
(JNIEnv *env, jclass cls) {
- gvdClass = env->FindClass(gvdClassName);
- if (!gvdClass) {
- JNU_ThrowClassNotFoundException(env, gvdClassName);
- return;
- }
- gvdClass = (jclass)env->NewGlobalRef(gvdClass);
- if (!gvdClass) {
- JNU_ThrowInternalError(env, "could not create global ref");
- return;
- }
- gvdCountFID = env->GetFieldID(gvdClass, "_count", "I");
- if (!gvdCountFID) {
- gvdClass = 0;
- JNU_ThrowNoSuchFieldException(env, "_count");
- return;
- }
-
- gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I");
- if (!gvdFlagsFID) {
- gvdClass = 0;
- JNU_ThrowNoSuchFieldException(env, "_flags");
- return;
- }
-
- gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I");
- if (!gvdGlyphsFID) {
- gvdClass = 0;
- JNU_ThrowNoSuchFieldException(env, "_glyphs");
- return;
- }
-
- gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F");
- if (!gvdPositionsFID) {
- gvdClass = 0;
- JNU_ThrowNoSuchFieldException(env, "_positions");
- return;
- }
-
+ CHECK_NULL(gvdClass = env->FindClass(gvdClassName));
+ CHECK_NULL(gvdClass = (jclass)env->NewGlobalRef(gvdClass));
+ CHECK_NULL(gvdCountFID = env->GetFieldID(gvdClass, "_count", "I"));
+ CHECK_NULL(gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I"));
+ CHECK_NULL(gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I"));
+ CHECK_NULL(gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F"));
gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I");
- if (!gvdIndicesFID) {
- gvdClass = 0;
- JNU_ThrowNoSuchFieldException(env, "_indices");
- return;
- }
}
int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) {
@@ -195,7 +158,7 @@
jchar* chars = buffer;
if (len > 256) {
size_t size = len * sizeof(jchar);
- if (size / sizeof(jchar) != len) {
+ if (size / sizeof(jchar) != (size_t)len) {
return;
}
chars = (jchar*)malloc(size);
@@ -220,8 +183,10 @@
env->SetIntField(gvdata, gvdCountFID, -1); // flag failure
} else {
if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) {
- // !!! hmmm, could use current value in positions array of GVData...
- putFloat(env, pt, x, y);
+ if (!(env->ExceptionCheck())) {
+ // !!! hmmm, could use current value in positions array of GVData...
+ putFloat(env, pt, x, y);
+ }
}
}
--- a/jdk/src/share/native/sun/font/sunFont.c Fri Mar 21 21:56:50 2014 +0400
+++ b/jdk/src/share/native/sun/font/sunFont.c Fri Mar 21 11:32:23 2014 -0700
@@ -27,6 +27,7 @@
#include "string.h"
#include "gdefs.h"
#include "jlong.h"
+#include "jni_util.h"
#include "sunfontids.h"
#include "fontscalerdefs.h"
#include "sun_font_SunFontManager.h"
@@ -81,100 +82,106 @@
if (initialisedFontIDs) {
return;
}
- tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont");
- sunFontIDs.ttReadBlockMID =
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont"));
+ CHECK_NULL(sunFontIDs.ttReadBlockMID =
(*env)->GetMethodID(env, tmpClass, "readBlock",
- "(Ljava/nio/ByteBuffer;II)I");
- sunFontIDs.ttReadBytesMID =
- (*env)->GetMethodID(env, tmpClass, "readBytes", "(II)[B");
+ "(Ljava/nio/ByteBuffer;II)I"));
+ CHECK_NULL(sunFontIDs.ttReadBytesMID =
+ (*env)->GetMethodID(env, tmpClass, "readBytes", "(II)[B"));
- tmpClass = (*env)->FindClass(env, "sun/font/Type1Font");
- sunFontIDs.readFileMID =
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/Type1Font"));
+ CHECK_NULL(sunFontIDs.readFileMID =
(*env)->GetMethodID(env, tmpClass,
- "readFile", "(Ljava/nio/ByteBuffer;)V");
+ "readFile", "(Ljava/nio/ByteBuffer;)V"));
- tmpClass = (*env)->FindClass(env, "java/awt/geom/Point2D$Float");
+ CHECK_NULL(tmpClass =
+ (*env)->FindClass(env, "java/awt/geom/Point2D$Float"));
sunFontIDs.pt2DFloatClass = (jclass)(*env)->NewGlobalRef(env, tmpClass);
- sunFontIDs.pt2DFloatCtr =
- (*env)->GetMethodID(env, sunFontIDs.pt2DFloatClass, "<init>","(FF)V");
+ CHECK_NULL(sunFontIDs.pt2DFloatCtr =
+ (*env)->GetMethodID(env, sunFontIDs.pt2DFloatClass, "<init>","(FF)V"));
- sunFontIDs.xFID =
- (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "x", "F");
- sunFontIDs.yFID =
- (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "y", "F");
+ CHECK_NULL(sunFontIDs.xFID =
+ (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "x", "F"));
+ CHECK_NULL(sunFontIDs.yFID =
+ (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "y", "F"));
- tmpClass = (*env)->FindClass(env, "sun/font/StrikeMetrics");
- sunFontIDs.strikeMetricsClass=(jclass)(*env)->NewGlobalRef(env, tmpClass);
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/StrikeMetrics"));
+ CHECK_NULL(sunFontIDs.strikeMetricsClass =
+ (jclass)(*env)->NewGlobalRef(env, tmpClass));
- sunFontIDs.strikeMetricsCtr =
+ CHECK_NULL(sunFontIDs.strikeMetricsCtr =
(*env)->GetMethodID(env, sunFontIDs.strikeMetricsClass,
- "<init>", "(FFFFFFFFFF)V");
+ "<init>", "(FFFFFFFFFF)V"));
- tmpClass = (*env)->FindClass(env, "java/awt/geom/Rectangle2D$Float");
+ CHECK_NULL(tmpClass =
+ (*env)->FindClass(env, "java/awt/geom/Rectangle2D$Float"));
sunFontIDs.rect2DFloatClass = (jclass)(*env)->NewGlobalRef(env, tmpClass);
- sunFontIDs.rect2DFloatCtr =
- (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass, "<init>", "()V");
- sunFontIDs.rect2DFloatCtr4 =
- (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass,
- "<init>", "(FFFF)V");
- sunFontIDs.rectF2DX =
- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "x", "F");
- sunFontIDs.rectF2DY =
- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "y", "F");
- sunFontIDs.rectF2DWidth =
- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "width", "F");
- sunFontIDs.rectF2DHeight =
- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "height", "F");
+ CHECK_NULL(sunFontIDs.rect2DFloatCtr =
+ (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass, "<init>", "()V"));
+ CHECK_NULL(sunFontIDs.rect2DFloatCtr4 =
+ (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass,
+ "<init>", "(FFFF)V"));
+ CHECK_NULL(sunFontIDs.rectF2DX =
+ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "x", "F"));
+ CHECK_NULL(sunFontIDs.rectF2DY =
+ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "y", "F"));
+ CHECK_NULL(sunFontIDs.rectF2DWidth =
+ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "width", "F"));
+ CHECK_NULL(sunFontIDs.rectF2DHeight =
+ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "height", "F"));
- tmpClass = (*env)->FindClass(env, "java/awt/geom/GeneralPath");
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "java/awt/geom/GeneralPath"));
sunFontIDs.gpClass = (jclass)(*env)->NewGlobalRef(env, tmpClass);
- sunFontIDs.gpCtr =
- (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "(I[BI[FI)V");
- sunFontIDs.gpCtrEmpty =
- (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "()V");
+ CHECK_NULL(sunFontIDs.gpCtr =
+ (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "(I[BI[FI)V"));
+ CHECK_NULL(sunFontIDs.gpCtrEmpty =
+ (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "()V"));
- tmpClass = (*env)->FindClass(env, "sun/font/Font2D");
- sunFontIDs.f2dCharToGlyphMID =
- (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I");
- sunFontIDs.getMapperMID =
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/Font2D"));
+ CHECK_NULL(sunFontIDs.f2dCharToGlyphMID =
+ (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I"));
+ CHECK_NULL(sunFontIDs.getMapperMID =
(*env)->GetMethodID(env, tmpClass, "getMapper",
- "()Lsun/font/CharToGlyphMapper;");
- sunFontIDs.getTableBytesMID =
- (*env)->GetMethodID(env, tmpClass, "getTableBytes", "(I)[B");
- sunFontIDs.canDisplayMID =
- (*env)->GetMethodID(env, tmpClass, "canDisplay", "(C)Z");
+ "()Lsun/font/CharToGlyphMapper;"));
+ CHECK_NULL(sunFontIDs.getTableBytesMID =
+ (*env)->GetMethodID(env, tmpClass, "getTableBytes", "(I)[B"));
+ CHECK_NULL(sunFontIDs.canDisplayMID =
+ (*env)->GetMethodID(env, tmpClass, "canDisplay", "(C)Z"));
- tmpClass = (*env)->FindClass(env, "sun/font/CharToGlyphMapper");
- sunFontIDs.charToGlyphMID =
- (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I");
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/CharToGlyphMapper"));
+ CHECK_NULL(sunFontIDs.charToGlyphMID =
+ (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I"));
- tmpClass = (*env)->FindClass(env, "sun/font/PhysicalStrike");
- sunFontIDs.getGlyphMetricsMID =
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/PhysicalStrike"));
+ CHECK_NULL(sunFontIDs.getGlyphMetricsMID =
(*env)->GetMethodID(env, tmpClass, "getGlyphMetrics",
- "(I)Ljava/awt/geom/Point2D$Float;");
- sunFontIDs.getGlyphPointMID =
+ "(I)Ljava/awt/geom/Point2D$Float;"));
+ CHECK_NULL(sunFontIDs.getGlyphPointMID =
(*env)->GetMethodID(env, tmpClass, "getGlyphPoint",
- "(II)Ljava/awt/geom/Point2D$Float;");
- sunFontIDs.adjustPointMID =
+ "(II)Ljava/awt/geom/Point2D$Float;"));
+ CHECK_NULL(sunFontIDs.adjustPointMID =
(*env)->GetMethodID(env, tmpClass, "adjustPoint",
- "(Ljava/awt/geom/Point2D$Float;)V");
- sunFontIDs.pScalerContextFID =
- (*env)->GetFieldID(env, tmpClass, "pScalerContext", "J");
+ "(Ljava/awt/geom/Point2D$Float;)V"));
+ CHECK_NULL(sunFontIDs.pScalerContextFID =
+ (*env)->GetFieldID(env, tmpClass, "pScalerContext", "J"));
- tmpClass = (*env)->FindClass(env, "sun/font/GlyphList");
- sunFontIDs.glyphListX = (*env)->GetFieldID(env, tmpClass, "x", "F");
- sunFontIDs.glyphListY = (*env)->GetFieldID(env, tmpClass, "y", "F");
- sunFontIDs.glyphListLen = (*env)->GetFieldID(env, tmpClass, "len", "I");
- sunFontIDs.glyphImages =
- (*env)->GetFieldID(env, tmpClass, "images", "[J");
- sunFontIDs.glyphListUsePos =
- (*env)->GetFieldID(env, tmpClass, "usePositions", "Z");
- sunFontIDs.glyphListPos =
- (*env)->GetFieldID(env, tmpClass, "positions", "[F");
- sunFontIDs.lcdRGBOrder =
- (*env)->GetFieldID(env, tmpClass, "lcdRGBOrder", "Z");
- sunFontIDs.lcdSubPixPos =
- (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z");
+ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/GlyphList"));
+ CHECK_NULL(sunFontIDs.glyphListX =
+ (*env)->GetFieldID(env, tmpClass, "x", "F"));
+ CHECK_NULL(sunFontIDs.glyphListY =
+ (*env)->GetFieldID(env, tmpClass, "y", "F"));
+ CHECK_NULL(sunFontIDs.glyphListLen =
+ (*env)->GetFieldID(env, tmpClass, "len", "I"));
+ CHECK_NULL(sunFontIDs.glyphImages =
+ (*env)->GetFieldID(env, tmpClass, "images", "[J"));
+ CHECK_NULL(sunFontIDs.glyphListUsePos =
+ (*env)->GetFieldID(env, tmpClass, "usePositions", "Z"));
+ CHECK_NULL(sunFontIDs.glyphListPos =
+ (*env)->GetFieldID(env, tmpClass, "positions", "[F"));
+ CHECK_NULL(sunFontIDs.lcdRGBOrder =
+ (*env)->GetFieldID(env, tmpClass, "lcdRGBOrder", "Z"));
+ CHECK_NULL(sunFontIDs.lcdSubPixPos =
+ (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z)"));
initLCDGammaTables();