public inbox for java-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Some patches to break dependencies in libgcj
@ 2009-08-30 16:08 David Daney
  2009-08-31 18:49 ` Andrew John Hughes
  0 siblings, 1 reply; 2+ messages in thread
From: David Daney @ 2009-08-30 16:08 UTC (permalink / raw)
  To: java-patches

[-- Attachment #1: Type: text/plain, Size: 399 bytes --]

Attached are some patches I developed to break some dependencies in 
libgcj.  The use case I was addressing was to minimize executable size 
with -static-libgcj, but the patches may be interesting in other 
contexts.  I don't plan on committing these myself, but if others are 
interested in testing and committing them or using them as the basis for 
other work, feel free to do so.

David Daney



[-- Attachment #2: 0001-Don-t-use-class-objects-to-generate-class-names.-Ju.patch --]
[-- Type: text/plain, Size: 1829 bytes --]

From eac00cd6bda3a98090267a24102b24ab7a4a9b53 Mon Sep 17 00:00:00 2001
From: David Daney <daney@localhost.localdomain>
Date: Fri, 13 Mar 2009 23:31:53 -0700
Subject: [PATCH 1/7] Don't use class objects to generate class names.  Just use string
 directly to avoid Static linking pulling in the classes just to
 generate the name.

2009-03-13  David Daney  <david.s.daney@gmail.com>

	* gnu/javax/security/auth/callback/GnuCallbacks.java (GnuCallbacks):
	Use literal string for class names.
---
 .../javax/security/auth/callback/GnuCallbacks.java |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/libjava/classpath/gnu/javax/security/auth/callback/GnuCallbacks.java b/libjava/classpath/gnu/javax/security/auth/callback/GnuCallbacks.java
index 9fd72f9..832e1bb 100644
--- a/libjava/classpath/gnu/javax/security/auth/callback/GnuCallbacks.java
+++ b/libjava/classpath/gnu/javax/security/auth/callback/GnuCallbacks.java
@@ -52,10 +52,10 @@ public final class GnuCallbacks extends Provider
       {
         public Object run()
         {
-          put("CallbackHandler.Default", DefaultCallbackHandler.class.getName());
-          put("CallbackHandler.Console", ConsoleCallbackHandler.class.getName());
-          put("CallbackHandler.AWT", AWTCallbackHandler.class.getName());
-          put("CallbackHandler.Swing", SwingCallbackHandler.class.getName());
+          put("CallbackHandler.Default", "gnu.javax.security.auth.callback.DefaultCallbackHandler");
+          put("CallbackHandler.Console", "gnu.javax.security.auth.callback.ConsoleCallbackHandler");
+          put("CallbackHandler.AWT", "gnu.javax.security.auth.callback.AWTCallbackHandler");
+          put("CallbackHandler.Swing", "gnu.javax.security.auth.callback.SwingCallbackHandler");
 
           return null;
         }
-- 
1.6.0.6


[-- Attachment #3: 0002-Make-ExplictInfo-an-inner-class.-This-allows-the-.l.patch --]
[-- Type: text/plain, Size: 10282 bytes --]

From 8334f616f865eb1b63c8803d8528edf6c01c5845 Mon Sep 17 00:00:00 2001
From: David Daney <daney@localhost.localdomain>
Date: Fri, 13 Mar 2009 23:35:08 -0700
Subject: [PATCH 2/7] Make ExplictInfo an inner class.  This allows the .list files to be
 properly generated without hacking up makemake.tcl

2009-03-13  David Daney  <david.s.daney@gmail.com>

	* java/beans/Introspector.java (ExplictInfo): Make it an inner
	class.
---
 libjava/classpath/java/beans/Introspector.java |  337 ++++++++++++------------
 1 files changed, 168 insertions(+), 169 deletions(-)

diff --git a/libjava/classpath/java/beans/Introspector.java b/libjava/classpath/java/beans/Introspector.java
index 28df87f..297f5c5 100644
--- a/libjava/classpath/java/beans/Introspector.java
+++ b/libjava/classpath/java/beans/Introspector.java
@@ -511,195 +511,194 @@ public class Introspector {
 				b.getMethodDescriptors(),
 				icons);
   }
-}
 
-class ExplicitInfo 
-{
-  BeanDescriptor explicitBeanDescriptor;
-  BeanInfo[] explicitBeanInfo;
+  static class ExplicitInfo 
+  {
+    BeanDescriptor explicitBeanDescriptor;
+    BeanInfo[] explicitBeanInfo;
   
-  PropertyDescriptor[] explicitPropertyDescriptors;
-  EventSetDescriptor[] explicitEventSetDescriptors;
-  MethodDescriptor[] explicitMethodDescriptors;
+    PropertyDescriptor[] explicitPropertyDescriptors;
+    EventSetDescriptor[] explicitEventSetDescriptors;
+    MethodDescriptor[] explicitMethodDescriptors;
   
-  int defaultProperty;
-  int defaultEvent;
+    int defaultProperty;
+    int defaultEvent;
   
-  java.awt.Image[] im = new java.awt.Image[4];
+    java.awt.Image[] im = new java.awt.Image[4];
   
-  Class propertyStopClass;
-  Class eventStopClass;
-  Class methodStopClass;
+    Class propertyStopClass;
+    Class eventStopClass;
+    Class methodStopClass;
 
-  static Hashtable explicitBeanInfos = new Hashtable();
-  static Vector emptyBeanInfos = new Vector();
+    static Hashtable explicitBeanInfos = new Hashtable();
+    static Vector emptyBeanInfos = new Vector();
 
-  ExplicitInfo(Class beanClass, Class stopClass) 
-  {
-    while(beanClass != null && !beanClass.equals(stopClass)) 
-      {
+    ExplicitInfo(Class beanClass, Class stopClass) 
+    {
+      while(beanClass != null && !beanClass.equals(stopClass)) 
+	{
 
-	BeanInfo explicit = findExplicitBeanInfo(beanClass);
+	  BeanInfo explicit = findExplicitBeanInfo(beanClass);
 	
 
-	if(explicit != null) 
-	  {
+	  if(explicit != null) 
+	    {
 
-	    if(explicitBeanDescriptor == null) 
-	      {
-		explicitBeanDescriptor = explicit.getBeanDescriptor();
-	      }
-
-	    if(explicitBeanInfo == null) 
-	      {
-		explicitBeanInfo = explicit.getAdditionalBeanInfo();
-	      }
-
-	    if(explicitPropertyDescriptors == null) 
-	      {
-		if(explicit.getPropertyDescriptors() != null) 
-		  {
-		    explicitPropertyDescriptors = explicit.getPropertyDescriptors();
-		    defaultProperty = explicit.getDefaultPropertyIndex();
-		    propertyStopClass = beanClass;
-		  }
-	      }
-
-	    if(explicitEventSetDescriptors == null) 
-	      {
-		if(explicit.getEventSetDescriptors() != null) 
-		  {
-		    explicitEventSetDescriptors = explicit.getEventSetDescriptors();
-		    defaultEvent = explicit.getDefaultEventIndex();
-		    eventStopClass = beanClass;
-		  }
-	      }
-
-	    if(explicitMethodDescriptors == null) 
-	      {
-		if(explicit.getMethodDescriptors() != null) 
-		  {
-		    explicitMethodDescriptors = explicit.getMethodDescriptors();
-		    methodStopClass = beanClass;
-		  }
-	      }
-
-	    if(im[0] == null && im[1] == null 
-	       && im[2] == null && im[3] == null) 
-	      {
-		im[0] = explicit.getIcon(0);
-		im[1] = explicit.getIcon(1);
-		im[2] = explicit.getIcon(2);
-		im[3] = explicit.getIcon(3);
-	      }
-	  }
-	beanClass = beanClass.getSuperclass();
-      }
+	      if(explicitBeanDescriptor == null) 
+		{
+		  explicitBeanDescriptor = explicit.getBeanDescriptor();
+		}
+
+	      if(explicitBeanInfo == null) 
+		{
+		  explicitBeanInfo = explicit.getAdditionalBeanInfo();
+		}
+
+	      if(explicitPropertyDescriptors == null) 
+		{
+		  if(explicit.getPropertyDescriptors() != null) 
+		    {
+		      explicitPropertyDescriptors = explicit.getPropertyDescriptors();
+		      defaultProperty = explicit.getDefaultPropertyIndex();
+		      propertyStopClass = beanClass;
+		    }
+		}
+
+	      if(explicitEventSetDescriptors == null) 
+		{
+		  if(explicit.getEventSetDescriptors() != null) 
+		    {
+		      explicitEventSetDescriptors = explicit.getEventSetDescriptors();
+		      defaultEvent = explicit.getDefaultEventIndex();
+		      eventStopClass = beanClass;
+		    }
+		}
+
+	      if(explicitMethodDescriptors == null) 
+		{
+		  if(explicit.getMethodDescriptors() != null) 
+		    {
+		      explicitMethodDescriptors = explicit.getMethodDescriptors();
+		      methodStopClass = beanClass;
+		    }
+		}
+
+	      if(im[0] == null && im[1] == null 
+		 && im[2] == null && im[3] == null) 
+		{
+		  im[0] = explicit.getIcon(0);
+		  im[1] = explicit.getIcon(1);
+		  im[2] = explicit.getIcon(2);
+		  im[3] = explicit.getIcon(3);
+		}
+	    }
+	  beanClass = beanClass.getSuperclass();
+	}
 
-    if(propertyStopClass == null) 
-      {
-	propertyStopClass = stopClass;
-      }
+      if(propertyStopClass == null) 
+	{
+	  propertyStopClass = stopClass;
+	}
 
-    if(eventStopClass == null) 
-      {
-	eventStopClass = stopClass;
-      }
+      if(eventStopClass == null) 
+	{
+	  eventStopClass = stopClass;
+	}
 
-    if(methodStopClass == null) 
-      {
-	methodStopClass = stopClass;
-      }
-  }
+      if(methodStopClass == null) 
+	{
+	  methodStopClass = stopClass;
+	}
+    }
   
-  /** Throws away all cached data and makes sure we re-instantiate things
-    * like BeanDescriptors again.
-    */
-  static void flushCaches() {
-	explicitBeanInfos.clear();
-	emptyBeanInfos.clear();
-  }
+    /** Throws away all cached data and makes sure we re-instantiate things
+     * like BeanDescriptors again.
+     */
+    static void flushCaches() {
+      explicitBeanInfos.clear();
+      emptyBeanInfos.clear();
+    }
   
-  static BeanInfo findExplicitBeanInfo(Class beanClass) 
-  {
-    BeanInfo retval = (BeanInfo)explicitBeanInfos.get(beanClass);
-    if(retval != null) 
-      {
-	return retval;
-      } 
-    else if(emptyBeanInfos.indexOf(beanClass) != -1) 
-      {
-	return null;
-      } 
-    else 
-      {
-	retval = reallyFindExplicitBeanInfo(beanClass);
-	if(retval != null) 
-	  {
-	    explicitBeanInfos.put(beanClass,retval);
-	  } 
-	else 
-	  {
-	    emptyBeanInfos.addElement(beanClass);
-	  }
-	return retval;
-      }
-  }
+    static BeanInfo findExplicitBeanInfo(Class beanClass) 
+    {
+      BeanInfo retval = (BeanInfo)explicitBeanInfos.get(beanClass);
+      if(retval != null) 
+	{
+	  return retval;
+	} 
+      else if(emptyBeanInfos.indexOf(beanClass) != -1) 
+	{
+	  return null;
+	} 
+      else 
+	{
+	  retval = reallyFindExplicitBeanInfo(beanClass);
+	  if(retval != null) 
+	    {
+	      explicitBeanInfos.put(beanClass,retval);
+	    } 
+	  else 
+	    {
+	      emptyBeanInfos.addElement(beanClass);
+	    }
+	  return retval;
+	}
+    }
   
-  static BeanInfo reallyFindExplicitBeanInfo(Class beanClass) 
-  {
-    ClassLoader beanClassLoader = beanClass.getClassLoader();
-    BeanInfo beanInfo;
+    static BeanInfo reallyFindExplicitBeanInfo(Class beanClass) 
+    {
+      ClassLoader beanClassLoader = beanClass.getClassLoader();
+      BeanInfo beanInfo;
 
-    beanInfo = getBeanInfo(beanClassLoader, beanClass.getName() + "BeanInfo");
-    if (beanInfo == null)
-      {
-	String newName;
-	newName = ClassHelper.getTruncatedClassName(beanClass) + "BeanInfo";
+      beanInfo = getBeanInfo(beanClassLoader, beanClass.getName() + "BeanInfo");
+      if (beanInfo == null)
+	{
+	  String newName;
+	  newName = ClassHelper.getTruncatedClassName(beanClass) + "BeanInfo";
 
-	for(int i = 0; i < Introspector.beanInfoSearchPath.length; i++) 
-	  {
-	    if (Introspector.beanInfoSearchPath[i].equals("")) 
-	      beanInfo = getBeanInfo(beanClassLoader, newName);
-	    else 
-	      beanInfo = getBeanInfo(beanClassLoader,
-				     Introspector.beanInfoSearchPath[i] + "."
-				     + newName);
-
-		// Returns the beanInfo if it exists and the described class matches
-		// the one we searched.
-	    if (beanInfo != null && beanInfo.getBeanDescriptor() != null &&
-			beanInfo.getBeanDescriptor().getBeanClass() == beanClass)
-
-	      return beanInfo;
-	  }
-      }
+	  for(int i = 0; i < Introspector.beanInfoSearchPath.length; i++) 
+	    {
+	      if (Introspector.beanInfoSearchPath[i].equals("")) 
+		beanInfo = getBeanInfo(beanClassLoader, newName);
+	      else 
+		beanInfo = getBeanInfo(beanClassLoader,
+				       Introspector.beanInfoSearchPath[i] + "."
+				       + newName);
+
+	      // Returns the beanInfo if it exists and the described class matches
+	      // the one we searched.
+	      if (beanInfo != null && beanInfo.getBeanDescriptor() != null &&
+		  beanInfo.getBeanDescriptor().getBeanClass() == beanClass)
+
+		return beanInfo;
+	    }
+	}
 
-    return beanInfo;
-  }
+      return beanInfo;
+    }
 
-  /**
-   * Returns an instance of the given class name when it can be loaded
-   * through the given class loader, or null otherwise.
-   */
-  private static BeanInfo getBeanInfo(ClassLoader cl, String infoName)
-  {
-    try
-      {
-	return (BeanInfo) Class.forName(infoName, true, cl).newInstance();
-      }
-    catch (ClassNotFoundException cnfe)
-      {
-	return null;
-      }
-    catch (IllegalAccessException iae)
-      {
-	return null;
-      }
-    catch (InstantiationException ie)
-      {
-	return null;
-      }
+    /**
+     * Returns an instance of the given class name when it can be loaded
+     * through the given class loader, or null otherwise.
+     */
+    private static BeanInfo getBeanInfo(ClassLoader cl, String infoName)
+    {
+      try
+	{
+	  return (BeanInfo) Class.forName(infoName, true, cl).newInstance();
+	}
+      catch (ClassNotFoundException cnfe)
+	{
+	  return null;
+	}
+      catch (IllegalAccessException iae)
+	{
+	  return null;
+	}
+      catch (InstantiationException ie)
+	{
+	  return null;
+	}
+    }
   }
-  
 }
-- 
1.6.0.6


[-- Attachment #4: 0003--javax-xml-parsers-DocumentBuilderFactory.java-ne.patch --]
[-- Type: text/plain, Size: 2487 bytes --]

From 6d1f902ae4261a1cfd402278c6666aebf43674b6 Mon Sep 17 00:00:00 2001
From: David Daney <daney@localhost.localdomain>
Date: Fri, 13 Mar 2009 23:38:45 -0700
Subject: [PATCH 3/7] 	* javax/xml/parsers/DocumentBuilderFactory.java (newInstance): Create
 	gnu.xml.dom.DomDocumentBuilderFactory indirectly.
 	* javax/xml/parsers/SAXParserFactory.java (newInstance): Create
 	gnu.xml.stream.SAXParserFactory indirectly.

---
 .../javax/xml/parsers/DocumentBuilderFactory.java  |   12 +++++++++++-
 .../javax/xml/parsers/SAXParserFactory.java        |   12 +++++++++++-
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/libjava/classpath/javax/xml/parsers/DocumentBuilderFactory.java b/libjava/classpath/javax/xml/parsers/DocumentBuilderFactory.java
index 9312e65..5dbf154 100644
--- a/libjava/classpath/javax/xml/parsers/DocumentBuilderFactory.java
+++ b/libjava/classpath/javax/xml/parsers/DocumentBuilderFactory.java
@@ -115,7 +115,17 @@ public abstract class DocumentBuilderFactory
           }
       }
     while (className == null && count < 3);
-    return new gnu.xml.dom.DomDocumentBuilderFactory();
+    try
+      {
+	Class t = Class.forName("gnu.xml.dom.DomDocumentBuilderFactory");
+	return (DocumentBuilderFactory) t.newInstance();
+      }
+    catch (Exception e)
+      {
+	throw new FactoryConfigurationError(e,
+					    "error instantiating class gnu.xml.dom.DomDocumentBuilderFactory");
+      }
+    //    return new gnu.xml.dom.DomDocumentBuilderFactory();
   }
   
   private static String getFactoryClassName(ClassLoader loader, int attempt)
diff --git a/libjava/classpath/javax/xml/parsers/SAXParserFactory.java b/libjava/classpath/javax/xml/parsers/SAXParserFactory.java
index 549fe4b..52e2274 100644
--- a/libjava/classpath/javax/xml/parsers/SAXParserFactory.java
+++ b/libjava/classpath/javax/xml/parsers/SAXParserFactory.java
@@ -115,7 +115,17 @@ public abstract class SAXParserFactory
           }
       }
     while (className == null && count < 3);
-    return new gnu.xml.stream.SAXParserFactory();
+    try
+      {
+	Class t = Class.forName("gnu.xml.stream.SAXParserFactory");
+	return (SAXParserFactory) t.newInstance();
+      }
+    catch (Exception e)
+      {
+	throw new FactoryConfigurationError(e,
+					    "error instantiating class gnu.xml.stream.SAXParserFactory");
+      }
+    //    return new gnu.xml.stream.SAXParserFactory();
   }
 
   private static String getFactoryClassName(ClassLoader loader, int attempt)
-- 
1.6.0.6


[-- Attachment #5: 0006-Compile-some-packages-class-at-a-time-to-break-depen.patch --]
[-- Type: text/plain, Size: 2406 bytes --]

From b06cc8fae04326debaa75ff730ae63430cf97b71 Mon Sep 17 00:00:00 2001
From: David Daney <david.s.daney@gmail.com>
Date: Sat, 28 Mar 2009 22:37:50 -0700
Subject: [PATCH 6/7] Compile some packages class-at-a-time to break dependencies with
 classes that are not used.  Also the emit_ordinary_rule was broken as
 it could cause the same class to be compiled more than once leading to
 duplicate definition errors when linking.

	* scripts/makemake.tcl (gnu/javax/security/auth/callback,
	java/awt,java/text, java/beans): Compile as ordinary.
	(emit_ordinary_rule): Only compile classfiles with the same base
	name together
---
 libjava/scripts/makemake.tcl |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/libjava/scripts/makemake.tcl b/libjava/scripts/makemake.tcl
index 0802658..09bb589 100755
--- a/libjava/scripts/makemake.tcl
+++ b/libjava/scripts/makemake.tcl
@@ -99,6 +99,25 @@ set package_map(gnu/javax/swing/text/html/parser/support) package
 set package_map(gnu/gcj/xlib) package
 set package_map(gnu/awt/xlib) package
 
+# Break dependencies:
+set package_map(gnu/javax/security/auth/callback) ordinary
+set package_map(java/awt) ordinary
+set package_map(java/awt/print) package
+set package_map(java/awt/font) package
+set package_map(java/awt/datatransfer) package
+set package_map(java/awt/im) package
+set package_map(java/awt/geom) package
+set package_map(java/awt/dnd) package
+set package_map(java/awt/peer) package
+set package_map(java/awt/color) package
+set package_map(java/awt/image) package
+set package_map(java/awt/event) package
+set package_map(java/text) ordinary
+set package_map(java/text/spi) package
+set package_map(java/beans) ordinary
+set package_map(java/beans/beancontext) package
+
+
 # These packages should only be included if the interpreter is
 # enabled.
 set package_map(gnu/classpath/jdwp) interpreter
@@ -394,7 +413,8 @@ proc emit_ordinary_rule {package} {
 
     puts "$lname: classpath/$file"
     puts "\t@\$(mkinstalldirs) \$(dir \$@)"
-    puts "\techo \$(srcdir)/classpath/lib/${root}*.class> $lname"
+    puts "\techo \$(srcdir)/classpath/lib/${root}.class > $lname"
+    puts "\tif test -e `echo \$(srcdir)/classpath/lib/${root}\\\\\$\$*.class | cut -d' ' -f1` ; then echo  \$(srcdir)/classpath/lib/${root}\\\$\$*.class >> $lname ; fi"
     puts ""
     puts "-include $dname"
     puts ""
-- 
1.6.0.6


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Some patches to break dependencies in libgcj
  2009-08-30 16:08 Some patches to break dependencies in libgcj David Daney
@ 2009-08-31 18:49 ` Andrew John Hughes
  0 siblings, 0 replies; 2+ messages in thread
