Merge branch 'wip' of oss.readytalk.com:/var/local/git/avian into wip

This commit is contained in:
jet 2009-12-28 11:14:26 -07:00
commit 8c8020811a
5 changed files with 42 additions and 14 deletions

View File

@ -33,6 +33,9 @@ public class SystemClassLoader extends ClassLoader {
private native boolean resourceExists(String name); private native boolean resourceExists(String name);
private static native Class resolveClass(ClassLoader loader, byte[] spec)
throws ClassNotFoundException;
protected URL findResource(String name) { protected URL findResource(String name) {
if (resourceExists(name)) { if (resourceExists(name)) {
try { try {
@ -45,11 +48,18 @@ public class SystemClassLoader extends ClassLoader {
private static Class loadClass(ClassLoader loader, private static Class loadClass(ClassLoader loader,
byte[] nameBytes, int offset, int length) byte[] nameBytes, int offset, int length)
{ {
String name = new String(nameBytes, offset, length, false); byte[] spec = new byte[length + 1];
System.arraycopy(nameBytes, offset, spec, 0, length);
try { try {
return loader.loadClass(name); Class c = resolveClass(loader, spec);
if (c == null) {
throw new NoClassDefFoundError();
}
return c;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
NoClassDefFoundError error = new NoClassDefFoundError(name); NoClassDefFoundError error = new NoClassDefFoundError
(new String(nameBytes, offset, length, false));
error.initCause(e); error.initCause(e);
throw error; throw error;
} }
@ -158,7 +168,7 @@ public class SystemClassLoader extends ClassLoader {
private static void parseAnnotationTable(ClassLoader loader, private static void parseAnnotationTable(ClassLoader loader,
Addendum addendum) Addendum addendum)
{ {
if (addendum != null && addendum.annotationTable != null) { if (addendum != null && addendum.annotationTable instanceof byte[]) {
try { try {
addendum.annotationTable = parseAnnotationTable addendum.annotationTable = parseAnnotationTable
(loader, addendum.pool, new ByteArrayInputStream (loader, addendum.pool, new ByteArrayInputStream

View File

@ -231,6 +231,16 @@ Avian_avian_SystemClassLoader_findClass
return search(t, name, resolveSystemClass, true); return search(t, name, resolveSystemClass, true);
} }
extern "C" JNIEXPORT int64_t JNICALL
Avian_avian_SystemClassLoader_resolveClass
(Thread* t, object, uintptr_t* arguments)
{
object loader = reinterpret_cast<object>(arguments[0]);
object spec = reinterpret_cast<object>(arguments[1]);
return reinterpret_cast<int64_t>(resolveClass(t, loader, spec));
}
extern "C" JNIEXPORT int64_t JNICALL extern "C" JNIEXPORT int64_t JNICALL
Avian_avian_SystemClassLoader_resourceExists Avian_avian_SystemClassLoader_resourceExists
(Thread* t, object, uintptr_t* arguments) (Thread* t, object, uintptr_t* arguments)

View File

@ -5327,7 +5327,7 @@ resolveTargetSites(Context* c, Event* e, SiteRecordList* frozen, Site** sites)
c->arch->generalRegisterMask(), AnyFrameIndex); c->arch->generalRegisterMask(), AnyFrameIndex);
Site* s = pickSourceSite Site* s = pickSourceSite
(c, r, 0, 0, &mask, true, true, true, acceptForResolve); (c, r, 0, 0, &mask, false, true, true, acceptForResolve);
if (s == 0) { if (s == 0) {
s = maybeMove(c, v, mask, false, true, ResolveRegisterReserveCount); s = maybeMove(c, v, mask, false, true, ResolveRegisterReserveCount);

View File

@ -416,12 +416,16 @@ Avian_java_lang_VMClassLoader_loadClass
{ {
uintptr_t args[] = { 0, arguments[0] }; uintptr_t args[] = { 0, arguments[0] };
// object name = reinterpret_cast<object>(arguments[0]); // object name = reinterpret_cast<object>(arguments[0]);
// char n[stringLength(t, name) + 1]; // char n[stringLength(t, name) + 1];
// stringChars(t, name, n); // stringChars(t, name, n);
// fprintf(stderr, "load bootstrap class %s in %p\n", n, t->m->loader); // fprintf(stderr, "load bootstrap class %s in %p\n", n, t->m->loader);
return Avian_avian_SystemClassLoader_findClass(t, 0, args); int64_t result = Avian_avian_SystemClassLoader_findClass(t, 0, args);
// fprintf(stderr, "result %p\n", reinterpret_cast<void*>(result));
return result;
} }
extern "C" JNIEXPORT void JNICALL extern "C" JNIEXPORT void JNICALL

View File

@ -1910,6 +1910,10 @@ boot(Thread* t)
(t, m->types, Machine::SystemClassLoaderType); (t, m->types, Machine::SystemClassLoaderType);
set(t, m->loader, 0, loaderClass); set(t, m->loader, 0, loaderClass);
#ifdef AVIAN_GNU
classLoaderInitialized(t, m->loader) = true;
#endif
object objectClass = arrayBody(t, m->types, Machine::JobjectType); object objectClass = arrayBody(t, m->types, Machine::JobjectType);
object classClass = arrayBody(t, m->types, Machine::ClassType); object classClass = arrayBody(t, m->types, Machine::ClassType);
@ -3355,13 +3359,13 @@ findInHierarchy(Thread* t, object class_, object name, object spec,
} }
if (o == 0) { if (o == 0) {
if (find == findFieldInClass) {
o = findInInterfaces(t, originalClass, name, spec, find);
}
for (; o == 0 and class_; class_ = classSuper(t, class_)) { for (; o == 0 and class_; class_ = classSuper(t, class_)) {
o = find(t, class_, name, spec); o = find(t, class_, name, spec);
} }
if (o == 0 and find == findFieldInClass) {
o = findInInterfaces(t, originalClass, name, spec, find);
}
} }
if (o == 0) { if (o == 0) {