OSDN Git Service

PR libgcj/26861:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 17:35:05 +0000 (17:35 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 17:35:05 +0000 (17:35 +0000)
* interpret.cc (run) <insn_getfield>: Removed 0xffff check.
<insn_putfield>: Likewise.
(NULLCHECK): Define unconditionally.
* link.cc (ensure_class_linked): Removed dead code.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113531 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/interpret.cc
libjava/link.cc

index 88468d4..161adfc 100644 (file)
@@ -1,5 +1,13 @@
 2006-05-04  Tom Tromey  <tromey@redhat.com>
 
+       PR libgcj/26861:
+       * interpret.cc (run) <insn_getfield>: Removed 0xffff check.
+       <insn_putfield>: Likewise.
+       (NULLCHECK): Define unconditionally.
+       * link.cc (ensure_class_linked): Removed dead code.
+
+2006-05-04  Tom Tromey  <tromey@redhat.com>
+
        * java/lang/Class.h (JV_STATE_LOADING): Added comment.
        * Makefile.in: Rebuilt.
        * Makefile.am (nat_source_files): Added natSystemClassLoader.cc.
index 9a2059d..7912158 100644 (file)
@@ -25,7 +25,6 @@ details.  */
 #include <java/lang/StringBuffer.h>
 #include <java/lang/Class.h>
 #include <java/lang/reflect/Modifier.h>
-#include <java/lang/VirtualMachineError.h>
 #include <java/lang/InternalError.h>
 #include <java/lang/NullPointerException.h>
 #include <java/lang/ArithmeticException.h>
@@ -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 ())
index c65b0c9..6c28151 100644 (file)
@@ -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)
        {