[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [cp-patches] RFC: implementation of getPackage for the vmreference
From: |
Nicolas Geoffray |
Subject: |
Re: [cp-patches] RFC: implementation of getPackage for the vmreference |
Date: |
Fri, 28 Oct 2005 11:29:40 +0200 |
User-agent: |
Mozilla Thunderbird 1.0.7 (X11/20051019) |
Sorry, wrong changelog. Here it is.
2005-10-28 Nicolas Geoffray <address@hidden>
Reported by: Gael Thomas <address@hidden>
* NEWS : added entry about new implementation of
VMClassLoader.getPackage(s), and new method
VMClassLoader.getBootPackages
* vm/reference/java/lang/VMClassLoader.java:
Added new definedPackages field to store packages
loaded by the bootstrap classloader.
Added new static initializer to create all packages
which names are returned by getBootPackages
(getBootPackages): new private method. Helper
to get as a String[] the native package names
(getPackage): uses the new definedPackages field
(getPackages): uses the new definedPackages field
* java/lang/Class.java:
(getPackage): if the classloader of the class is null
then call VMClassLoader.getPackage
Index: vm/reference/java/lang/VMClassLoader.java
===================================================================
RCS file:
/cvsroot/classpath/classpath/vm/reference/java/lang/VMClassLoader.java,v
retrieving revision 1.32
diff -u -r1.32 VMClassLoader.java
--- vm/reference/java/lang/VMClassLoader.java 21 Oct 2005 10:47:17 -0000
1.32
+++ vm/reference/java/lang/VMClassLoader.java 28 Oct 2005 08:35:47 -0000
@@ -40,6 +40,7 @@
package java.lang;
import gnu.classpath.SystemProperties;
+import gnu.classpath.Configuration;
import java.io.File;
import java.io.IOException;
@@ -63,6 +64,48 @@
*/
final class VMClassLoader
{
+
+
+ /** packages loaded by the bootstrap class loader */
+ static final HashMap definedPackages = new HashMap();
+
+ /**
+ * Converts the array string of native package names to
+ * Packages. The packages are then put into the
+ * definedPackages hashMap
+ */
+ static
+ {
+ String[] packages = getBootPackages();
+
+ if( packages != null)
+ {
+ String specName =
+ SystemProperties.getProperty("java.specification.name");
+ String vendor =
+ SystemProperties.getProperty("java.specification.vendor");
+ String version =
+ SystemProperties.getProperty("java.specification.version");
+
+ Package p;
+
+ for(int i = 0; i < packages.length; i++)
+ {
+ p = new Package(packages[i],
+ specName,
+ vendor,
+ version,
+ "GNU Classpath",
+ "GNU",
+ Configuration.CLASSPATH_VERSION,
+ null);
+
+ definedPackages.put(packages[i], p);
+ }
+ }
+ }
+
+
/**
* Helper to define a class using a string of bytes. This assumes that
* the security checks have already been performed, if necessary.
@@ -190,29 +233,41 @@
return v.elements();
}
+
/**
- * Helper to get a package from the bootstrap class loader. The default
- * implementation of returning null may be adequate, or you may decide
- * that this needs some native help.
+ * Returns a String[] of native package names. The default
+ * implementation returns an empty array, or you may decide
+ * this needs native help.
+ */
+ private static String[] getBootPackages()
+ {
+ return new String[0];
+ }
+
+
+ /**
+ * Helper to get a package from the bootstrap class loader.
*
* @param name the name to find
* @return the named package, if it exists
*/
static Package getPackage(String name)
{
- return null;
+ return (Package)definedPackages.get(name);
}
+
+
/**
- * Helper to get all packages from the bootstrap class loader. The default
- * implementation of returning an empty array may be adequate, or you may
- * decide that this needs some native help.
+ * Helper to get all packages from the bootstrap class loader.
*
* @return all named packages, if any exist
*/
static Package[] getPackages()
{
- return new Package[0];
+ Package[] packages = new Package[definedPackages.size()];
+ definedPackages.values().toArray(packages);
+ return packages;
}
/**
Index: java/lang/Class.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/Class.java,v
retrieving revision 1.40
diff -u -r1.40 Class.java
--- java/lang/Class.java 15 Sep 2005 14:42:36 -0000 1.40
+++ java/lang/Class.java 28 Oct 2005 08:37:34 -0000
@@ -594,7 +594,8 @@
ClassLoader cl = getClassLoader();
if (cl != null)
return cl.getPackage(getPackagePortion(getName()));
- return null;
+ else
+ return VMClassLoader.getPackage(getPackagePortion(getName()));
}
/**
Index: NEWS
===================================================================
RCS file: /cvsroot/classpath/classpath/NEWS,v
retrieving revision 1.99
diff -u -r1.99 NEWS
--- NEWS 21 Oct 2005 18:13:39 -0000 1.99
+++ NEWS 28 Oct 2005 08:37:43 -0000
@@ -16,6 +16,14 @@
It can flatten graphs and, at least for the simple cases, is interoperable
with Sun's jdk 1.5.
+Runtime interface changes:
+
+* Changed implementation of VMClassLoader.getPackage(s) : new method
+ VMClassLoader.getBootPackages should be implemented by the vm, and sould
+ return a string array of boot package names ("java.lang", "java.net", ...).
+ Feedback from vm implementors for usability and relevance of the
+ getBootPackages method would be greatly appreciated.
+
New in release 0.18 (Sep 6, 2005)
* GNU JAWT implementation, the AWT Native Interface, which allows direct