aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-05-04 18:44:53 +0000
committerAndrew Haley <aph@gcc.gnu.org>2006-05-04 18:44:53 +0000
commitb2ed63b4aabad3b0120306a03536c3bb929cc65d (patch)
tree53c5cc5b6cfb9186e5f76d34fc5fec1124c7e943 /libjava
parenta7285117b4d52ba2ee8adc9f2c123ee08c48937c (diff)
downloadgcc-b2ed63b4aabad3b0120306a03536c3bb929cc65d.zip
gcc-b2ed63b4aabad3b0120306a03536c3bb929cc65d.tar.gz
gcc-b2ed63b4aabad3b0120306a03536c3bb929cc65d.tar.bz2
[multiple changes]
2006-05-04 Andrew Haley <aph@redhat.com> * class.c (make_field_value): Always build_address_of fdecl if there is an initializer. 2006-05-03 Andrew Haley <aph@redhat.com> PR libgcj/27352 * expr.c (maybe_rewrite_invocation): New function. (rewrite_arglist_getclass): Likewise. (rules): New. (expand_invoke): Call maybe_rewrite_invocation. * parse.y (patch_invoke): Likewise. * java-tree.h: (maybe_rewrite_invocation): New function. 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. From-SVN: r113532
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog11
-rw-r--r--libjava/java/lang/Class.h2
-rw-r--r--libjava/java/lang/Class.java11
-rw-r--r--libjava/java/lang/natClass.cc16
-rw-r--r--libjava/prims.cc5
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);