diff options
Diffstat (limited to 'libjava')
| -rw-r--r-- | libjava/ChangeLog | 11 | ||||
| -rw-r--r-- | libjava/java/lang/Class.h | 2 | ||||
| -rw-r--r-- | libjava/java/lang/Class.java | 11 | ||||
| -rw-r--r-- | libjava/java/lang/natClass.cc | 16 | ||||
| -rw-r--r-- | libjava/prims.cc | 5 |
5 files changed, 42 insertions, 3 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 161adfc..19c06e1 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,14 @@ +2006-05-03 Andrew Haley <aph@redhat.com> + + PR libgcj/27352 + * java/lang/Class.java (getClassLoader(Class)): New. + forName(String, Class): New. + * java/lang/natClass.cc (getClassLoader(Class)): New. + +2006-05-02 Andrew Haley <aph@redhat.com> + + * prims.cc (_Jv_NewMultiArray): Check for phantom class. + 2006-05-04 Tom Tromey <tromey@redhat.com> PR libgcj/26861: diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 7221294..f6ca3de 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -297,6 +297,8 @@ public: JArray<jclass> *getClasses (void); java::lang::ClassLoader *getClassLoader (void); +private: + java::lang::ClassLoader *getClassLoader (jclass caller); public: // This is an internal method that circumvents the usual security // checks when getting the class loader. diff --git a/libjava/java/lang/Class.java b/libjava/java/lang/Class.java index 60ca457..66b85c7 100644 --- a/libjava/java/lang/Class.java +++ b/libjava/java/lang/Class.java @@ -111,6 +111,14 @@ public final class Class implements Serializable public static native Class forName (String className) throws ClassNotFoundException; + // A private internal method that is called by compiler-generated code. + private static Class forName (String className, Class caller) + throws ClassNotFoundException + { + return forName(className, true, caller.getClassLoader()); + } + + /** * Use the specified classloader to load and link a class. If the loader * is null, this uses the bootstrap class loader (provide the security @@ -185,6 +193,9 @@ public final class Class implements Serializable */ public native ClassLoader getClassLoader (); + // A private internal method that is called by compiler-generated code. + private final native ClassLoader getClassLoader (Class caller); + /** * If this is an array, get the Class representing the type of array. * Examples: "[[Ljava.lang.String;" would return "[Ljava.lang.String;", and diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index d888350..8870889 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -115,9 +115,19 @@ java::lang::Class::getClassLoader (void) if (s != NULL) { jclass caller = _Jv_StackTrace::GetCallingClass (&Class::class$); - ClassLoader *caller_loader = NULL; - if (caller) - caller_loader = caller->getClassLoaderInternal(); + return getClassLoader (caller); + } + + return loader; +} + +java::lang::ClassLoader * +java::lang::Class::getClassLoader (jclass caller) +{ + java::lang::SecurityManager *s = java::lang::System::getSecurityManager(); + if (s != NULL) + { + ClassLoader *caller_loader = caller->getClassLoaderInternal(); // If the caller has a non-null class loader, and that loader // is not this class' loader or an ancestor thereof, then do a diff --git a/libjava/prims.cc b/libjava/prims.cc index 5e016c9..e0cdc0a 100644 --- a/libjava/prims.cc +++ b/libjava/prims.cc @@ -762,6 +762,11 @@ _Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes) jobject _Jv_NewMultiArray (jclass array_type, jint dimensions, ...) { + // Creating an array of an unresolved type is impossible. So we throw + // the NoClassDefFoundError. + if (_Jv_IsPhantomClass(array_type)) + throw new java::lang::NoClassDefFoundError(array_type->getName()); + va_list args; jint sizes[dimensions]; va_start (args, dimensions); |
