From a7285117b4d52ba2ee8adc9f2c123ee08c48937c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 4 May 2006 17:35:05 +0000 Subject: [PATCH] re PR libgcj/26861 (VirtualMachineError in interperter.) PR libgcj/26861: * interpret.cc (run) : Removed 0xffff check. : Likewise. (NULLCHECK): Define unconditionally. * link.cc (ensure_class_linked): Removed dead code. From-SVN: r113531 --- libjava/ChangeLog | 8 ++++++++ libjava/interpret.cc | 19 +++++++++++-------- libjava/link.cc | 15 --------------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 88468d4b625..161adfca458 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2006-05-04 Tom Tromey + + PR libgcj/26861: + * interpret.cc (run) : Removed 0xffff check. + : Likewise. + (NULLCHECK): Define unconditionally. + * link.cc (ensure_class_linked): Removed dead code. + 2006-05-04 Tom Tromey * java/lang/Class.h (JV_STATE_LOADING): Added comment. diff --git a/libjava/interpret.cc b/libjava/interpret.cc index 9a2059dadfc..79121585bad 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -25,7 +25,6 @@ details. */ #include #include #include -#include #include #include #include @@ -222,12 +221,20 @@ static jint get4(unsigned char* loc) { #define SAVE_PC() frame_desc.pc = pc +// We used to define this conditionally, depending on HANDLE_SEGV. +// However, that runs into a problem if a chunk in low memory is +// mapped and we try to look at a field near the end of a large +// object. See PR 26858 for details. It is, most likely, relatively +// inexpensive to simply do this check always. +#define NULLCHECK(X) \ + do { SAVE_PC(); if ((X)==NULL) throw_null_pointer_exception (); } while (0) + +// Note that we can still conditionally define NULLARRAYCHECK, since +// we know that all uses of an array will first reference the length +// field, which is first -- and thus will trigger a SEGV. #ifdef HANDLE_SEGV -#define NULLCHECK(X) SAVE_PC() #define NULLARRAYCHECK(X) SAVE_PC() #else -#define NULLCHECK(X) \ - do { SAVE_PC(); if ((X)==NULL) throw_null_pointer_exception (); } while (0) #define NULLARRAYCHECK(X) \ do { SAVE_PC(); if ((X)==NULL) { throw_null_pointer_exception (); } } while (0) #endif @@ -2542,8 +2549,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth) jclass type = field->type; jint field_offset = field->u.boffset; - if (field_offset > 0xffff) - throw new java::lang::VirtualMachineError; jobject obj = POPA(); NULLCHECK(obj); @@ -2746,8 +2751,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth) (JvNewStringLatin1 ("field is static")); jint field_offset = field->u.boffset; - if (field_offset > 0xffff) - throw new java::lang::VirtualMachineError; void *newinsn = NULL; if (type->isPrimitive ()) diff --git a/libjava/link.cc b/libjava/link.cc index c65b0c97ff1..6c281516895 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -1629,21 +1629,6 @@ _Jv_Linker::ensure_class_linked (jclass klass) } } -#if 0 // Should be redundant now - // If superclass looks like a constant pool entry, - // resolve it now. - if ((uaddr) klass->superclass < (uaddr) pool->size) - klass->superclass = pool->data[(uaddr) klass->superclass].clazz; - - // Likewise for interfaces. - for (int i = 0; i < klass->interface_count; i++) - { - if ((uaddr) klass->interfaces[i] < (uaddr) pool->size) - klass->interfaces[i] - = pool->data[(uaddr) klass->interfaces[i]].clazz; - } -#endif - // Resolve the remaining constant pool entries. for (int index = 1; index < pool->size; ++index) { -- 2.30.2