aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2005-05-12 01:27:15 +0000
committerTom Tromey <tromey@gcc.gnu.org>2005-05-12 01:27:15 +0000
commitcca1655eabb86897dc2dfd5aa2830d07a1cc83ca (patch)
tree9f39fff82022b1ead94d585a390edb4a4f526870 /libjava/java/lang
parentcd0b240bf1f795586b644f25b70454ee89eab8b8 (diff)
downloadgcc-cca1655eabb86897dc2dfd5aa2830d07a1cc83ca.zip
gcc-cca1655eabb86897dc2dfd5aa2830d07a1cc83ca.tar.gz
gcc-cca1655eabb86897dc2dfd5aa2830d07a1cc83ca.tar.bz2
gcj.texi (Code Generation): Document -fbootstrap-classes.
gcc/java: * gcj.texi (Code Generation): Document -fbootstrap-classes. * decl.c (GCJ_BOOTSTRAP_LOADER_ADDITION): New macro. (parse_version): Use it. * lang.opt (-fbootstrap-classes): New option. libjava: * external/w3c_dom/Makefile.in: Rebuilt. * external/w3c_dom/Makefile.am (libw3c_gcj_la_GCJFLAGS): Added -fbootstrap-classes. * external/sax/Makefile.in: Rebuilt. * external/sax/Makefile.am (libsax_gcj_la_GCJFLAGS): Added -fbootstrap-classes. * java/lang/Class.h (_Jv_CopyClassesToSystemLoader): Declare as friend. * java/lang/natVMClassLoader.cc (getSystemClassLoaderInternal): Call _Jv_CopyClassesToSystemLoader. * java/lang/natClassLoader.cc (system_class_list): New global. (_Jv_RegisterClassHookDefault): Handle bootstrap and system classes differently. (_Jv_CopyClassesToSystemLoader): New function. (SYSTEM_LOADER_INITIALIZED): New define. * include/jvm.h (GCJ_BOOTSTRAP_LOADER_ADDITION): New define. (_Jv_CheckABIVersion): Use it. (_Jv_ClassForBootstrapLoader): New function. * Makefile.in: Rebuilt. * Makefile.am (AM_GCJFLAGS): Added -fbootstrap-classes. From-SVN: r99604
Diffstat (limited to 'libjava/java/lang')
-rw-r--r--libjava/java/lang/Class.h4
-rw-r--r--libjava/java/lang/natClassLoader.cc43
-rw-r--r--libjava/java/lang/natVMClassLoader.cc1
3 files changed, 45 insertions, 3 deletions
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index 8548560..28721d7 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -236,6 +236,8 @@ jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader);
jboolean _Jv_IsInterpretedClass (jclass);
+void _Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
+
#ifdef INTERPRETER
void _Jv_InitField (jobject, jclass, int);
@@ -494,6 +496,8 @@ private:
friend void *::_Jv_ResolvePoolEntry (jclass this_class, jint index);
+ friend void ::_Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *);
+
// 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.
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index ed43b7a..2fa3f49 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -52,6 +52,15 @@ details. */
static jclass loaded_classes[HASH_LEN];
+// This records classes which will be registered with the system class
+// loader when it is initialized.
+static jclass system_class_list;
+
+// This is used as the value of system_class_list after we have
+// initialized the system class loader; it lets us know that we should
+// no longer pay attention to the system abi flag.
+#define SYSTEM_LOADER_INITIALIZED ((jclass) -1)
+
// This is the root of a linked list of classes
static jclass stack_head;
@@ -165,6 +174,22 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count)
void
_Jv_RegisterClassHookDefault (jclass klass)
{
+ // This is bogus, but there doesn't seem to be a better place to do
+ // it.
+ if (! klass->engine)
+ klass->engine = &_Jv_soleCompiledEngine;
+
+ if (system_class_list != SYSTEM_LOADER_INITIALIZED)
+ {
+ unsigned long abi = (unsigned long) klass->next_or_version;
+ if (! _Jv_ClassForBootstrapLoader (abi))
+ {
+ klass->next_or_version = system_class_list;
+ system_class_list = klass;
+ return;
+ }
+ }
+
jint hash = HASH_UTF (klass->name);
// If the class is already registered, don't re-register it.
@@ -193,9 +218,6 @@ _Jv_RegisterClassHookDefault (jclass klass)
}
}
- // FIXME: this is really bogus!
- if (! klass->engine)
- klass->engine = &_Jv_soleCompiledEngine;
klass->next_or_version = loaded_classes[hash];
loaded_classes[hash] = klass;
}
@@ -216,6 +238,21 @@ _Jv_RegisterClass (jclass klass)
_Jv_RegisterClasses (classes);
}
+// This is used during initialization to register all compiled-in
+// classes that are not part of the core with the system class loader.
+void
+_Jv_CopyClassesToSystemLoader (java::lang::ClassLoader *loader)
+{
+ for (jclass klass = system_class_list;
+ klass;
+ klass = klass->next_or_version)
+ {
+ klass->loader = loader;
+ loader->loadedClasses->put(klass->name->toString(), klass);
+ }
+ system_class_list = SYSTEM_LOADER_INITIALIZED;
+}
+
jclass
_Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader)
{
diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc
index a94bf98..2e7b90d 100644
--- a/libjava/java/lang/natVMClassLoader.cc
+++ b/libjava/java/lang/natVMClassLoader.cc
@@ -99,6 +99,7 @@ java::lang::ClassLoader *
java::lang::VMClassLoader::getSystemClassLoaderInternal()
{
_Jv_InitClass (&gnu::gcj::runtime::ExtensionClassLoader::class$);
+ _Jv_CopyClassesToSystemLoader (gnu::gcj::runtime::ExtensionClassLoader::system_instance);
return gnu::gcj::runtime::ExtensionClassLoader::system_instance;
}