--- ChangeLog.orig Thu Jan 10 13:25:15 2002 +++ ChangeLog Thu Jan 10 13:39:30 2002 @@ -1,3 +1,7 @@ +2002-01-10 Chris Sears + + * interpret.cc SAVE_PC bug fix and improvements, ARRAYBOUNDSCHECK macro + 2001-12-20 Release Manager * GCC 3.0.3 Released. --- interpret.cc.orig Mon Jan 7 17:28:54 2002 +++ interpret.cc Thu Jan 10 13:13:33 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, @@ -291,10 +301,12 @@ return ex; } +#define SAVE_PC inv->pc = pc + bool _Jv_InterpMethod::find_exception (jobject ex, _Jv_InterpMethodInvocation *inv) { - int logical_pc = inv->pc - bytecode (); + int logical_pc = inv->pc - 1 - bytecode (); _Jv_InterpException *exc = exceptions (); jclass exc_class = ex->getClass (); @@ -615,8 +627,6 @@ INSN_LABEL(jsr_w), }; -#define SAVE_PC inv->pc = pc-1 - /* If the macro INLINE_SWITCH is not defined, then the main loop operates as one big (normal) switch statement. If it is defined, then the case selection is performed `inline' in the end of the @@ -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; @@ -1398,7 +1344,6 @@ NEXT_INSN; insn_fdiv: - SAVE_PC; { jfloat value2 = POPF(); jfloat value1 = POPF(); @@ -1408,7 +1353,6 @@ NEXT_INSN; insn_ddiv: - SAVE_PC; { jdouble value2 = POPD(); jdouble value1 = POPD(); @@ -1438,7 +1382,6 @@ NEXT_INSN; insn_frem: - SAVE_PC; { jfloat value2 = POPF(); jfloat value1 = POPF(); @@ -1448,7 +1391,6 @@ NEXT_INSN; insn_drem: - SAVE_PC; { jdouble value2 = POPD(); jdouble value1 = POPD(); @@ -2226,9 +2168,9 @@ NEXT_INSN; insn_arraylength: - SAVE_PC; { __JArray *arr = (__JArray*)POPA(); + NULLARRAYCHECK (arr); PUSHI (arr->length); } NEXT_INSN;