This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: FYI: java.endorsed.dirs
- From: Tom Tromey <tromey at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: 23 Mar 2005 16:54:04 -0700
- Subject: Patch: FYI: java.endorsed.dirs
- Reply-to: tromey at redhat dot com
I'm checking this in on the trunk.
I have this same patch prepared for the 4.0 branch, but at the moment
I am reluctant to check it in. I don't have any reason for this
except that it is a complicated change, and could well break the
Windows port, at least for XML.
This patch basically follows the 6 part plan I posted to the gcj list
a couple of weeks ago.
Tested on x86 FC2. I also ran eclipse and jonas with this patch in
place. Eclipse tested that the "built-in" XML provider is correctly
found, as Eclipse does not provide its own. For Jonas I removed my
hacks to tell it about the XML provider it requires, and this worked
(thus showing that java.endorsed.dirs works correctly).
Tom
Index: ChangeLog
from Tom Tromey <tromey@redhat.com>
* Makefile.in: Rebuilt.
* Makefile.am (AM_CXXFLAGS): Define TOOLEXECLIBDIR.
(libgcj0_convenience_la_SOURCES): Don't include
gnu_xml_source_files.
(libgcj0_convenience_la_LIBADD): New variable.
(libgcj_la_LIBADD): Don't include sax or w3c_dom.
(all_java_source_files): javax_imageio_source_files,
javax_xml_source_files, and gnu_java_beans_source_files.
($(gnu_xml_source_files:.java=.lo)): Removed target.
(gnu-xml.lo): New target.
(javax-imageio.lo): Likewise.
(javax-xml.lo): Likewise.
(gnu-java-beans.lo): Likewise.
(gnu_java_beans_source_files): New variable.
(javax_imageio_source_files): Likewise.
(javax_xml_source_files): Likewise.
(javax_source_files): Moved files to other variable.
(awt_java_source_files): Likewise.
(ordinary_java_source_files): Added BootClassLoader.java.
* java/lang/natVMClassLoader.cc (defineClass): Use boot loader,
not system class loader.
(initBootLoader): New method.
(loadClass): Search bootLoader.
* java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): Use
boot loader, not system class loader.
(_Jv_UnregisterInitiatingLoader): Likewise.
(_Jv_FindClass): Likewise. Ensure entries in
bootstrap_class_list are unique.
* java/lang/natClass.cc (getClassLoader): Don't special case
system class loader.
* java/lang/VMClassLoader.java (bootLoader): New field.
(getResource): Use bootLoader.
(getResources): Likewise.
(initBootLoader): Declare.
* gnu/gcj/runtime/BootClassLoader.java: New file.
* external/sax/org/xml/sax/helpers/NamespaceSupport.java
(EMPTY_ENUMERATION): Now package-private.
* external/w3c_com/Makefile.in: Rebuilt.
* external/w3c_com/Makefile.am (MULTIBUILDTOP): New variable.
(w3c.jar): New target.
(classes.stamp): Updated.
(toolexeclib_LTLIBRARIES): Renamed from noinst_LTLIBRARIES.
Changed name of library.
(libw3c_gcj_la_SOURCES): New variable.
(libw3c_gcj_la_GCJFLAGS): Likewise.
(source_files): Renamed from lib3c_convenience_la_SOURCES.
* external/sax/Makefile.in: Rebuilt.
* external/sax/Makefile.am (MULTIBUILDTOP): New variable.
(sax.jar): New target.
(classes.stamp): Updated.
(toolexeclib_LTLIBRARIES): Renamed from noinst_LTLIBRARIES.
Changed name of library.
(libsax_gcj_la_SOURCES): New variable.
(libsax_gcj_la_GCJFLAGS): Likewise.
(source_files): Renamed from libsax_convenience_la_SOURCES.
* stacktrace.cc (non_system_trace_fn): Don't look at system class
loader.
* prims.cc (_Jv_CreateJavaVM): Initialize the bootstrap class
loader.
(_Jv_RunMain): Handle case where 'runtime' is NULL at exit.
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.464
diff -u -r1.464 Makefile.am
--- Makefile.am 21 Mar 2005 18:11:40 -0000 1.464
+++ Makefile.am 23 Mar 2005 23:39:13 -0000
@@ -184,7 +184,8 @@
-DLIBDIR="\"$(libdir)\"" \
-DBOOT_CLASS_PATH="\"$(jardir)/$(jar_DATA)\"" \
-DJAVA_EXT_DIRS="\"$(jardir)/ext\"" \
- -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\""
+ -DLIBGCJ_DEFAULT_DATABASE="\"$(dbexecdir)/$(db_name)\"" \
+ -DTOOLEXECLIBDIR="\"$(toolexeclibdir)\""
AM_GCJFLAGS = \
@LIBGCJ_JAVAFLAGS@ \
@@ -233,12 +234,16 @@
libgcj0_convenience_la_SOURCES = prims.cc jni.cc exception.cc stacktrace.cc \
link.cc defineclass.cc interpret.cc verify.cc \
$(nat_source_files) $(math_c_source_files) $(java_source_files) \
- $(gnu_xml_source_files) $(built_java_source_files) \
+ $(built_java_source_files) \
$(BOEHMGC_SRC) $(NOGC_SRC) \
$(BACKTRACE_SRC) \
$(POSIX_PLATFORM_SRC) $(WIN32_PLATFORM_SRC) $(ECOS_PLATFORM_SRC) \
$(DARWIN_CRT_SRC) \
$(POSIX_THREAD_SRC) $(WIN32_THREAD_SRC) $(NO_THREAD_SRC)
+libgcj0_convenience_la_LIBADD = \
+ gnu-xml.lo javax-imageio.lo \
+ javax-xml.lo gnu-java-beans.lo
+
noinst_LTLIBRARIES = libgcj0_convenience.la
libgcj_la_SOURCES =
@@ -254,8 +259,6 @@
$(LIBLTDL) $(SYS_ZLIBS) \
-version-info `grep -v '^\#' $(srcdir)/libtool-version`
libgcj_la_LIBADD = \
- external/sax/libsax_convenience.la \
- external/w3c_dom/libw3c_convenience.la \
libgcj0_convenience.la \
$(LIBFFI) $(ZLIBS) $(GCLIBS) $(propertyo_files)
libgcj_la_DEPENDENCIES = libgcj-$(gcc_version).jar \
@@ -515,7 +518,10 @@
$(built_java_source_files) \
$(gtk_awt_peer_sources) \
$(xlib_java_source_files) \
- $(gnu_xml_source_files)
+ $(gnu_xml_source_files) \
+ $(javax_imageio_source_files) \
+ $(javax_xml_source_files) \
+ $(gnu_java_beans_source_files)
all_java_class_files = $(all_java_source_files:.java=.class)
@@ -610,7 +616,7 @@
$(javao_files) $(xlib_javao_files): %.lo: %.java
$(LTGCJCOMPILE) -o $@ -c $<
-$(gtk_awt_peer_sources:.java=.lo) $(gnu_xml_source_files:.java=.lo): %.lo: %.java
+$(gtk_awt_peer_sources:.java=.lo): %.lo: %.java
$(LTGCJCOMPILE) -fjni -o $@ -c $<
## Pass the list of object files to libtool in a temporary file to
@@ -631,6 +637,58 @@
## ################################################################
##
+## Some packages must be built with the binary compatibility ABI. We
+## compile each such package into a .so, broken down more or less by
+## conceptual unit.
+##
+
+## Depend on the sources, even though we are going to compile the
+## classes.
+gnu-xml.lo: $(gnu_xml_source_files)
+## FIXME: this is ugly. We want to make sure the .class files have
+## been built, but we don't want a real dependency on them as this
+## would cause our target to be rebuilt whenever any .java file is
+## touched.
+ $(MAKE) classes.stamp
+ $(LTGCJCOMPILE) -fjni -findirect-dispatch -c -o gnu-xml.lo \
+ `find gnu/xml -name '*.class' -print`
+
+## Depend on the sources, even though we are going to compile the
+## classes.
+javax-imageio.lo: $(javax_imageio_source_files)
+## FIXME: this is ugly. We want to make sure the .class files have
+## been built, but we don't want a real dependency on them as this
+## would cause our target to be rebuilt whenever any .java file is
+## touched.
+ $(MAKE) classes.stamp
+ $(LTGCJCOMPILE) -findirect-dispatch -c -o javax-imageio.lo \
+ `find javax/imageio -name '*.class' -print`
+
+## Depend on the sources, even though we are going to compile the
+## classes.
+javax-xml.lo: $(javax_xml_source_files)
+## FIXME: this is ugly. We want to make sure the .class files have
+## been built, but we don't want a real dependency on them as this
+## would cause our target to be rebuilt whenever any .java file is
+## touched.
+ $(MAKE) classes.stamp
+ $(LTGCJCOMPILE) -findirect-dispatch -c -o javax-xml.lo \
+ `find javax/xml -name '*.class' -print`
+
+## Depend on the sources, even though we are going to compile the
+## classes.
+gnu-java-beans.lo: $(gnu_java_beans_source_files)
+## FIXME: this is ugly. We want to make sure the .class files have
+## been built, but we don't want a real dependency on them as this
+## would cause our target to be rebuilt whenever any .java file is
+## touched.
+ $(MAKE) classes.stamp
+ $(LTGCJCOMPILE) -findirect-dispatch -c -o gnu-java-beans.lo \
+ `find gnu/java/beans -name '*.class' -print`
+
+## ################################################################
+
+##
## How to build header files.
##
@@ -1054,40 +1112,7 @@
## hand.
special_java_source_files = java/lang/Class.java java/lang/Object.java
-awt_java_source_files = \
-gnu/awt/LightweightRedirector.java \
-gnu/awt/j2d/AbstractGraphicsState.java \
-gnu/awt/j2d/DirectRasterGraphics.java \
-gnu/awt/j2d/Graphics2DImpl.java \
-gnu/awt/j2d/IntegerGraphicsState.java \
-gnu/awt/j2d/MappedRaster.java \
-gnu/java/awt/BitMaskExtent.java \
-gnu/java/awt/Buffers.java \
-gnu/java/awt/BitwiseXORComposite.java \
-gnu/java/awt/ComponentDataBlitOp.java \
-gnu/java/awt/ClasspathToolkit.java \
-gnu/java/awt/EmbeddedWindow.java \
-gnu/java/awt/EmbeddedWindowSupport.java \
-gnu/java/awt/EventModifier.java \
-gnu/java/awt/color/CieXyzConverter.java \
-gnu/java/awt/color/ClutProfileConverter.java \
-gnu/java/awt/color/ColorLookUpTable.java \
-gnu/java/awt/color/ColorSpaceConverter.java \
-gnu/java/awt/color/GrayProfileConverter.java \
-gnu/java/awt/color/GrayScaleConverter.java \
-gnu/java/awt/color/LinearRGBConverter.java \
-gnu/java/awt/color/ProfileHeader.java \
-gnu/java/awt/color/PyccConverter.java \
-gnu/java/awt/color/RgbProfileConverter.java \
-gnu/java/awt/color/SrgbConverter.java \
-gnu/java/awt/color/TagEntry.java \
-gnu/java/awt/color/ToneReproductionCurve.java \
-gnu/java/awt/image/ImageDecoder.java \
-gnu/java/awt/image/XBMDecoder.java \
-gnu/java/awt/peer/EmbeddedWindowPeer.java \
-gnu/java/awt/peer/GLightweightPeer.java \
-gnu/java/awt/peer/ClasspathFontPeer.java \
-gnu/java/awt/peer/ClasspathTextLayoutPeer.java \
+gnu_java_beans_source_files = \
gnu/java/beans/decoder/AbstractContext.java \
gnu/java/beans/decoder/AbstractCreatableObjectContext.java \
gnu/java/beans/decoder/AbstractElementHandler.java \
@@ -1139,7 +1164,42 @@
gnu/java/beans/DummyAppletContext.java \
gnu/java/beans/DummyAppletStub.java \
gnu/java/beans/ExplicitBeanInfo.java \
-gnu/java/beans/IntrospectionIncubator.java \
+gnu/java/beans/IntrospectionIncubator.java
+
+awt_java_source_files = \
+gnu/awt/LightweightRedirector.java \
+gnu/awt/j2d/AbstractGraphicsState.java \
+gnu/awt/j2d/DirectRasterGraphics.java \
+gnu/awt/j2d/Graphics2DImpl.java \
+gnu/awt/j2d/IntegerGraphicsState.java \
+gnu/awt/j2d/MappedRaster.java \
+gnu/java/awt/BitMaskExtent.java \
+gnu/java/awt/Buffers.java \
+gnu/java/awt/BitwiseXORComposite.java \
+gnu/java/awt/ComponentDataBlitOp.java \
+gnu/java/awt/ClasspathToolkit.java \
+gnu/java/awt/EmbeddedWindow.java \
+gnu/java/awt/EmbeddedWindowSupport.java \
+gnu/java/awt/EventModifier.java \
+gnu/java/awt/color/CieXyzConverter.java \
+gnu/java/awt/color/ClutProfileConverter.java \
+gnu/java/awt/color/ColorLookUpTable.java \
+gnu/java/awt/color/ColorSpaceConverter.java \
+gnu/java/awt/color/GrayProfileConverter.java \
+gnu/java/awt/color/GrayScaleConverter.java \
+gnu/java/awt/color/LinearRGBConverter.java \
+gnu/java/awt/color/ProfileHeader.java \
+gnu/java/awt/color/PyccConverter.java \
+gnu/java/awt/color/RgbProfileConverter.java \
+gnu/java/awt/color/SrgbConverter.java \
+gnu/java/awt/color/TagEntry.java \
+gnu/java/awt/color/ToneReproductionCurve.java \
+gnu/java/awt/image/ImageDecoder.java \
+gnu/java/awt/image/XBMDecoder.java \
+gnu/java/awt/peer/EmbeddedWindowPeer.java \
+gnu/java/awt/peer/GLightweightPeer.java \
+gnu/java/awt/peer/ClasspathFontPeer.java \
+gnu/java/awt/peer/ClasspathTextLayoutPeer.java \
java/applet/Applet.java \
java/applet/AppletStub.java \
java/applet/AppletContext.java \
@@ -1982,7 +2042,7 @@
gnu/java/rmi/server/UnicastServer.java \
gnu/java/rmi/server/UnicastServerRef.java
-javax_source_files = \
+javax_imageio_source_files = \
javax/imageio/ImageWriteParam.java \
javax/imageio/ImageReader.java \
javax/imageio/ImageWriter.java \
@@ -2028,7 +2088,63 @@
javax/imageio/ImageTranscoder.java \
javax/imageio/ImageTypeSpecifier.java \
javax/imageio/ImageIO.java \
-javax/imageio/IIOImage.java \
+javax/imageio/IIOImage.java
+
+javax_xml_source_files = \
+javax/xml/xpath/XPathConstants.java \
+javax/xml/xpath/XPathFunction.java \
+javax/xml/xpath/XPathVariableResolver.java \
+javax/xml/xpath/XPathExpressionException.java \
+javax/xml/xpath/XPathFunctionResolver.java \
+javax/xml/xpath/XPath.java \
+javax/xml/xpath/XPathFactoryConfigurationException.java \
+javax/xml/xpath/XPathFactory.java \
+javax/xml/xpath/XPathException.java \
+javax/xml/xpath/XPathExpression.java \
+javax/xml/xpath/XPathFunctionException.java \
+javax/xml/validation/ValidatorHandler.java \
+javax/xml/validation/Validator.java \
+javax/xml/validation/TypeInfoProvider.java \
+javax/xml/validation/SchemaFactory.java \
+javax/xml/validation/Schema.java \
+javax/xml/parsers/SAXParserFactory.java \
+javax/xml/parsers/FactoryConfigurationError.java \
+javax/xml/parsers/SAXParser.java \
+javax/xml/parsers/DocumentBuilderFactory.java \
+javax/xml/parsers/ParserConfigurationException.java \
+javax/xml/parsers/DocumentBuilder.java \
+javax/xml/datatype/DatatypeFactory.java \
+javax/xml/datatype/XMLGregorianCalendar.java \
+javax/xml/datatype/Duration.java \
+javax/xml/datatype/DatatypeConfigurationException.java \
+javax/xml/datatype/DatatypeConstants.java \
+javax/xml/XMLConstants.java \
+javax/xml/namespace/NamespaceContext.java \
+javax/xml/namespace/QName.java \
+javax/xml/transform/TransformerException.java \
+javax/xml/transform/TransformerFactoryConfigurationError.java \
+javax/xml/transform/sax/SAXResult.java \
+javax/xml/transform/sax/TransformerHandler.java \
+javax/xml/transform/sax/SAXTransformerFactory.java \
+javax/xml/transform/sax/SAXSource.java \
+javax/xml/transform/sax/TemplatesHandler.java \
+javax/xml/transform/OutputKeys.java \
+javax/xml/transform/stream/StreamResult.java \
+javax/xml/transform/stream/StreamSource.java \
+javax/xml/transform/Source.java \
+javax/xml/transform/SourceLocator.java \
+javax/xml/transform/ErrorListener.java \
+javax/xml/transform/TransformerConfigurationException.java \
+javax/xml/transform/Templates.java \
+javax/xml/transform/Result.java \
+javax/xml/transform/URIResolver.java \
+javax/xml/transform/dom/DOMSource.java \
+javax/xml/transform/dom/DOMLocator.java \
+javax/xml/transform/dom/DOMResult.java \
+javax/xml/transform/Transformer.java \
+javax/xml/transform/TransformerFactory.java
+
+javax_source_files = \
javax/net/VanillaSocketFactory.java \
javax/net/ssl/TrustManagerFactorySpi.java \
javax/net/ssl/SSLKeyException.java \
@@ -2267,58 +2383,6 @@
javax/naming/RefAddr.java \
javax/naming/CompositeName.java \
javax/naming/Name.java \
-javax/xml/xpath/XPathConstants.java \
-javax/xml/xpath/XPathFunction.java \
-javax/xml/xpath/XPathVariableResolver.java \
-javax/xml/xpath/XPathExpressionException.java \
-javax/xml/xpath/XPathFunctionResolver.java \
-javax/xml/xpath/XPath.java \
-javax/xml/xpath/XPathFactoryConfigurationException.java \
-javax/xml/xpath/XPathFactory.java \
-javax/xml/xpath/XPathException.java \
-javax/xml/xpath/XPathExpression.java \
-javax/xml/xpath/XPathFunctionException.java \
-javax/xml/validation/ValidatorHandler.java \
-javax/xml/validation/Validator.java \
-javax/xml/validation/TypeInfoProvider.java \
-javax/xml/validation/SchemaFactory.java \
-javax/xml/validation/Schema.java \
-javax/xml/parsers/SAXParserFactory.java \
-javax/xml/parsers/FactoryConfigurationError.java \
-javax/xml/parsers/SAXParser.java \
-javax/xml/parsers/DocumentBuilderFactory.java \
-javax/xml/parsers/ParserConfigurationException.java \
-javax/xml/parsers/DocumentBuilder.java \
-javax/xml/datatype/DatatypeFactory.java \
-javax/xml/datatype/XMLGregorianCalendar.java \
-javax/xml/datatype/Duration.java \
-javax/xml/datatype/DatatypeConfigurationException.java \
-javax/xml/datatype/DatatypeConstants.java \
-javax/xml/XMLConstants.java \
-javax/xml/namespace/NamespaceContext.java \
-javax/xml/namespace/QName.java \
-javax/xml/transform/TransformerException.java \
-javax/xml/transform/TransformerFactoryConfigurationError.java \
-javax/xml/transform/sax/SAXResult.java \
-javax/xml/transform/sax/TransformerHandler.java \
-javax/xml/transform/sax/SAXTransformerFactory.java \
-javax/xml/transform/sax/SAXSource.java \
-javax/xml/transform/sax/TemplatesHandler.java \
-javax/xml/transform/OutputKeys.java \
-javax/xml/transform/stream/StreamResult.java \
-javax/xml/transform/stream/StreamSource.java \
-javax/xml/transform/Source.java \
-javax/xml/transform/SourceLocator.java \
-javax/xml/transform/ErrorListener.java \
-javax/xml/transform/TransformerConfigurationException.java \
-javax/xml/transform/Templates.java \
-javax/xml/transform/Result.java \
-javax/xml/transform/URIResolver.java \
-javax/xml/transform/dom/DOMSource.java \
-javax/xml/transform/dom/DOMLocator.java \
-javax/xml/transform/dom/DOMResult.java \
-javax/xml/transform/Transformer.java \
-javax/xml/transform/TransformerFactory.java \
javax/security/cert/CertificateNotYetValidException.java \
javax/security/cert/Certificate.java \
javax/security/cert/X509Certificate.java \
@@ -2919,6 +2983,7 @@
gnu/gcj/io/DefaultMimeTypes.java \
gnu/gcj/io/MimeTypes.java \
gnu/gcj/io/SimpleSHSStream.java \
+gnu/gcj/runtime/BootClassLoader.java \
gnu/gcj/runtime/FileDeleter.java \
gnu/gcj/runtime/FinalizerThread.java \
gnu/gcj/runtime/JNIWeakRef.java \
Index: prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.105
diff -u -r1.105 prims.cc
--- prims.cc 10 Mar 2005 19:02:16 -0000 1.105
+++ prims.cc 23 Mar 2005 23:39:25 -0000
@@ -55,6 +55,7 @@
#include <java/lang/OutOfMemoryError.h>
#include <java/lang/System.h>
#include <java/lang/VMThrowable.h>
+#include <java/lang/VMClassLoader.h>
#include <java/lang/reflect/Modifier.h>
#include <java/io/PrintStream.h>
#include <java/lang/UnsatisfiedLinkError.h>
@@ -1130,8 +1131,9 @@
// of VMClassLoader.
_Jv_InitClass (&java::lang::ClassLoader::class$);
- // Set up the system class loader.
+ // Set up the system class loader and the bootstrap class loader.
gnu::gcj::runtime::VMClassLoader::initialize();
+ java::lang::VMClassLoader::initBootLoader(JvNewStringLatin1(TOOLEXECLIBDIR));
_Jv_RegisterBootstrapPackages();
@@ -1209,7 +1211,10 @@
java::lang::System::err->println (JvNewStringLatin1
("Exception during runtime initialization"));
t->printStackTrace();
- runtime->exit (1);
+ if (runtime)
+ runtime->exit (1);
+ // In case the runtime creation failed.
+ ::exit (1);
}
_Jv_AttachCurrentThread (main_thread);
Index: stacktrace.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/stacktrace.cc,v
retrieving revision 1.5
diff -u -r1.5 stacktrace.cc
--- stacktrace.cc 22 Mar 2005 20:52:40 -0000 1.5
+++ stacktrace.cc 23 Mar 2005 23:39:25 -0000
@@ -495,7 +495,7 @@
{
classLoader = frame->klass->getClassLoaderInternal();
#ifdef INTERPRETER
- if (classLoader != NULL && classLoader != ClassLoader::systemClassLoader)
+ if (classLoader != NULL)
{
state->trace_data = (void *) classLoader;
return _URC_NORMAL_STOP;
Index: external/sax/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/external/sax/Makefile.am,v
retrieving revision 1.3
diff -u -r1.3 Makefile.am
--- external/sax/Makefile.am 21 Mar 2005 18:12:27 -0000 1.3
+++ external/sax/Makefile.am 23 Mar 2005 23:39:25 -0000
@@ -5,6 +5,9 @@
# May be used by various substitution variables.
gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+## Needed because $(ZIP) is a relative path.
+MULTIBUILDTOP = ../../
+
## The compiler with whatever flags we want for both -c and -C
## compiles.
GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 -Wno-deprecated -fbootclasspath=$(BOOTCLASSPATH)
@@ -20,18 +23,24 @@
BUILT_SOURCES = classes.stamp
-classes.stamp: $(libsax_convenience_la_SOURCES)
+sax.jar: classes.stamp
+ find org -name '*.class' -print | $(ZIP) -cfME@ $@
+
+classes.stamp: $(source_files)
here=`pwd`; cd $(srcdir); \
- $(GCJ_WITH_FLAGS) -C -d $$here $(libsax_convenience_la_SOURCES)
+ $(GCJ_WITH_FLAGS) -C -d $$here $(source_files)
echo > classes.stamp
mostlyclean-local:
-find . -name '*.class' | xargs rm
- -rm classes.stamp
+ -rm classes.stamp sax.jar
+
+toolexeclib_LTLIBRARIES = libsax-gcj.la
-noinst_LTLIBRARIES = libsax_convenience.la
+libsax_gcj_la_SOURCES = sax.jar
+libsax_gcj_la_GCJFLAGS = -findirect-dispatch
-libsax_convenience_la_SOURCES = \
+source_files = \
org/xml/sax/SAXNotSupportedException.java \
org/xml/sax/helpers/NamespaceSupport.java \
org/xml/sax/helpers/AttributesImpl.java \
Index: external/sax/org/xml/sax/helpers/NamespaceSupport.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/external/sax/org/xml/sax/helpers/NamespaceSupport.java,v
retrieving revision 1.1
diff -u -r1.1 NamespaceSupport.java
--- external/sax/org/xml/sax/helpers/NamespaceSupport.java 2 Feb 2005 00:41:54 -0000 1.1
+++ external/sax/org/xml/sax/helpers/NamespaceSupport.java 23 Mar 2005 23:39:25 -0000
@@ -113,7 +113,8 @@
/**
* An empty enumeration.
*/
- private final static Enumeration EMPTY_ENUMERATION =
+ // GCJ LOCAL: work around gcj bug by making this package-private
+ final static Enumeration EMPTY_ENUMERATION =
new Vector().elements();
Index: external/w3c_dom/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/external/w3c_dom/Makefile.am,v
retrieving revision 1.3
diff -u -r1.3 Makefile.am
--- external/w3c_dom/Makefile.am 21 Mar 2005 18:12:27 -0000 1.3
+++ external/w3c_dom/Makefile.am 23 Mar 2005 23:39:25 -0000
@@ -5,6 +5,9 @@
# May be used by various substitution variables.
gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+## Needed because $(ZIP) is a relative path.
+MULTIBUILDTOP = ../../
+
## The compiler with whatever flags we want for both -c and -C
## compiles.
GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 -Wno-deprecated -fbootclasspath=$(BOOTCLASSPATH)
@@ -20,18 +23,24 @@
BUILT_SOURCES = classes.stamp
-classes.stamp: $(libw3c_convenience_la_SOURCES)
+w3c.jar: classes.stamp
+ find org -name '*.class' -print | $(ZIP) -cfME@ $@
+
+classes.stamp: $(source_files)
here=`pwd`; cd $(srcdir); \
- $(GCJ_WITH_FLAGS) -C -d $$here $(libw3c_convenience_la_SOURCES)
+ $(GCJ_WITH_FLAGS) -C -d $$here $(source_files)
echo > classes.stamp
mostlyclean-local:
-find . -name '*.class' | xargs rm
- -rm classes.stamp
+ -rm classes.stamp w3c.jar
+
+toolexeclib_LTLIBRARIES = libw3c-gcj.la
-noinst_LTLIBRARIES = libw3c_convenience.la
+libw3c_gcj_la_SOURCES = w3c.jar
+libw3c_gcj_la_GCJFLAGS = -findirect-dispatch
-libw3c_convenience_la_SOURCES = \
+source_files = \
org/w3c/dom/xpath/XPathNamespace.java \
org/w3c/dom/xpath/XPathResult.java \
org/w3c/dom/xpath/XPathException.java \
Index: gnu/gcj/runtime/BootClassLoader.java
===================================================================
RCS file: gnu/gcj/runtime/BootClassLoader.java
diff -N gnu/gcj/runtime/BootClassLoader.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/gcj/runtime/BootClassLoader.java 23 Mar 2005 23:39:26 -0000
@@ -0,0 +1,102 @@
+/* Copyright (C) 2005 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.runtime;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.StringTokenizer;
+
+/**
+ * This is a helper for the bootstrap class loader. It is a
+ * URLClassLoader so that we can read a class path and re-use all the
+ * existing code for finding classes, extracting them from jars, etc.
+ * However, it is never called the way that an ordinary ClassLoader is
+ * called. For instance, loadClass() is never used.
+ */
+public final class BootClassLoader extends URLClassLoader
+{
+ BootClassLoader(String libdir)
+ {
+ super(new URL[0]);
+
+ // Add the contents of the endorsed directories.
+ StringTokenizer st
+ = new StringTokenizer (System.getProperty ("java.endorsed.dirs", ""),
+ File.pathSeparator);
+ try
+ {
+ while (st.hasMoreElements ())
+ {
+ String dirname = st.nextToken ();
+ File dir = new File (dirname);
+ if (dir.exists ())
+ {
+ if (! dirname.endsWith (File.separator))
+ dirname = dirname + File.separator;
+ String files[] = dir.list (new FilenameFilter ()
+ {
+ public boolean accept (File dir, String name)
+ {
+ return name.endsWith (".jar") || name.endsWith (".zip");
+ }
+ });
+ for (int i = files.length - 1; i >= 0; i--)
+ addURL(new URL("file", "", -1, dirname + files[i]));
+ }
+ }
+
+ String w3clib = (libdir + File.separator
+ + System.mapLibraryName ("w3c-gcj"));
+ addURL(new URL("gcjlib", "", -1, w3clib));
+ String saxlib = (libdir + File.separator
+ + System.mapLibraryName ("sax-gcj"));
+ addURL(new URL("gcjlib", "", -1, saxlib));
+ }
+ catch (java.net.MalformedURLException x)
+ {
+ // This should never happen.
+ throw new RuntimeException(x);
+ }
+ }
+
+ public Class bootLoadClass(String name)
+ throws ClassNotFoundException
+ {
+ Class c = findLoadedClass(name);
+ if (c == null)
+ {
+ try
+ {
+ // We could hack URLClassLoader to make this more
+ // efficient, if it mattered.
+ c = findClass(name);
+ }
+ catch (ClassNotFoundException _)
+ {
+ c = null;
+ }
+ }
+ return c;
+ }
+
+ public URL bootGetResource(String name)
+ {
+ return findResource(name);
+ }
+
+ public Enumeration bootGetResources(String name) throws IOException
+ {
+ return findResources(name);
+ }
+}
Index: java/lang/VMClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/VMClassLoader.java,v
retrieving revision 1.14
diff -u -r1.14 VMClassLoader.java
--- java/lang/VMClassLoader.java 10 Mar 2005 19:02:19 -0000 1.14
+++ java/lang/VMClassLoader.java 23 Mar 2005 23:39:29 -0000
@@ -53,6 +53,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
+import gnu.gcj.runtime.BootClassLoader;
/**
* java.lang.VMClassLoader is a package-private helper for VMs to implement
@@ -82,6 +83,10 @@
static final HashMap definedPackages = new HashMap();
+ // This is a helper for handling java.endorsed.dirs. It is null
+ // until we've initialized the system, at which point it is created.
+ static BootClassLoader bootLoader;
+
/**
* Helper to define a class using a string of bytes. This assumes that
* the security checks have already been performed, if necessary.
@@ -153,6 +158,8 @@
*/
static URL getResource(String name)
{
+ if (bootLoader != null)
+ return bootLoader.bootGetResource(name);
return null;
}
@@ -168,6 +175,8 @@
*/
static Enumeration getResources(String name) throws IOException
{
+ if (bootLoader != null)
+ return bootLoader.bootGetResources(name);
return EmptyEnumeration.getInstance();
}
@@ -287,6 +296,8 @@
static native ClassLoader getSystemClassLoaderInternal();
+ static native void initBootLoader(String libdir);
+
static ClassLoader getSystemClassLoader()
{
// This method is called as the initialization of systemClassLoader,
@@ -310,6 +321,7 @@
+ loader, ex);
}
}
+
return default_sys;
}
}
Index: java/lang/natClass.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClass.cc,v
retrieving revision 1.86
diff -u -r1.86 natClass.cc
--- java/lang/natClass.cc 11 Mar 2005 04:30:19 -0000 1.86
+++ java/lang/natClass.cc 23 Mar 2005 23:39:29 -0000
@@ -126,16 +126,16 @@
s->checkPermission (new RuntimePermission (JvNewStringLatin1 ("getClassLoader")));
}
- // The spec requires us to return `null' for primitive classes. In
- // other cases we have the option of returning `null' for classes
- // loaded with the bootstrap loader. All gcj-compiled classes which
- // are linked into the application used to return `null' here, but
- // that confuses some poorly-written applications. It is a useful
- // and apparently harmless compatibility hack to simply never return
- // `null' instead.
- if (isPrimitive ())
- return NULL;
- return loader ? loader : ClassLoader::systemClassLoader;
+ // This particular 'return' has been changed a couple of times over
+ // libgcj's history. This particular approach is a little weird,
+ // because it means that all classes linked into the application
+ // will see NULL for their class loader. This may confuse some
+ // applications that aren't expecting this; the solution is to use a
+ // different linking model for these applications. In the past we
+ // returned the system class loader in this case, but that is
+ // incorrect. Also, back then we didn't have other linkage models
+ // to fall back on.
+ return loader;
}
java::lang::reflect::Constructor *
Index: java/lang/natClassLoader.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClassLoader.cc,v
retrieving revision 1.77
diff -u -r1.77 natClassLoader.cc
--- java/lang/natClassLoader.cc 9 Mar 2005 20:58:17 -0000 1.77
+++ java/lang/natClassLoader.cc 23 Mar 2005 23:39:29 -0000
@@ -43,6 +43,7 @@
#include <java/io/Serializable.h>
#include <java/lang/Cloneable.h>
#include <java/util/HashMap.h>
+#include <gnu/gcj/runtime/BootClassLoader.h>
// Size of local hash table.
#define HASH_LEN 1013
@@ -106,7 +107,7 @@
_Jv_RegisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader)
{
if (! loader)
- loader = java::lang::ClassLoader::systemClassLoader;
+ loader = java::lang::VMClassLoader::bootLoader;
loader->loadedClasses->put(klass->name->toString(), klass);
}
@@ -116,7 +117,7 @@
_Jv_UnregisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader)
{
if (! loader)
- loader = java::lang::ClassLoader::systemClassLoader;
+ loader = java::lang::VMClassLoader::bootLoader;
loader->loadedClasses->remove(klass->name->toString());
}
@@ -211,13 +212,14 @@
// See if the class was already loaded by this loader. This handles
// initiating loader checks, as we register classes with their
// initiating loaders.
- java::lang::ClassLoader *sys = java::lang::ClassLoader::systemClassLoader;
+
+ java::lang::ClassLoader *boot = java::lang::VMClassLoader::bootLoader;
java::lang::ClassLoader *real = loader;
if (! real)
- real = sys;
+ real = boot;
jstring sname = name->toString();
// We might still be bootstrapping the VM, in which case there
- // won't be a system class loader yet.
+ // won't be a bootstrap class loader yet.
jclass klass = real ? real->findLoadedClass (sname) : NULL;
if (! klass)
@@ -230,16 +232,16 @@
// If "loader" delegated the loadClass operation to another
// loader, explicitly register that it is also an initiating
// loader of the given class.
- java::lang::ClassLoader *delegate = (loader == sys
+ java::lang::ClassLoader *delegate = (loader == boot
? NULL
: loader);
if (klass && klass->getClassLoaderInternal () != delegate)
_Jv_RegisterInitiatingLoader (klass, loader);
}
- else if (sys)
+ else if (boot)
{
// Load using the bootstrap loader jvmspec 5.3.1.
- klass = sys->loadClass (sname, false);
+ klass = java::lang::VMClassLoader::loadClass (sname, false);
// Register that we're an initiating loader.
if (klass)
@@ -250,9 +252,21 @@
// Not even a bootstrap loader, try the built-in cache.
klass = _Jv_FindClassInCache (name);
- if (bootstrap_index == BOOTSTRAP_CLASS_LIST_SIZE)
- abort ();
- bootstrap_class_list[bootstrap_index++] = klass;
+ bool found = false;
+ for (int i = 0; i < bootstrap_index; ++i)
+ {
+ if (bootstrap_class_list[i] == klass)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (! found)
+ {
+ if (bootstrap_index == BOOTSTRAP_CLASS_LIST_SIZE)
+ abort ();
+ bootstrap_class_list[bootstrap_index++] = klass;
+ }
}
}
else
Index: java/lang/natVMClassLoader.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natVMClassLoader.cc,v
retrieving revision 1.7
diff -u -r1.7 natVMClassLoader.cc
--- java/lang/natVMClassLoader.cc 9 Mar 2005 20:58:17 -0000 1.7
+++ java/lang/natVMClassLoader.cc 23 Mar 2005 23:39:30 -0000
@@ -25,6 +25,7 @@
#include <java/lang/VMCompiler.h>
#include <gnu/gcj/runtime/VMClassLoader.h>
#include <gnu/gcj/runtime/SystemClassLoader.h>
+#include <gnu/gcj/runtime/BootClassLoader.h>
#include <java/lang/ClassLoader.h>
#include <java/lang/Class.h>
#include <java/lang/Throwable.h>
@@ -66,9 +67,9 @@
// until we're done loading.
JvSynchronize sync (klass);
- // Record the defining loader. For the system class loader, we
- // record NULL.
- if (loader != java::lang::ClassLoader::systemClassLoader)
+ // Record the defining loader. For the bootstrap class loader,
+ // we record NULL.
+ if (loader != bootLoader)
klass->loader = loader;
if (name != 0)
@@ -122,11 +123,25 @@
return _Jv_FindClassFromSignature (sig, NULL);
}
+void
+java::lang::VMClassLoader::initBootLoader(jstring libdir)
+{
+ bootLoader = new gnu::gcj::runtime::BootClassLoader(libdir);
+}
+
jclass
java::lang::VMClassLoader::loadClass(jstring name, jboolean resolve)
{
- _Jv_Utf8Const *utf = _Jv_makeUtf8Const (name);
- jclass klass = _Jv_FindClassInCache (utf);
+ // We try the boot loader first, so that the endorsed directory
+ // overrides compiled-in classes.
+ jclass klass = NULL;
+ if (bootLoader)
+ klass = bootLoader->bootLoadClass(name);
+ if (! klass)
+ {
+ _Jv_Utf8Const *utf = _Jv_makeUtf8Const (name);
+ klass = _Jv_FindClassInCache (utf);
+ }
if (klass)
{
// We never want to return a class without its supers linked.