diff --git a/enhanced/classlib/trunk/modules/jndi/org/apache/harmony/jndi/tests/javax/naming/spi/jndiprovider.properties b/enhanced/classlib/trunk/modules/jndi/org/apache/harmony/jndi/tests/javax/naming/spi/jndiprovider.properties diff --git a/enhanced/classlib/trunk/modules/jndi/org/apache/harmony/jndi/tests/javax/naming/spi/mock/jndiprovider.properties b/enhanced/classlib/trunk/modules/jndi/org/apache/harmony/jndi/tests/javax/naming/spi/mock/jndiprovider.properties diff --git a/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h b/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h index 9c98e91..55315d9 100644 --- a/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h +++ b/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h @@ -170,6 +170,8 @@ public: Class* LookupClass(const String* name) { LMAutoUnlock aulock(&m_lock); Class** klass = m_loadedClasses->Lookup(name); + if(klass == NULL) + klass = m_initiatedClasses->Lookup(name); return klass?*klass:NULL; } void InsertClass(Class* clss) { diff --git a/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp b/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp index cde7c72..b5d6167 100644 --- a/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp +++ b/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp @@ -1671,7 +1671,7 @@ Class* BootstrapClassLoader::LoadFromFil { // the symptom of circularity (illegal) is that a null class name is passed, // so detect this immediately - if( !class_name->bytes || *(class_name->bytes) == 0 ) { + if(!class_name->bytes) { REPORT_FAILED_CLASS_NAME(this, class_name->bytes, "java/lang/ClassCircularityError", class_name->bytes); return NULL; diff --git a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java index c663688..e24de26 100644 --- a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java +++ b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java @@ -193,14 +193,23 @@ public final class Class implements S throw new ClassNotFoundException(name); } + if(name.indexOf("/") != -1) { + throw new ClassNotFoundException(name); + } + if (classLoader == null) { SecurityManager sc = System.getSecurityManager(); if (sc != null && VMClassRegistry.getClassLoader(VMStack.getCallerClass(0)) != null) { sc.checkPermission(RuntimePermissionCollection.GET_CLASS_LOADER_PERMISSION); } - clazz = VMClassRegistry.findLoadedClass(name, null); - if (clazz == null) { + try { + clazz = VMClassRegistry.findLoadedClass(name, null); + } catch(NoClassDefFoundError e) { + // regardless of where this happened + // rethrow as ClassNotFoundException from here + } + if(clazz == null) { throw new ClassNotFoundException(name); } } else { diff --git a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java index a4801b8..2acf573 100644 --- a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java +++ b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ClassLoader.java @@ -524,7 +524,11 @@ public abstract class ClassLoader { Class clazz = findLoadedClass(name); if (clazz == null) { if (parentClassLoader == null) { - clazz = VMClassRegistry.findLoadedClass(name, null); + try { + clazz = VMClassRegistry.findLoadedClass(name, null); + } catch(NoClassDefFoundError ex) { + // continue as delegation failed + } } else { try { clazz = parentClassLoader.loadClass(name); diff --git a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp index 47161f5..e5e5011 100644 --- a/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp +++ b/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp @@ -107,12 +107,6 @@ JNIEXPORT jclass JNICALL Java_java_lang_ assert(buf); GetStringUTFRegion(jenv, name, 0, GetStringLength(jenv, name), buf); - // check for wrong symbols - if (strcspn(buf, "/[;") < length) { - STD_FREE(buf); - return NULL; - } - // filter out primitive types Global_Env *ge = jni_get_vm_env(jenv); @@ -139,31 +133,25 @@ JNIEXPORT jclass JNICALL Java_java_lang_ } } - ClassLoaderHandle loader = NULL; Class_Handle clss = NULL; - jclass jclss = NULL; - if(cl) { // if non null class loader is provided, search among loaded classes - loader = class_loader_lookup(cl); + ClassLoaderHandle loader = class_loader_lookup(cl); clss = class_find_loaded(loader, buf); } else { // if null class loader is specified // load class using bootstrap class loader - // clss = class_find_class_from_loader(NULL, buf, TRUE); clss = class_find_class_from_loader(NULL, buf, FALSE); + if(clss == NULL) + assert(exn_raised()); } STD_FREE(buf); + jclass jclss = NULL; if (clss) jclss = jni_class_from_handle(jenv, clss); - if (ExceptionOccurred(jenv)) { - ExceptionClear(jenv); - assert(jclss == NULL); - } - return jclss; } @@ -448,6 +436,7 @@ JNIEXPORT void JNICALL Java_java_lang_VM (JNIEnv *jenv, jclass unused, jclass clazz) { ASSERT_RAISE_AREA; + assert(clazz != NULL); Class *clss = jni_get_class_handle(jenv, clazz); Java_java_lang_VMClassRegistry_linkClass(jenv, unused, clazz); if(jenv->ExceptionCheck())