|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
Some patches to break dependencies in libgcjAttached 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 From eac00cd6bda3a98090267a24102b24ab7a4a9b53 Mon Sep 17 00:00:00 2001 From: David Daney <daney@...> 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@...> * 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 From 8334f616f865eb1b63c8803d8528edf6c01c5845 Mon Sep 17 00:00:00 2001 From: David Daney <daney@...> 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@...> * 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 From 6d1f902ae4261a1cfd402278c6666aebf43674b6 Mon Sep 17 00:00:00 2001 From: David Daney <daney@...> 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 From b06cc8fae04326debaa75ff730ae63430cf97b71 Mon Sep 17 00:00:00 2001 From: David Daney <david.s.daney@...> 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 |
|
|
Re: Some patches to break dependencies in libgcj2009/8/30 David Daney <david.s.daney@...>:
> 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 |
| Free embeddable forum powered by Nabble | Forum Help |