]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
javaprims.h (_Jv_RegisterClassHook): New extern declaration.
authorPer Bothner <per@bothner.com>
Sat, 1 Sep 2001 01:26:14 +0000 (18:26 -0700)
committerPer Bothner <bothner@gcc.gnu.org>
Sat, 1 Sep 2001 01:26:14 +0000 (18:26 -0700)
* gcj/javaprims.h (_Jv_RegisterClassHook):  New extern declaration.
(_Jv_RegisterClassHookDefault):  Likewise.
* java/lang/Class.h (_Jv_RegisterClassHookDefault):  Declare as friend.
* java/lang/natClassLoader.cc (_Jv_RegisterClassHook):  New variable.
(_Jv_RegisterClassHookDefault):  New.function.
(_Jv_RegisterClasses):  Call _Jv_RegisterClassHook.

From-SVN: r45344

libjava/ChangeLog
libjava/gcj/javaprims.h
libjava/java/lang/Class.h
libjava/java/lang/natClassLoader.cc

index 5170b9a1c832bc0026cdd0d9f4fa0fac882a1c95..250258ab106bd4bacb6182b481ab28910e015e53 100644 (file)
@@ -1,5 +1,12 @@
 2001-08-31  Per Bothner  <per@bothner.com>
 
+       * gcj/javaprims.h (_Jv_RegisterClassHook):  New extern declaration.
+       (_Jv_RegisterClassHookDefault):  Likewise.
+       * java/lang/Class.h (_Jv_RegisterClassHookDefault):  Declare as friend.
+       * java/lang/natClassLoader.cc (_Jv_RegisterClassHook):  New variable.
+       (_Jv_RegisterClassHookDefault):  New.function.
+       (_Jv_RegisterClasses):  Call _Jv_RegisterClassHook.
+
        * java/lang/ClassLoader.java (system):  Remove static field.
        (getSystemClassLoader):  Get gnu.gcj.runtime.VMClassLoader.instance
        directly instead of using it to set the system field.
index 5fb00c8081ccdd84a92e7362c288352ffa9c5a84..d48ae17297614ba98d659da68ff8c498376551e0 100644 (file)
@@ -411,6 +411,8 @@ extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__));
 extern "C" void* _Jv_Malloc (jsize) __attribute__((__malloc__));
 extern "C" void* _Jv_Realloc (void *, jsize);
 extern "C" void _Jv_Free (void*);
+extern void (*_Jv_RegisterClassHook) (jclass cl);
+extern "C" void _Jv_RegisterClassHookDefault (jclass);
 
 typedef unsigned short _Jv_ushort __attribute__((__mode__(__HI__)));
 typedef unsigned int _Jv_uint __attribute__((__mode__(__SI__)));
index dfef0a6afbe29350b1d4be9025ac8281f38b1263..9d106c5abd3bd12294b608f42783c70556613b23 100644 (file)
@@ -298,6 +298,7 @@ private:
 
   friend void _Jv_WaitForState (jclass, int);
   friend void _Jv_RegisterClasses (jclass *classes);
+  friend void _Jv_RegisterClassHookDefault (jclass klass);
   friend void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*);
   friend void _Jv_UnregisterClass (jclass);
   friend jclass _Jv_FindClass (_Jv_Utf8Const *name,
index f0794c74111723997e990af45698e7e845770c4c..890a4a7d879f7648c7e35af45a59ef76dbd56daa 100644 (file)
@@ -439,9 +439,8 @@ _Jv_RegisterClasses (jclass *classes)
   for (; *classes; ++classes)
     {
       jclass klass = *classes;
-      jint hash = HASH_UTF (klass->name);
-      klass->next = loaded_classes[hash];
-      loaded_classes[hash] = klass;
+
+      (*_Jv_RegisterClassHook) (klass);
 
       // registering a compiled class causes
       // it to be immediately "prepared".  
@@ -450,6 +449,21 @@ _Jv_RegisterClasses (jclass *classes)
     }
 }
 
+void
+_Jv_RegisterClassHookDefault (jclass klass)
+{
+  jint hash = HASH_UTF (klass->name);
+  klass->next = loaded_classes[hash];
+  loaded_classes[hash] = klass;
+}
+
+// A pointer to a function that actually registers a class.
+// Normally _Jv_RegisterClassHookDefault, but could be some other function
+// that registers the class in e.g. a ClassLoader-local table.
+// Should synchronize on Class:class$ while setting/restore this variable.
+
+void (*_Jv_RegisterClassHook) (jclass cl) = _Jv_RegisterClassHookDefault;
+
 void
 _Jv_RegisterClass (jclass klass)
 {