Commit 8bf04387 by Tom Tromey Committed by Tom Tromey

Class.h (next): Updated documentation.

	* 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
parent 635b0f2a
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> 2005-01-24 Jakub Jelinek <jakub@redhat.com>
* Makefile.am (libgij_la_LIBADD): Add -L$(here)/.libs. * Makefile.am (libgij_la_LIBADD): Add -L$(here)/.libs.
......
...@@ -566,4 +566,19 @@ extern void (*_Jv_JVMPI_Notify_THREAD_END) (JVMPI_Event *event); ...@@ -566,4 +566,19 @@ extern void (*_Jv_JVMPI_Notify_THREAD_END) (JVMPI_Event *event);
extern void _Jv_RegisterBootstrapPackages (); 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__ */ #endif /* __JAVA_JVM_H__ */
...@@ -488,8 +488,10 @@ private: ...@@ -488,8 +488,10 @@ private:
friend void ::_Jv_sharedlib_register_hook (jclass klass); friend void ::_Jv_sharedlib_register_hook (jclass klass);
// Chain for class pool. // Chain for class pool. This also doubles as the ABI version
jclass next; // number. It is only used for this purpose at class registration
// time, and only for precompiled classes.
jclass next_or_version;
// Name of class. // Name of class.
_Jv_Utf8Const *name; _Jv_Utf8Const *name;
// Access flags for class. // Access flags for class.
......
...@@ -75,7 +75,7 @@ _Jv_FindClassInCache (_Jv_Utf8Const *name) ...@@ -75,7 +75,7 @@ _Jv_FindClassInCache (_Jv_Utf8Const *name)
jint hash = HASH_UTF (name); jint hash = HASH_UTF (name);
jclass klass; 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)) if (_Jv_equalUtf8Consts (name, klass->name))
break; break;
...@@ -91,11 +91,11 @@ _Jv_UnregisterClass (jclass the_class) ...@@ -91,11 +91,11 @@ _Jv_UnregisterClass (jclass the_class)
jint hash = HASH_UTF(the_class->name); jint hash = HASH_UTF(the_class->name);
jclass *klass = &(loaded_classes[hash]); jclass *klass = &(loaded_classes[hash]);
for ( ; *klass; klass = &((*klass)->next)) for ( ; *klass; klass = &((*klass)->next_or_version))
{ {
if (*klass == the_class) if (*klass == the_class)
{ {
*klass = (*klass)->next; *klass = (*klass)->next_or_version;
break; break;
} }
} }
...@@ -122,6 +122,7 @@ _Jv_RegisterClasses (const jclass *classes) ...@@ -122,6 +122,7 @@ _Jv_RegisterClasses (const jclass *classes)
{ {
jclass klass = *classes; jclass klass = *classes;
if (_Jv_CheckABIVersion ((unsigned long) klass->next_or_version))
(*_Jv_RegisterClassHook) (klass); (*_Jv_RegisterClassHook) (klass);
} }
} }
...@@ -135,6 +136,7 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count) ...@@ -135,6 +136,7 @@ _Jv_RegisterClasses_Counted (const jclass * classes, size_t count)
{ {
jclass klass = classes[i]; jclass klass = classes[i];
if (_Jv_CheckABIVersion ((unsigned long) klass->next_or_version))
(*_Jv_RegisterClassHook) (klass); (*_Jv_RegisterClassHook) (klass);
} }
} }
...@@ -144,12 +146,10 @@ _Jv_RegisterClassHookDefault (jclass klass) ...@@ -144,12 +146,10 @@ _Jv_RegisterClassHookDefault (jclass klass)
{ {
jint hash = HASH_UTF (klass->name); 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. // If the class is already registered, don't re-register it.
jclass check_class = klass->next; for (jclass check_class = loaded_classes[hash];
while (check_class != NULL) check_class != NULL;
check_class = check_class->next_or_version)
{ {
if (check_class == klass) if (check_class == klass)
{ {
...@@ -170,14 +170,12 @@ _Jv_RegisterClassHookDefault (jclass klass) ...@@ -170,14 +170,12 @@ _Jv_RegisterClassHookDefault (jclass klass)
throw new java::lang::VirtualMachineError (str); throw new java::lang::VirtualMachineError (str);
} }
} }
check_class = check_class->next;
} }
// FIXME: this is really bogus! // FIXME: this is really bogus!
if (! klass->engine) if (! klass->engine)
klass->engine = &_Jv_soleCompiledEngine; klass->engine = &_Jv_soleCompiledEngine;
klass->next = loaded_classes[hash]; klass->next_or_version = loaded_classes[hash];
loaded_classes[hash] = klass; loaded_classes[hash] = klass;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment