--- interpret.cc.orig Mon Jan 7 17:28:54 2002 +++ interpret.cc Tue Jan 8 12:04:38 2002 @@ -182,11 +182,21 @@ #ifdef HANDLE_SEGV #define NULLCHECK(X) +#define NULLARRAYCHECK(X) do { SAVE_PC; } while (0) #else #define NULLCHECK(X) \ do { if ((X)==NULL) throw_null_pointer_exception (); } while (0) +#define NULLARRAYCHECK(X) \ + do { if ((X)==NULL) { SAVE_PC; throw_null_pointer_exception (); } } while (0) #endif +// clever bounds checking idea from the PowerPC Compiler Writer's Guide, p. 144 +#define ARRAYBOUNDSCHECK(array, index) \ + do { if (((unsigned) index) >= (unsigned) (array->length)) \ + { \ + SAVE_PC; \ + _Jv_ThrowBadArrayIndex (index); \ + } } while (0) // this method starts the actual running of the method. It is inlined // in three different variants in the static methods run_normal, @@ -953,113 +963,81 @@ NEXT_INSN; insn_iaload: - SAVE_PC; { jint index = POPI(); jintArray arr = (jintArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_laload: - SAVE_PC; { jint index = POPI(); jlongArray arr = (jlongArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHL( elements(arr)[index] ); } NEXT_INSN; insn_faload: - SAVE_PC; { jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHF( elements(arr)[index] ); } NEXT_INSN; insn_daload: - SAVE_PC; { jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHD( elements(arr)[index] ); } NEXT_INSN; insn_aaload: - SAVE_PC; { jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHA( elements(arr)[index] ); } NEXT_INSN; insn_baload: - SAVE_PC; { jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_caload: - SAVE_PC; { jint index = POPI(); jcharArray arr = (jcharArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_saload: - SAVE_PC; { jint index = POPI(); jshortArray arr = (jshortArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; @@ -1165,122 +1143,90 @@ NEXT_INSN; insn_iastore: - SAVE_PC; { jint value = POPI(); jint index = POPI(); jintArray arr = (jintArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_lastore: - SAVE_PC; { jlong value = POPL(); jint index = POPI(); jlongArray arr = (jlongArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_fastore: - SAVE_PC; { jfloat value = POPF(); jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_dastore: - SAVE_PC; { jdouble value = POPD(); jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_aastore: - SAVE_PC; { jobject value = POPA(); jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); _Jv_CheckArrayStore (arr, value); elements(arr)[index] = value; } NEXT_INSN; insn_bastore: - SAVE_PC; { jbyte value = (jbyte) POPI(); jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_castore: - SAVE_PC; { jchar value = (jchar) POPI(); jint index = POPI(); jcharArray arr = (jcharArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_sastore: - SAVE_PC; { jshort value = (jshort) POPI(); jint index = POPI(); jshortArray arr = (jshortArray) POPA(); - NULLCHECK (arr); - if (index < 0 || index >= arr->length) - { - _Jv_ThrowBadArrayIndex (index); - } + NULLARRAYCHECK (arr); + ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; @@ -2226,9 +2172,9 @@ NEXT_INSN; insn_arraylength: - SAVE_PC; { __JArray *arr = (__JArray*)POPA(); + NULLARRAYCHECK (arr); PUSHI (arr->length); } NEXT_INSN;