From: Andrew John Hughes @ 2009-08-31 18:49 UTC (permalink / raw)
  To: David Daney; +Cc: java-patches

2009/8/30 David Daney <david.s.daney@gmail.com>:
> Attached are some patches I developed to break some dependencies in libgcj.
>  The use case I was addressing was to minimize executable size with
> -static-libgcj, but the patches may be interesting in other contexts.  I
> don't plan on committing these myself, but if others are interested in
> testing and committing them or using them as the basis for other work, feel
> free to do so.
>
> David Daney
>
>
>

I think the first three should be applied to Classpath (if at all)
rather than creating further divergence in gcj.

The first patch seems ok, though it does make the class more
susceptible to changes in package naming (at present, it would break
at compile time, with the patch it would require a runtime check).
The changes in the second patch seem to be lost in whitespace adjustments.
With the third patch, I wonder if we couldn't just supply the default
implementation via META-INF and remove that instantiation altogether.

I'll leave comments on the fourth patch to those who know the gcj
makefiles better than I do :)
-- 
Andrew :-)

Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)

Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net

PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint: F8EF F1EA 401E 2E60 15FA  7927 142C 2591 94EF D9D8

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-08-30 16:08 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-30 16:08 Some patches to break dependencies in libgcj David Daney
2009-08-31 18:49 ` Andrew John Hughes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).