This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: Proxy remerge with GNU Classpath


Hi,

Here is a small fixlet from Jeroen which has been in GNU Classpath for
months.

2004-09-25  Jeroen Frijters  <jeroen@frijters.net>

        * java/lang/reflect/Proxy.java (getPackage, ClassFactory): Fixed
        handling of default package. (generate): Removed confused comments
        and code about making Method and Field accessible.

Committed,

Mark
Index: java/lang/reflect/Proxy.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/reflect/Proxy.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- java/lang/reflect/Proxy.java	12 Apr 2004 14:32:59 -0000	1.12
+++ java/lang/reflect/Proxy.java	10 Jul 2004 07:54:29 -0000	1.13
@@ -722,8 +722,8 @@
   private static final class ProxyData
   {
     /**
-     * The package this class is in.  Possibly null, meaning the unnamed
-     * package.
+     * The package this class is in *including the trailing dot* or "" for
+     * the unnamed (aka default) package.
      */
     String pack;
 
@@ -769,18 +769,17 @@
     }
 
     /**
-     * Return the name of a package given the name of a class.
-     * Returns null if no package.  We use this in preference to
+     * Return the name of a package (including the trailing dot)
+     * given the name of a class.
+     * Returns "" if no package.  We use this in preference to
      * using Class.getPackage() to avoid problems with ClassLoaders
      * that don't set the package.
      */
-    static String getPackage(Class k)
+    private static String getPackage(Class k)
     {
       String name = k.getName();
       int idx = name.lastIndexOf('.');
-      if (idx >= 0)
-	return name.substring(0, idx);
-      return null;
+      return name.substring(0, idx + 1);
     }
 
     /**
@@ -961,8 +960,7 @@
       // access_flags
       putU2(Modifier.SUPER | Modifier.FINAL | Modifier.PUBLIC);
       // this_class
-      qualName = ((data.pack == null ? "" : data.pack + '.')
-                  + "$Proxy" + data.id);
+      qualName = (data.pack + "$Proxy" + data.id);
       putU2(classInfo(TypeSignature.getEncodingOfClass(qualName, false)));
       // super_class
       putU2(classInfo("java/lang/reflect/Proxy"));
@@ -1325,34 +1323,26 @@
 
       try
         {
-          // XXX Do we require more native support here?
-
           Class vmClassLoader = Class.forName("java.lang.VMClassLoader");
           Class[] types = {ClassLoader.class, String.class,
                            byte[].class, int.class, int.class,
                            ProtectionDomain.class };
           Method m = vmClassLoader.getDeclaredMethod("defineClass", types);
-
-          // Bypass the security check of setAccessible(true), since this
-          // is trusted code. But note the comment above about the security
-          // risk of doing this outside a synchronized block.
+          // We can bypass the security check of setAccessible(true), since
+	  // we're in the same package.
           m.flag = true;
+
           Object[] args = {loader, qualName, bytecode, new Integer(0),
                            new Integer(bytecode.length),
                            Object.class.getProtectionDomain() };
           Class clazz = (Class) m.invoke(null, args);
-          m.flag = false;
 
           // Finally, initialize the m field of the proxy class, before
           // returning it.
-
-          // No security risk here, since clazz has not been exposed yet,
-          // so user code cannot grab the same reflection object.
           Field f = clazz.getDeclaredField("m");
           f.flag = true;
           // we can share the array, because it is not publicized
           f.set(null, methods);
-          f.flag = false;
 
           return clazz;
         }

Attachment: signature.asc
Description: This is a digitally signed message part


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]