Exceptions in JNI
Archie Cobbs
kaffe@rufus.w3.org
Sun, 19 Jul 1998 11:30:08 -0700 (PDT)
Stephen Crowley writes:
> Are exceptions broken in the JNI or what? When trying to call a method
> that uses StringTokenizer.tokenCount() it ALWAYS throws a
> StringIndexOutOfBoundsException. I looked at the source to
> StringTokenizer and it should catch the exception but it doesn't.
> Running Kaffe 1.0 on linux
Try the patch below, it fixes a JNI bug whereby accessing the very
last element of an array incorrectly causes an IndexOutOfBoundsException.
-Archie
___________________________________________________________________________
Archie Cobbs * Whistle Communications, Inc. * http://www.whistle.com
Index: jni.c
===================================================================
RCS file: /cvs/mod/net/kaffe/kaffe/kaffevm/jni.c,v
retrieving revision 1.1.1.2
retrieving revision 1.1.1.2.2.1
diff -c -u -r1.1.1.2 -r1.1.1.2.2.1
--- jni.c 1998/07/14 16:48:50 1.1.1.2
+++ jni.c 1998/07/16 18:13:01 1.1.1.2.2.1
@@ -3116,7 +3116,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfBoolean*)arr) || start + len >= obj_length((HArrayOfBoolean*)arr)) {
+ if (start >= obj_length((HArrayOfBoolean*)arr) || start + len > obj_length((HArrayOfBoolean*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfBoolean*)arr)->body[start], len * sizeof(jboolean));
@@ -3129,7 +3129,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfByte*)arr) || start + len >= obj_length((HArrayOfByte*)arr)) {
+ if (start >= obj_length((HArrayOfByte*)arr) || start + len > obj_length((HArrayOfByte*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfByte*)arr)->body[start], len * sizeof(jbyte));
@@ -3142,7 +3142,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfChar*)arr) || start + len >= obj_length((HArrayOfChar*)arr)) {
+ if (start >= obj_length((HArrayOfChar*)arr) || start + len > obj_length((HArrayOfChar*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfChar*)arr)->body[start], len * sizeof(jchar));
@@ -3155,7 +3155,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfShort*)arr) || start + len >= obj_length((HArrayOfShort*)arr)) {
+ if (start >= obj_length((HArrayOfShort*)arr) || start + len > obj_length((HArrayOfShort*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfShort*)arr)->body[start], len * sizeof(jshort));
@@ -3168,7 +3168,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfInt*)arr) || start + len >= obj_length((HArrayOfInt*)arr)) {
+ if (start >= obj_length((HArrayOfInt*)arr) || start + len > obj_length((HArrayOfInt*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfInt*)arr)->body[start], len * sizeof(jint));
@@ -3181,7 +3181,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfLong*)arr) || start + len >= obj_length((HArrayOfLong*)arr)) {
+ if (start >= obj_length((HArrayOfLong*)arr) || start + len > obj_length((HArrayOfLong*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfLong*)arr)->body[start], len * sizeof(jlong));
@@ -3194,7 +3194,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfFloat*)arr) || start + len >= obj_length((HArrayOfFloat*)arr)) {
+ if (start >= obj_length((HArrayOfFloat*)arr) || start + len > obj_length((HArrayOfFloat*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfFloat*)arr)->body[start], len * sizeof(jfloat));
@@ -3207,7 +3207,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfDouble*)arr) || start + len >= obj_length((HArrayOfDouble*)arr)) {
+ if (start >= obj_length((HArrayOfDouble*)arr) || start + len > obj_length((HArrayOfDouble*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(data, &unhand((HArrayOfDouble*)arr)->body[start], len * sizeof(jdouble));
@@ -3220,7 +3220,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfBoolean*)arr) || start+len >= obj_length((HArrayOfBoolean*)arr)) {
+ if (start >= obj_length((HArrayOfBoolean*)arr) || start+len > obj_length((HArrayOfBoolean*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfBoolean*)arr)->body[start], data, len * sizeof(jboolean));
@@ -3233,7 +3233,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfByte*)arr) || start+len >= obj_length((HArrayOfByte*)arr)) {
+ if (start >= obj_length((HArrayOfByte*)arr) || start+len > obj_length((HArrayOfByte*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfByte*)arr)->body[start], data, len * sizeof(jbyte));
@@ -3246,7 +3246,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfChar*)arr) || start+len >= obj_length((HArrayOfChar*)arr)) {
+ if (start >= obj_length((HArrayOfChar*)arr) || start+len > obj_length((HArrayOfChar*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfChar*)arr)->body[start], data, len * sizeof(jchar));
@@ -3259,7 +3259,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfShort*)arr) || start+len >= obj_length((HArrayOfShort*)arr)) {
+ if (start >= obj_length((HArrayOfShort*)arr) || start+len > obj_length((HArrayOfShort*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfShort*)arr)->body[start], data, len * sizeof(jshort));
@@ -3272,7 +3272,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfInt*)arr) || start+len >= obj_length((HArrayOfInt*)arr)) {
+ if (start >= obj_length((HArrayOfInt*)arr) || start+len > obj_length((HArrayOfInt*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfInt*)arr)->body[start], data, len * sizeof(jint));
@@ -3285,7 +3285,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfLong*)arr) || start+len >= obj_length((HArrayOfLong*)arr)) {
+ if (start >= obj_length((HArrayOfLong*)arr) || start+len > obj_length((HArrayOfLong*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfLong*)arr)->body[start], data, len * sizeof(jlong));
@@ -3298,7 +3298,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfFloat*)arr) || start+len >= obj_length((HArrayOfFloat*)arr)) {
+ if (start >= obj_length((HArrayOfFloat*)arr) || start+len > obj_length((HArrayOfFloat*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfFloat*)arr)->body[start], data, len * sizeof(jfloat));
@@ -3311,7 +3311,7 @@
{
BEGIN_EXCEPTION_HANDLING_VOID();
- if (start >= obj_length((HArrayOfDouble*)arr) || start+len >= obj_length((HArrayOfDouble*)arr)) {
+ if (start >= obj_length((HArrayOfDouble*)arr) || start+len > obj_length((HArrayOfDouble*)arr)) {
throwException(ArrayIndexOutOfBoundsException);
}
memcpy(&unhand((HArrayOfDouble*)arr)->body[start], data, len * sizeof(jdouble));