]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Class.h (next): Updated documentation.
authorTom Tromey <tromey@redhat.com>
Mon, 24 Jan 2005 19:05:34 +0000 (19:05 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 24 Jan 2005 19:05:34 +0000 (19:05 +0000)
* java/lang/Class.h (next): Updated documentation.  Renamed to
'next_or_version'.
* java/lang/natClassLoader.cc (_Jv_RegisterClasses): Use
_Jv_CheckABIVersion.
(_Jv_RegisterClasses_Counted): Likewise.
(_Jv_RegisterClassHookDefault): Fix starting condition of
duplicate-checking loop.
* include/jvm.h (GCJ_VERSION): New define.
(GCJ_BINARYCOMPAT_ADDITION): Likewise.
(_Jv_CheckABIVersion): New function.

From-SVN: r94173

libjava/ChangeLog
libjava/include/jvm.h
libjava/java/lang/Class.h
libjava/java/lang/natClassLoader.cc

index 1638e58232e156200dcb0f97e841c063ccf23a01..8bc63074903ee682c4e916909227941444d0345d 100644 (file)
@@ -1,3 +1,16 @@
+2005-01-24  Tom Tromey  <tromey@redhat.com>
+
+       * java/lang/Class.h (next): Updated documentation.  Renamed to
+       'next_or_version'.
+       * java/lang/natClassLoader.cc (_Jv_RegisterClasses): Use
+       _Jv_CheckABIVersion.
+       (_Jv_RegisterClasses_Counted): Likewise.
+       (_Jv_RegisterClassHookDefault): Fix starting condition of
+       duplicate-checking loop.
+       * include/jvm.h (GCJ_VERSION): New define.
+       (GCJ_BINARYCOMPAT_ADDITION): Likewise.
+       (_Jv_CheckABIVersion): New function.
+
 2005-01-24  Jakub Jelinek  <jakub@redhat.com>
 
        * Makefile.am (libgij_la_LIBADD): Add -L$(here)/.libs.
index 67a4b18176e81c9f80b676718a9b733437572d54..cf4d7d640d095092b125075cf744814acf2d518c 100644 (file)
@@ -566,4 +566,19 @@ extern void (*_Jv_JVMPI_Notify_THREAD_END) (JVMPI_Event *event);
 
 extern void _Jv_RegisterBootstrapPackages ();
 
+
+// This is used to find ABI versions we recognize.
+#define GCJ_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 10)
+#define GCJ_BINARYCOMPAT_ADDITION 5
+
+inline bool
+_Jv_CheckABIVersion (unsigned long value)
+{
+  // For this release, recognize just our defined C++ ABI and our
+  // defined BC ABI.  (In the future we may recognize past BC ABIs as
+  // well.)
+  return (value == GCJ_VERSION
+         || value == (GCJ_VERSION + GCJ_BINARYCOMPAT_ADDITION));
+}
+
 #endif /* __JAVA_JVM_H__ */
index cea1c13a8e2edbe42ff562517be74fb9bdb6a2cb..4e061cee5742e1557f8cf7095a99802d9c8661b8 100644 (file)
@@ -488,8 +488,10 @@ private:
 
   friend void ::_Jv_sharedlib_register_hook (jclass klass);
 
-  // Chain for class pool.
-  jclass next;
+  // Chain for class pool.  This also doubles as the ABI version
+  // number.  It is only used for this purpose at class registration
+  // time, and only for precompiled classes.
+  jclass next_or_version;
   // Name of class.
   _Jv_Utf8Const *name;
   // Access flags for class.
index b05c1dd0a5bb9fe40b8d33d79e814d8d22e61185..15fb9eb415c754e878e887f81702f0d6dfb32341 100644 (file)
@@ -75,7 +75,7 @@ _Jv_FindClassInCache (_Jv_Utf8Const *name)
   jint hash = HASH_UTF (name);
 
   jclass klass;
-  for (klass = loaded_classes[hash]; klass; klass = klass->next)
+  for (klass = loaded_classes[hash]; klass; klass = klass->next_or_version)
     {
       if (_Jv_equalUtf8Consts (name, klass->name))
        break;
@@ -91,11 +91,11 @@ _Jv_UnregisterClass (jclass the_class)
   jint hash = HASH_UTF(the_class->name);
 
   jclass *klass = &(loaded_classes[hash]);
-  for ( ; *klass; klass = &((*klass)->next))
+  for ( ; *klass; klass = &((*klass)->next_or_version))
     {
       if (*klass == the_class)
        {
-         *klass = (*klass)->next;
+         *klass = (*klass)->next_or_version;
          break;
        }
     }
@@ -122,7 +122,8 @@ _Jv_RegisterClasses (const jclass *classes)
     {
       jclass klass = *classes;
 
-      (*_Jv_RegisterClassHook) (klass);
+      if (_Jv_CheckABIVersion ((unsigned long) klass->next_or_version))
+       (*_Jv_RegisterClassHook) (klass);
     }
 }
 
@@ -135,7 +136,8 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count)
     {
       jclass klass = classes[i];
 
-      (*_Jv_RegisterClassHook) (klass);
+      if (_Jv_CheckABIVersion ((unsigned long) klass->next_or_version))
+       (*_Jv_RegisterClassHook) (klass);
     }
 }
 
@@ -144,12 +146,10 @@ _Jv_RegisterClassHookDefault (jclass klass)
 {
   jint hash = HASH_UTF (klass->name);
 
-  // The BC ABI makes this check unnecessary: we always resolve all
-  // data references via the appropriate class loader, so the kludge
-  // that required this check has gone.
   // If the class is already registered, don't re-register it.
-  jclass check_class = klass->next;
-  while (check_class != NULL)
+  for (jclass check_class = loaded_classes[hash];
+       check_class != NULL;
+       check_class = check_class->next_or_version)
     {
       if (check_class == klass)
        {
@@ -170,14 +170,12 @@ _Jv_RegisterClassHookDefault (jclass klass)
              throw new java::lang::VirtualMachineError (str);
            }
        }
-
-      check_class = check_class->next;
     }
 
   // FIXME: this is really bogus!
   if (! klass->engine)
     klass->engine = &_Jv_soleCompiledEngine;
-  klass->next = loaded_classes[hash];
+  klass->next_or_version = loaded_classes[hash];
   loaded_classes[hash] = klass;
 }