[Patch][RFC] Introduction of gnu.classpath.SystemProperties

Michael Koch konqueror@gmx.de
Fri Apr 22 07:04:00 GMT 2005


Hi list,


In GNU classpath a class called gnu.classpath.SystemProperties was
introduced some time ago. It handles all stuff regarding properties that
get set at startup. This put it all into one place. Before it was partly
in java.lang.Runtime and partly in java.lang.System.

I mainly merged the patch from GNU classpath and ported it to GCJ HEAD
to be able to merge patches depending on this into libgcj later.

I did a whole bootstrap and mauve run with it and saw no new regressions
with it.

What do you think? Is it okay for trunk?


Michael


2005-02-19  Archie Cobbs  <archie@dellroad.org>

	* java/lang/Throwable.java: simplify initializing cause in constructor

2005-04-22  Michael Koch  <konqueror@gmx.de>

	* gnu/classpath/SystemProperties.java: New file.
	* gnu/classpath/natSystemProperties.cc: New file.
	* java/lang/Runtime.java
	(defaultProperties): Removed.
	(static): Likewise.
	(): Made thrown exceptions more verbose.
	(insertSystemProperties): Removed.
	* java/lang/System.java
	(static): Likewise.
	(properties): Likewise.
	(setSecurityManager): Reordered modifiers.
	(getenv): Improved javadoc.
	(): Likewise.
	(isWordsBigEndian): Removed.
	* java/lang/natRuntime.cc
	(_Jv_SetDLLSearchPath): Likewise.
	(file_encoding): Likewise.
	(default_file_encoding): Likewise.
	(getpwuid_adaptor): Likewise.
	(insertSystemProperties): Likewise.
	* java/lang/natSystem.cc
	(isWordsBigEndian): Likewise.
	* Makefile.am
	(ordinary_java_source_files):
	Added gnu/classpath/SystemProperties.java.
	(nat_source_files): Added gnu/classpath/natSystemProperties.cc.
	* Makefile.in: Regenerated.

-------------- next part --------------
Index: gnu/classpath/SystemProperties.java
===================================================================
RCS file: gnu/classpath/SystemProperties.java
diff -N gnu/classpath/SystemProperties.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/SystemProperties.java	22 Apr 2005 06:58:44 -0000
@@ -0,0 +1,158 @@
+/* SystemProperties.java -- Manage the System properties.
+   Copyright (C) 2004, 2005 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath;
+
+import java.util.Properties;
+
+/**
+ * The class manages the System properties. This class is only available to
+ * privileged code (i.e. code loaded by the bootstrap class loader) and
+ * therefore doesn't do any security checks.
+ * This class is separated out from java.lang.System to simplify bootstrap
+ * dependencies and to allow trusted code a simple and efficient mechanism
+ * to access the system properties.
+ */
+public class SystemProperties
+{
+  /**
+   * Stores the current system properties. This can be modified by
+   * {@link #setProperties(Properties)}, but will never be null, because
+   * setProperties(null) sucks in the default properties.
+   */
+  private static Properties properties;
+
+  /**
+   * The default properties. Once the default is stabilized,
+   * it should not be modified;
+   * instead it is cloned when calling <code>setProperties(null)</code>.
+   */
+  private static final Properties defaultProperties = new Properties();
+
+  private static native void insertSystemProperties(Properties properties);
+
+  static
+  {
+    insertSystemProperties(defaultProperties);
+
+    // Set base URL if not already set.
+    if (defaultProperties.get("gnu.classpath.home.url") == null)
+      defaultProperties.put("gnu.classpath.home.url",
+			    "file://"
+			    + defaultProperties.get("gnu.classpath.home")
+	                    + "/lib");
+
+    // Set short name if not already set.
+    if (defaultProperties.get("gnu.classpath.vm.shortname") == null)
+      {
+	String value = defaultProperties.getProperty("java.vm.name");
+	int index = value.lastIndexOf(' ');
+	if (index != -1)
+	  value = value.substring(index + 1);
+	defaultProperties.put("gnu.classpath.vm.shortname", value);
+      }
+
+    // Network properties
+    if (defaultProperties.get("http.agent") == null)
+      {
+	String userAgent = ("gnu-classpath/"
+	                    + defaultProperties.getProperty("gnu.classpath.version")
+	                    + " ("
+	                    + defaultProperties.getProperty("gnu.classpath.vm.shortname")
+	                    + "/"
+	                    + defaultProperties.getProperty("java.vm.version")
+	                    + ")");
+	 defaultProperties.put("http.agent", userAgent);
+      }
+
+    defaultProperties.put("gnu.cpu.endian",
+			  isWordsBigEndian() ? "big" : "little");
+
+    // GCJ LOCAL: Classpath sets common encoding aliases here.
+    // Since we don't (yet) have gnu.java.io.EncodingManager, these
+    // are a waste of time and just slow down system startup.
+
+    // XXX FIXME - Temp hack for old systems that set the wrong property
+    if (defaultProperties.get("java.io.tmpdir") == null)
+      defaultProperties.put("java.io.tmpdir",
+                            defaultProperties.get("java.tmpdir"));
+
+    // Note that we use clone here and not new.  Some programs assume
+    // that the system properties do not have a parent.
+    properties = (Properties) defaultProperties.clone();
+  }
+
+  public static String getProperty(String name)
+  {
+    return properties.getProperty(name);
+  }
+
+  public static String getProperty(String name, String defaultValue)
+  {
+    return properties.getProperty(name, defaultValue);
+  }
+
+  public static String setProperty(String name, String value)
+  {
+    return (String) properties.setProperty(name, value);
+  }
+
+  public static Properties getProperties()
+  {
+    return properties;
+  }
+
+  public static void setProperties(Properties properties)
+  {
+    if (properties == null)
+      {
+        // Note that we use clone here and not new.  Some programs
+        // assume that the system properties do not have a parent.
+        properties = (Properties)defaultProperties.clone();
+      }
+
+    SystemProperties.properties = properties;
+  }
+
+  /**
+   * Detect big-endian systems.
+   *
+   * @return true if the system is big-endian.
+   */
+  private static native boolean isWordsBigEndian();
+}
Index: gnu/classpath/natSystemProperties.cc
===================================================================
RCS file: gnu/classpath/natSystemProperties.cc
diff -N gnu/classpath/natSystemProperties.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/natSystemProperties.cc	22 Apr 2005 06:58:44 -0000
@@ -0,0 +1,390 @@
+// natSystemProperties.cc - Implementation of native side of
+// SystemProperties class.
+
+/* 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.  */
+
+#include <config.h>
+#include <platform.h>
+
+#include <stdlib.h>
+#include <errno.h>
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_UNAME
+#include <sys/utsname.h>
+#endif
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include <gcj/cni.h>
+#include <jvm.h>
+#include <java-props.h>
+#include <gnu/classpath/SystemProperties.h>
+#include <java/lang/String.h>
+#include <jni.h>
+
+#ifdef USE_LTDL
+#include <ltdl.h>
+
+void
+_Jv_SetDLLSearchPath (const char *path)
+{
+  lt_dlsetsearchpath (path);
+}
+
+#else
+
+void
+_Jv_SetDLLSearchPath (const char *)
+{
+  // Nothing.
+}
+
+#endif /* USE_LTDL */
+
+#if ! defined (DEFAULT_FILE_ENCODING) && defined (HAVE_ICONV) \
+    && defined (HAVE_NL_LANGINFO)
+
+static char *
+file_encoding ()
+{
+  setlocale (LC_CTYPE, "");
+  char *e = nl_langinfo (CODESET);
+  if (e == NULL || *e == '\0')
+    e = "8859_1";
+  return e;
+}
+
+#define DEFAULT_FILE_ENCODING file_encoding ()
+
+#endif
+
+#ifndef DEFAULT_FILE_ENCODING
+#define DEFAULT_FILE_ENCODING "8859_1"
+#endif
+
+static char *default_file_encoding = DEFAULT_FILE_ENCODING;
+
+#if HAVE_GETPWUID_R
+/* Use overload resolution to find out the signature of getpwuid_r.  */
+
+  /* This is Posix getpwuid_r.  */
+template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+static inline int
+getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
+				   T_buf *buf_r, T_len len_r,
+				   T_passwd **pwd_entry_ptr),
+		 uid_t user_id, struct passwd *pwd_r,
+		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
+{
+  return getpwuid_r (user_id, pwd_r, buf_r, len_r, pwd_entry);
+}
+
+/* This is used on HPUX 10.20 */
+template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+static inline int
+getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
+				   T_buf *buf_r, T_len len_r),
+		 uid_t user_id, struct passwd *pwd_r,
+		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
+{
+  return getpwuid_r (user_id, pwd_r, buf_r, len_r);
+}
+
+/* This is used on IRIX 5.2.  */
+template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
+static inline int
+getpwuid_adaptor(T_passwd * (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
+					  T_buf *buf_r, T_len len_r),
+		 uid_t user_id, struct passwd *pwd_r,
+		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
+{
+  *pwd_entry = getpwuid_r (user_id, pwd_r, buf_r, len_r);
+  return (*pwd_entry == NULL) ? errno : 0;
+}
+#endif
+
+void
+gnu::classpath::SystemProperties::insertSystemProperties (java::util::Properties *newprops)
+{
+  // A convenience define.
+#define SET(Prop,Val) \
+	newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val))
+
+  // A mixture of the Java Product Versioning Specification
+  // (introduced in 1.2), and earlier versioning properties.  Some
+  // programs rely on seeing values that they expect, so we claim to
+  // be a 1.4-ish VM for their sake.
+  SET ("java.version", JV_VERSION);
+  SET ("java.runtime.version", JV_VERSION);
+  SET ("java.vendor", "Free Software Foundation, Inc.");
+  SET ("java.vendor.url", "http://gcc.gnu.org/java/");
+  SET ("java.class.version", "46.0");
+  SET ("java.vm.specification.version", "1.0");
+  SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification");
+  SET ("java.vm.specification.vendor", "Sun Microsystems Inc.");
+  SET ("java.vm.version", __VERSION__);
+  SET ("java.vm.vendor", "Free Software Foundation, Inc.");
+  SET ("java.vm.name", "GNU libgcj");
+  SET ("java.specification.version", JV_API_VERSION);
+  SET ("java.specification.name", "Java(tm) Platform API Specification");
+  SET ("java.specification.vendor", "Sun Microsystems Inc.");
+
+  char value[100];
+#define NAME "GNU libgcj "
+  strcpy (value, NAME);
+  strncpy (value + sizeof (NAME) - 1, __VERSION__,
+	   sizeof(value) - sizeof(NAME));
+  value[sizeof (value) - 1] = '\0';
+  jstring version = JvNewStringLatin1 (value);
+  newprops->put (JvNewStringLatin1 ("java.fullversion"), version);
+  newprops->put (JvNewStringLatin1 ("java.vm.info"), version);
+
+  // This definition is rather arbitrary: we choose $(prefix).  In
+  // part we do this because most people specify only --prefix and
+  // nothing else when installing gcj.  Plus, people are free to
+  // redefine `java.home' with `-D' if necessary.
+  SET ("java.home", JAVA_HOME);
+  SET ("gnu.classpath.home", PREFIX);
+  // This is set to $(libdir) because we use this to find .security
+  // files at runtime.
+  char val2[sizeof ("file://") + sizeof (LIBDIR) + 1];
+  strcpy (val2, "file://");
+  strcat (val2, LIBDIR);
+  SET ("gnu.classpath.home.url", val2);
+
+  SET ("file.encoding", default_file_encoding);
+
+#ifdef HAVE_UNAME
+  struct utsname u;
+  if (! uname (&u))
+    {
+      SET ("os.name", u.sysname);
+      SET ("os.version", u.release);
+
+      // Normalize x86 architecture names to "i386" (except on Windows, which 
+      // is handled in win32.cc).
+      if (u.machine[0] == 'i'
+	  && u.machine[1] != 0
+	  && u.machine[2] == '8'
+	  && u.machine[3] == '6'
+	  && u.machine[4] == 0)
+	SET ("os.arch", "i386");
+      else
+	SET ("os.arch", u.machine);
+    }
+  else
+    {
+      SET ("os.name", "unknown");
+      SET ("os.arch", "unknown");
+      SET ("os.version", "unknown");
+    }
+#endif /* HAVE_UNAME */
+
+#ifndef NO_GETUID
+#ifdef HAVE_PWD_H
+  uid_t user_id = getuid ();
+  struct passwd *pwd_entry;
+
+#ifdef HAVE_GETPWUID_R
+  struct passwd pwd_r;
+  size_t len_r = 200;
+  char *buf_r = (char *) _Jv_AllocBytes (len_r);
+
+  while (buf_r != NULL)
+    {
+      int r = getpwuid_adaptor (getpwuid_r, user_id, &pwd_r,
+				buf_r, len_r, &pwd_entry);
+      if (r == 0)
+	break;
+      else if (r != ERANGE)
+	{
+	  pwd_entry = NULL;
+	  break;
+	}
+      len_r *= 2;
+      buf_r = (char *) _Jv_AllocBytes (len_r);
+    }
+#else
+  pwd_entry = getpwuid (user_id);
+#endif /* HAVE_GETPWUID_R */
+
+  if (pwd_entry != NULL)
+    {
+      SET ("user.name", pwd_entry->pw_name);
+      SET ("user.home", pwd_entry->pw_dir);
+    }
+#endif /* HAVE_PWD_H */
+#endif /* NO_GETUID */
+
+#ifdef HAVE_GETCWD
+#ifdef HAVE_UNISTD_H
+  /* Use getcwd to set "user.dir". */
+  int buflen = 250;
+  char *buffer = (char *) malloc (buflen);
+  while (buffer != NULL)
+    {
+      if (getcwd (buffer, buflen) != NULL)
+	{
+	  SET ("user.dir", buffer);
+	  break;
+	}
+      if (errno != ERANGE)
+	break;
+      buflen = 2 * buflen;
+      buffer = (char *) realloc (buffer, buflen);
+    }
+  if (buffer != NULL)
+    free (buffer);
+#endif /* HAVE_UNISTD_H */
+#endif /* HAVE_GETCWD */
+
+  // Set user locale properties based on setlocale()
+#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
+  // We let the user choose the locale.  However, since Java differs
+  // from POSIX, we arbitrarily pick LC_MESSAGES as determining the
+  // Java locale.  We can't use LC_ALL because it might return a full
+  // list of all the settings.  If we don't have LC_MESSAGES then we
+  // just default to `en_US'.
+  setlocale (LC_ALL, "");
+  char *locale = setlocale (LC_MESSAGES, "");
+  if (locale && strlen (locale) >= 2)
+    {
+      char buf[3];
+      buf[2] = '\0';
+      // copy the first two chars to user.language
+      strncpy (buf, locale, 2);
+      SET ("user.language", buf);
+      // if the next char is a '_', copy the two after that to user.region
+      locale += 2;
+      if (locale[0] == '_')
+        {
+	  locale++;
+	  strncpy (buf, locale, 2);
+	  SET ("user.region", buf);
+        }
+    }
+  else
+#endif /* HAVE_SETLOCALE and HAVE_LC_MESSAGES */
+    {
+      SET ("user.language", "en");
+      SET ("user.region", "US");
+    }  
+
+  // The java extensions directory.
+  SET ("java.ext.dirs", JAVA_EXT_DIRS);
+
+  // The endorsed directories that libgcj knows about by default.
+  // This is a way to get other jars into the boot class loader
+  // without overriding java.endorsed.dirs.
+  SET ("gnu.gcj.runtime.endorsed.dirs", GCJ_ENDORSED_DIRS);
+
+  // The path to libgcj's boot classes
+  SET ("sun.boot.class.path", BOOT_CLASS_PATH);
+
+  // If there is a default system database, set it.
+  SET ("gnu.gcj.precompiled.db.path", LIBGCJ_DEFAULT_DATABASE);
+
+  // Set some properties according to whatever was compiled in with
+  // `-D'.  Important: after this point, the only properties that
+  // should be set are those which either the user cannot meaningfully
+  // override, or which augment whatever value the user has provided.
+  for (int i = 0; i < _Jv_Properties_Count; ++i)
+    {
+      const char *s, *p;
+      // Find the `='.
+      for (s = p = _Jv_Compiler_Properties[i]; *s && *s != '='; ++s)
+	;
+      jstring name = JvNewStringLatin1 (p, s - p);
+      jstring val = JvNewStringLatin1 (*s == '=' ? s + 1 : s);
+      newprops->put (name, val);
+    }
+
+  // Set the system properties from the user's environment.
+#ifndef DISABLE_GETENV_PROPERTIES
+  if (_Jv_Environment_Properties)
+    {
+      size_t i = 0;
+
+      while (_Jv_Environment_Properties[i].key)
+	{
+	  SET (_Jv_Environment_Properties[i].key, 
+	       _Jv_Environment_Properties[i].value);
+	  i++;
+	}
+    }
+#endif
+
+  // The name used to invoke this process (argv[0] in C).
+  SET ("gnu.gcj.progname", _Jv_GetSafeArg (0));
+
+  // Allow platform specific settings and overrides.
+  _Jv_platform_initProperties (newprops);
+
+  // If java.library.path is set, tell libltdl so we search the new
+  // directories as well.  FIXME: does this work properly on Windows?
+  ::java::lang::String *path = newprops->getProperty(JvNewStringLatin1("java.library.path"));
+  if (path)
+    {
+      char *val = (char *) _Jv_Malloc (JvGetStringUTFLength (path) + 1);
+      jsize total = JvGetStringUTFRegion (path, 0, path->length(), val);
+      val[total] = '\0';
+      _Jv_SetDLLSearchPath (val);
+      _Jv_Free (val);
+    }
+  else
+    {
+      // Set a value for user code to see.
+      // FIXME: JDK sets this to the actual path used, including
+      // LD_LIBRARY_PATH, etc.
+      SET ("java.library.path", "");
+    }
+
+  // If java.class.path is still not set then set it according to the
+  // CLASSPATH environment variable if given.  See gij.cc main () and
+  // prims.cc _Jv_CreateJavaVM () for all the ways this could have
+  // been set much earlier.
+  // If CLASSPATH isn't set or if the path is empty fall back to "."
+  path = newprops->getProperty(JvNewStringLatin1("java.class.path"));
+  if (!path)
+    {
+      char *classpath = getenv("CLASSPATH");
+      if (classpath && classpath[0] != 0)
+	{
+	  path = JvNewStringLatin1 (classpath);
+	  newprops->put(JvNewStringLatin1 ("java.class.path"), path);
+	}
+    }
+
+  if (!path || path->length() == 0)
+    SET ("java.class.path", ".");
+}
+
+jboolean
+gnu::classpath::SystemProperties::isWordsBigEndian (void)
+{
+  union
+  {
+    long lval;
+    char cval;
+  } u;
+
+  u.lval = 1;
+  return u.cval == 0;
+}
+
Index: java/lang/Runtime.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Runtime.java,v
retrieving revision 1.19
diff -u -r1.19 Runtime.java
--- java/lang/Runtime.java	17 Feb 2005 07:48:33 -0000	1.19
+++ java/lang/Runtime.java	22 Apr 2005 06:58:45 -0000
@@ -1,5 +1,5 @@
 /* Runtime.java -- access to the VM process
-   Copyright (C) 1998, 2002, 2003, 2004 Free Software Foundation
+   Copyright (C) 1998, 2002, 2003, 2004, 2005 Free Software Foundation
 
 This file is part of GNU Classpath.
 
@@ -38,13 +38,14 @@
 
 package java.lang;
 
+import gnu.classpath.SystemProperties;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -73,49 +74,6 @@
   static SecurityManager securityManager;
 
   /**
-   * The default properties defined by the system. This is likewise located
-   * here instead of in Runtime, to avoid bootstrap issues; it is package
-   * visible to avoid overhead in java.lang. Note that System will add a
-   * few more properties to this collection, but that after that, it is
-   * treated as read-only.
-   *
-   * No matter what class you start initialization with, it defers to the
-   * superclass, therefore Object.<clinit> will be the first Java code
-   * executed. From there, the bootstrap sequence, up to the point that
-   * native libraries are loaded (as of March 24, when I traced this
-   * manually) is as follows:
-   *
-   * Object.<clinit> uses a String literal, possibly triggering initialization
-   *  String.<clinit> calls WeakHashMap.<init>, triggering initialization
-   *   AbstractMap, WeakHashMap, WeakHashMap$1 have no dependencies
-   *  String.<clinit> calls CaseInsensitiveComparator.<init>, triggering
-   *      initialization
-   *   CaseInsensitiveComparator has no dependencies
-   * Object.<clinit> calls System.loadLibrary, triggering initialization
-   *  System.<clinit> calls System.loadLibrary
-   *  System.loadLibrary calls Runtime.getRuntime, triggering initialization
-   *   Runtime.<clinit> calls Properties.<init>, triggering initialization
-   *    Dictionary, Hashtable, and Properties have no dependencies
-   *   Runtime.<clinit> calls VMRuntime.insertSystemProperties, triggering
-   *      initialization of VMRuntime; the VM must make sure that there are
-   *      not any harmful dependencies
-   *   Runtime.<clinit> calls Runtime.<init>
-   *    Runtime.<init> calls StringTokenizer.<init>, triggering initialization
-   *     StringTokenizer has no dependencies
-   *  System.loadLibrary calls Runtime.loadLibrary
-   *   Runtime.loadLibrary should be able to load the library, although it
-   *       will probably set off another string of initializations from
-   *       ClassLoader first
-   */
-  static Properties defaultProperties = new Properties();
-
-  static
-  {
-    init();
-    insertSystemProperties(defaultProperties);
-  }
-
-  /**
    * The thread that started the exit sequence. Access to this field must
    * be thread-safe; lock on libpath to avoid deadlock with user code.
    * <code>runFinalization()</code> may want to look at this to see if ALL
@@ -134,8 +92,7 @@
   private boolean finalizeOnExit;
 
   /**
-   * The one and only runtime instance. This must appear after the default
-   * properties have been initialized by the VM.
+   * The one and only runtime instance.
    */
   private static final Runtime current = new Runtime();
 
@@ -146,12 +103,11 @@
   {
     if (current != null)
       throw new InternalError("Attempt to recreate Runtime");
-
+    
     // We don't use libpath in the libgcj implementation.  We still
     // set it to something to allow the various synchronizations to
     // work.
     libpath = new String[0];
-
   }
 
   /**
@@ -322,15 +278,15 @@
     if (sm != null)
       sm.checkPermission(new RuntimePermission("shutdownHooks"));
     if (hook.isAlive() || hook.getThreadGroup() == null)
-      throw new IllegalArgumentException();
+      throw new IllegalArgumentException("The hook thread " + hook + " must not have been already run or started");
     synchronized (libpath)
       {
         if (exitSequence != null)
-          throw new IllegalStateException();
+          throw new IllegalStateException("The Virtual Machine is exiting. It is not possible anymore to add any hooks");
         if (shutdownHooks == null)
           shutdownHooks = new HashSet(); // Lazy initialization.
         if (! shutdownHooks.add(hook))
-          throw new IllegalArgumentException();
+          throw new IllegalArgumentException(hook.toString() + " had already been inserted");
       }
   }
 
@@ -740,48 +696,4 @@
    */
   native Process execInternal(String[] cmd, String[] env, File dir)
     throws IOException;
-    
-
-  /**
-   * Get the system properties. This is done here, instead of in System,
-   * because of the bootstrap sequence. Note that the native code should
-   * not try to use the Java I/O classes yet, as they rely on the properties
-   * already existing. The only safe method to use to insert these default
-   * system properties is {@link Properties#setProperty(String, String)}.
-   *
-   * <p>These properties MUST include:
-   * <dl>
-   * <dt>java.version         <dd>Java version number
-   * <dt>java.vendor          <dd>Java vendor specific string
-   * <dt>java.vendor.url      <dd>Java vendor URL
-   * <dt>java.home            <dd>Java installation directory
-   * <dt>java.vm.specification.version <dd>VM Spec version
-   * <dt>java.vm.specification.vendor  <dd>VM Spec vendor
-   * <dt>java.vm.specification.name    <dd>VM Spec name
-   * <dt>java.vm.version      <dd>VM implementation version
-   * <dt>java.vm.vendor       <dd>VM implementation vendor
-   * <dt>java.vm.name         <dd>VM implementation name
-   * <dt>java.specification.version    <dd>Java Runtime Environment version
-   * <dt>java.specification.vendor     <dd>Java Runtime Environment vendor
-   * <dt>java.specification.name       <dd>Java Runtime Environment name
-   * <dt>java.class.version   <dd>Java class version number
-   * <dt>java.class.path      <dd>Java classpath
-   * <dt>java.library.path    <dd>Path for finding Java libraries
-   * <dt>java.io.tmpdir       <dd>Default temp file path
-   * <dt>java.compiler        <dd>Name of JIT to use
-   * <dt>java.ext.dirs        <dd>Java extension path
-   * <dt>os.name              <dd>Operating System Name
-   * <dt>os.arch              <dd>Operating System Architecture
-   * <dt>os.version           <dd>Operating System Version
-   * <dt>file.separator       <dd>File separator ("/" on Unix)
-   * <dt>path.separator       <dd>Path separator (":" on Unix)
-   * <dt>line.separator       <dd>Line separator ("\n" on Unix)
-   * <dt>user.name            <dd>User account name
-   * <dt>user.home            <dd>User home directory
-   * <dt>user.dir             <dd>User's current working directory
-   * </dl>
-   *
-   * @param p the Properties object to insert the system properties into
-   */
-  static native void insertSystemProperties(Properties p);
 } // class Runtime
Index: java/lang/System.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/System.java,v
retrieving revision 1.22
diff -u -r1.22 System.java
--- java/lang/System.java	18 Oct 2004 11:09:11 -0000	1.22
+++ java/lang/System.java	22 Apr 2005 06:58:45 -0000
@@ -1,5 +1,5 @@
 /* System.java -- useful methods to interface with the system
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
@@ -39,7 +39,7 @@
 
 package java.lang;
 
-import gnu.classpath.Configuration;
+import gnu.classpath.SystemProperties;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -66,77 +66,6 @@
   // in vm/reference/java/lang/Runtime for implications of this fact.
 
   /**
-   * Add to the default properties. The field is stored in Runtime, because
-   * of the bootstrap sequence; but this adds several useful properties to
-   * the defaults. Once the default is stabilized, it should not be modified;
-   * instead it is passed as a parent properties for fast setup of the
-   * defaults when calling <code>setProperties(null)</code>.
-   */
-  static
-  {
-    // Note that this loadLibrary() takes precedence over the one in Object,
-    // since Object.<clinit> is waiting for System.<clinit> to complete
-    // first; but loading a library twice is harmless.
-    if (Configuration.INIT_LOAD_LIBRARY)
-      loadLibrary("javalang");
-
-    Properties defaultProperties = Runtime.defaultProperties;
-
-    // Set base URL if not already set.
-    if (defaultProperties.get("gnu.classpath.home.url") == null)
-      defaultProperties.put("gnu.classpath.home.url",
-			    "file://"
-			    + defaultProperties.get("gnu.classpath.home")
-			    + "/lib");
-
-    // Set short name if not already set.
-    if (defaultProperties.get("gnu.classpath.vm.shortname") == null)
-      {
-	String value = defaultProperties.getProperty("java.vm.name");
-	int index = value.lastIndexOf(' ');
-	if (index != -1)
-	  value = value.substring(index + 1);
-	defaultProperties.put("gnu.classpath.vm.shortname", value);
-      }
-
-    // Network properties
-    if (defaultProperties.get("http.agent") == null)
-      {
-	String userAgent
-	  = ("gnu-classpath/"
-	     + defaultProperties.getProperty("gnu.classpath.version")
-	     + " ("
-	     + defaultProperties.getProperty("gnu.classpath.vm.shortname")
-	     + "/"
-	     + defaultProperties.getProperty("java.vm.version")
-	     + ")");
-	defaultProperties.put("http.agent", userAgent);
-      }
-
-    defaultProperties.put("gnu.cpu.endian",
-			  isWordsBigEndian() ? "big" : "little");
-
-    // GCJ LOCAL: Classpath sets common encoding aliases here.
-    // Since we don't (yet) have gnu.java.io.EncodingManager, these
-    // are a waste of time and just slow down system startup.
-
-    // XXX FIXME - Temp hack for old systems that set the wrong property
-    if (defaultProperties.get("java.io.tmpdir") == null)
-      defaultProperties.put("java.io.tmpdir",
-                            defaultProperties.get("java.tmpdir"));
-  }
-
-  /**
-   * Stores the current system properties. This can be modified by
-   * {@link #setProperties(Properties)}, but will never be null, because
-   * setProperties(null) sucks in the default properties.
-   */
-  // Note that we use clone here and not new.  Some programs assume
-  // that the system properties do not have a parent.
-  static Properties properties
-    = (Properties) Runtime.defaultProperties.clone();
-
-  /**
    * The standard InputStream. This is assigned at startup and starts its
    * life perfectly valid. Although it is marked final, you can change it
    * using {@link #setIn(InputStream)} through some hefty VM magic.
@@ -246,7 +175,7 @@
    * @param sm the new SecurityManager
    * @throws SecurityException if permission is denied
    */
-  public synchronized static void setSecurityManager(SecurityManager sm)
+  public static synchronized void setSecurityManager(SecurityManager sm)
   {
     // Implementation note: the field lives in Runtime because of bootstrap
     // initialization issues. This method is synchronized so that no other
@@ -383,7 +312,7 @@
     SecurityManager sm = Runtime.securityManager; // Be thread-safe.
     if (sm != null)
       sm.checkPropertiesAccess();
-    return properties;
+    return SystemProperties.getProperties();
   }
 
   /**
@@ -400,13 +329,7 @@
     SecurityManager sm = Runtime.securityManager; // Be thread-safe.
     if (sm != null)
       sm.checkPropertiesAccess();
-    if (properties == null)
-      {
-	// Note that we use clone here and not new.  Some programs
-	// assume that the system properties do not have a parent.
-	properties = (Properties) Runtime.defaultProperties.clone();
-      }
-    System.properties = properties;
+    SystemProperties.setProperties(properties);
   }
 
   /**
@@ -426,7 +349,7 @@
       sm.checkPropertyAccess(key);
     else if (key.length() == 0)
       throw new IllegalArgumentException("key can't be empty");
-    return properties.getProperty(key);
+    return SystemProperties.getProperty(key);
   }
 
   /**
@@ -445,7 +368,7 @@
     SecurityManager sm = Runtime.securityManager; // Be thread-safe.
     if (sm != null)
       sm.checkPropertyAccess(key);
-    return properties.getProperty(key, def);
+    return SystemProperties.getProperty(key, def);
   }
 
   /**
@@ -465,17 +388,20 @@
     SecurityManager sm = Runtime.securityManager; // Be thread-safe.
     if (sm != null)
       sm.checkPermission(new PropertyPermission(key, "write"));
-    return (String) properties.setProperty(key, value);
+    return SystemProperties.setProperty(key, value);
   }
 
   /**
    * Gets the value of an environment variable.
    *
    * @param name the name of the environment variable
-   * @return the string value of the variable
+   * @return the string value of the variable or null when the
+   *         environment variable is not defined.
    * @throws NullPointerException
    * @throws SecurityException if permission is denied
    * @since 1.5
+   * @specnote This method was deprecated in some JDK releases, but
+   *           was restored in 1.5.
    */
   public static String getenv(String name)
   {
@@ -483,7 +409,7 @@
       throw new NullPointerException();
     SecurityManager sm = Runtime.securityManager; // Be thread-safe.
     if (sm != null)
-      sm.checkPermission(new RuntimePermission("getenv."+name));
+      sm.checkPermission(new RuntimePermission("getenv." + name));
     return getenv0(name);
   }
 
@@ -553,6 +479,10 @@
    * check may be performed, <code>checkLink</code>. This just calls
    * <code>Runtime.getRuntime().load(filename)</code>.
    *
+   * <p>
+   * The library is loaded using the class loader associated with the
+   * class associated with the invoking method.
+   *
    * @param filename the code file to load
    * @throws SecurityException if permission is denied
    * @throws UnsatisfiedLinkError if the file cannot be loaded
@@ -568,6 +498,10 @@
    * check may be performed, <code>checkLink</code>. This just calls
    * <code>Runtime.getRuntime().load(filename)</code>.
    *
+   * <p>
+   * The library is loaded using the class loader associated with the
+   * class associated with the invoking method.
+   *
    * @param libname the library file to load
    * @throws SecurityException if permission is denied
    * @throws UnsatisfiedLinkError if the file cannot be loaded
@@ -592,13 +526,6 @@
   }
 
   /**
-   * Detect big-endian systems.
-   *
-   * @return true if the system is big-endian.
-   */
-  static native boolean isWordsBigEndian();
-
-  /**
    * Set {@link #in} to a new InputStream.
    *
    * @param in the new InputStream
Index: java/lang/Throwable.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Throwable.java,v
retrieving revision 1.19
diff -u -r1.19 Throwable.java
--- java/lang/Throwable.java	17 Feb 2005 07:48:34 -0000	1.19
+++ java/lang/Throwable.java	22 Apr 2005 06:58:45 -0000
@@ -37,6 +37,8 @@
 
 package java.lang;
 
+import gnu.classpath.SystemProperties;
+
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.Serializable;
@@ -170,7 +172,7 @@
   public Throwable(String message, Throwable cause)
   {
     this(message);
-    initCause(cause);
+    this.cause = cause;
   }
 
   /**
@@ -401,13 +403,7 @@
    */
   private static class StaticData
   {
-    static final String nl;
-
-    static
-    {
-      // Access package private properties field to prevent Security check.
-      nl = System.properties.getProperty("line.separator");
-    }
+    static final String nl = SystemProperties.getProperty("line.separator");
   }
 
   // Create whole stack trace in a stringbuffer so we don't have to print
Index: java/lang/natRuntime.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natRuntime.cc,v
retrieving revision 1.56
diff -u -r1.56 natRuntime.cc
--- java/lang/natRuntime.cc	19 Apr 2005 09:29:16 -0000	1.56
+++ java/lang/natRuntime.cc	22 Apr 2005 06:58:45 -0000
@@ -24,7 +24,6 @@
 #include <gnu/gcj/runtime/FileDeleter.h>
 #include <gnu/gcj/runtime/FinalizerThread.h>
 #include <java/io/File.h>
-#include <java/util/Properties.h>
 #include <java/util/TimeZone.h>
 #include <java/lang/StringBuffer.h>
 #include <java/lang/Process.h>
@@ -38,10 +37,6 @@
 #endif
 #include <errno.h>
 
-#ifdef HAVE_UNAME
-#include <sys/utsname.h>
-#endif
-
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
 #endif
@@ -83,12 +78,6 @@
   return data.result;
 }
 
-void
-_Jv_SetDLLSearchPath (const char *path)
-{
-  lt_dlsetsearchpath (path);
-}
-
 #else
 
 void *
@@ -97,12 +86,6 @@
   return NULL;
 }
 
-void
-_Jv_SetDLLSearchPath (const char *)
-{
-  // Nothing.
-}
-
 #endif /* USE_LTDL */
 
 
@@ -296,324 +279,6 @@
   // Do nothing.
 }
 
-#if ! defined (DEFAULT_FILE_ENCODING) && defined (HAVE_ICONV) \
-    && defined (HAVE_NL_LANGINFO)
-
-static char *
-file_encoding ()
-{
-  setlocale (LC_CTYPE, "");
-  char *e = nl_langinfo (CODESET);
-  if (e == NULL || *e == '\0')
-    e = "8859_1";
-  return e;
-}
-
-#define DEFAULT_FILE_ENCODING file_encoding ()
-
-#endif
-
-#ifndef DEFAULT_FILE_ENCODING
-#define DEFAULT_FILE_ENCODING "8859_1"
-#endif
-
-static char *default_file_encoding = DEFAULT_FILE_ENCODING;
-
-#if HAVE_GETPWUID_R
-/* Use overload resolution to find out the signature of getpwuid_r.  */
-
-  /* This is Posix getpwuid_r.  */
-template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-static inline int
-getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
-				   T_buf *buf_r, T_len len_r,
-				   T_passwd **pwd_entry_ptr),
-		 uid_t user_id, struct passwd *pwd_r,
-		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
-{
-  return getpwuid_r (user_id, pwd_r, buf_r, len_r, pwd_entry);
-}
-
-/* This is used on HPUX 10.20 */
-template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-static inline int
-getpwuid_adaptor(int (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
-				   T_buf *buf_r, T_len len_r),
-		 uid_t user_id, struct passwd *pwd_r,
-		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
-{
-  return getpwuid_r (user_id, pwd_r, buf_r, len_r);
-}
-
-/* This is used on IRIX 5.2.  */
-template <typename T_uid, typename T_passwd, typename T_buf, typename T_len>
-static inline int
-getpwuid_adaptor(T_passwd * (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r,
-					  T_buf *buf_r, T_len len_r),
-		 uid_t user_id, struct passwd *pwd_r,
-		 char *buf_r, size_t len_r, struct passwd **pwd_entry)
-{
-  *pwd_entry = getpwuid_r (user_id, pwd_r, buf_r, len_r);
-  return (*pwd_entry == NULL) ? errno : 0;
-}
-#endif
-
-void
-java::lang::Runtime::insertSystemProperties (java::util::Properties *newprops)
-{
-  // A convenience define.
-#define SET(Prop,Val) \
-	newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val))
-
-  // A mixture of the Java Product Versioning Specification
-  // (introduced in 1.2), and earlier versioning properties.  Some
-  // programs rely on seeing values that they expect, so we claim to
-  // be a 1.4-ish VM for their sake.
-  SET ("java.version", JV_VERSION);
-  SET ("java.runtime.version", JV_VERSION);
-  SET ("java.vendor", "Free Software Foundation, Inc.");
-  SET ("java.vendor.url", "http://gcc.gnu.org/java/");
-  SET ("java.class.version", "46.0");
-  SET ("java.vm.specification.version", "1.0");
-  SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification");
-  SET ("java.vm.specification.vendor", "Sun Microsystems Inc.");
-  SET ("java.vm.version", __VERSION__);
-  SET ("java.vm.vendor", "Free Software Foundation, Inc.");
-  SET ("java.vm.name", "GNU libgcj");
-  SET ("java.specification.version", JV_API_VERSION);
-  SET ("java.specification.name", "Java(tm) Platform API Specification");
-  SET ("java.specification.vendor", "Sun Microsystems Inc.");
-
-  char value[100];
-#define NAME "GNU libgcj "
-  strcpy (value, NAME);
-  strncpy (value + sizeof (NAME) - 1, __VERSION__,
-	   sizeof(value) - sizeof(NAME));
-  value[sizeof (value) - 1] = '\0';
-  jstring version = JvNewStringLatin1 (value);
-  newprops->put (JvNewStringLatin1 ("java.fullversion"), version);
-  newprops->put (JvNewStringLatin1 ("java.vm.info"), version);
-
-  // This definition is rather arbitrary: we choose $(prefix).  In
-  // part we do this because most people specify only --prefix and
-  // nothing else when installing gcj.  Plus, people are free to
-  // redefine `java.home' with `-D' if necessary.
-  SET ("java.home", JAVA_HOME);
-  SET ("gnu.classpath.home", PREFIX);
-  // This is set to $(libdir) because we use this to find .security
-  // files at runtime.
-  char val2[sizeof ("file://") + sizeof (LIBDIR) + 1];
-  strcpy (val2, "file://");
-  strcat (val2, LIBDIR);
-  SET ("gnu.classpath.home.url", val2);
-
-  SET ("file.encoding", default_file_encoding);
-
-#ifdef HAVE_UNAME
-  struct utsname u;
-  if (! uname (&u))
-    {
-      SET ("os.name", u.sysname);
-      SET ("os.version", u.release);
-
-      // Normalize x86 architecture names to "i386" (except on Windows, which 
-      // is handled in win32.cc).
-      if (u.machine[0] == 'i'
-	  && u.machine[1] != 0
-	  && u.machine[2] == '8'
-	  && u.machine[3] == '6'
-	  && u.machine[4] == 0)
-	SET ("os.arch", "i386");
-      else
-	SET ("os.arch", u.machine);
-    }
-  else
-    {
-      SET ("os.name", "unknown");
-      SET ("os.arch", "unknown");
-      SET ("os.version", "unknown");
-    }
-#endif /* HAVE_UNAME */
-
-#ifndef NO_GETUID
-#ifdef HAVE_PWD_H
-  uid_t user_id = getuid ();
-  struct passwd *pwd_entry;
-
-#ifdef HAVE_GETPWUID_R
-  struct passwd pwd_r;
-  size_t len_r = 200;
-  char *buf_r = (char *) _Jv_AllocBytes (len_r);
-
-  while (buf_r != NULL)
-    {
-      int r = getpwuid_adaptor (getpwuid_r, user_id, &pwd_r,
-				buf_r, len_r, &pwd_entry);
-      if (r == 0)
-	break;
-      else if (r != ERANGE)
-	{
-	  pwd_entry = NULL;
-	  break;
-	}
-      len_r *= 2;
-      buf_r = (char *) _Jv_AllocBytes (len_r);
-    }
-#else
-  pwd_entry = getpwuid (user_id);
-#endif /* HAVE_GETPWUID_R */
-
-  if (pwd_entry != NULL)
-    {
-      SET ("user.name", pwd_entry->pw_name);
-      SET ("user.home", pwd_entry->pw_dir);
-    }
-#endif /* HAVE_PWD_H */
-#endif /* NO_GETUID */
-
-#ifdef HAVE_GETCWD
-#ifdef HAVE_UNISTD_H
-  /* Use getcwd to set "user.dir". */
-  int buflen = 250;
-  char *buffer = (char *) malloc (buflen);
-  while (buffer != NULL)
-    {
-      if (getcwd (buffer, buflen) != NULL)
-	{
-	  SET ("user.dir", buffer);
-	  break;
-	}
-      if (errno != ERANGE)
-	break;
-      buflen = 2 * buflen;
-      buffer = (char *) realloc (buffer, buflen);
-    }
-  if (buffer != NULL)
-    free (buffer);
-#endif /* HAVE_UNISTD_H */
-#endif /* HAVE_GETCWD */
-
-  // Set user locale properties based on setlocale()
-#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
-  // We let the user choose the locale.  However, since Java differs
-  // from POSIX, we arbitrarily pick LC_MESSAGES as determining the
-  // Java locale.  We can't use LC_ALL because it might return a full
-  // list of all the settings.  If we don't have LC_MESSAGES then we
-  // just default to `en_US'.
-  setlocale (LC_ALL, "");
-  char *locale = setlocale (LC_MESSAGES, "");
-  if (locale && strlen (locale) >= 2)
-    {
-      char buf[3];
-      buf[2] = '\0';
-      // copy the first two chars to user.language
-      strncpy (buf, locale, 2);
-      SET ("user.language", buf);
-      // if the next char is a '_', copy the two after that to user.region
-      locale += 2;
-      if (locale[0] == '_')
-        {
-	  locale++;
-	  strncpy (buf, locale, 2);
-	  SET ("user.region", buf);
-        }
-    }
-  else
-#endif /* HAVE_SETLOCALE and HAVE_LC_MESSAGES */
-    {
-      SET ("user.language", "en");
-      SET ("user.region", "US");
-    }  
-
-  // The java extensions directory.
-  SET ("java.ext.dirs", JAVA_EXT_DIRS);
-
-  // The endorsed directories that libgcj knows about by default.
-  // This is a way to get other jars into the boot class loader
-  // without overriding java.endorsed.dirs.
-  SET ("gnu.gcj.runtime.endorsed.dirs", GCJ_ENDORSED_DIRS);
-
-  // The path to libgcj's boot classes
-  SET ("sun.boot.class.path", BOOT_CLASS_PATH);
-
-  // If there is a default system database, set it.
-  SET ("gnu.gcj.precompiled.db.path", LIBGCJ_DEFAULT_DATABASE);
-
-  // Set some properties according to whatever was compiled in with
-  // `-D'.  Important: after this point, the only properties that
-  // should be set are those which either the user cannot meaningfully
-  // override, or which augment whatever value the user has provided.
-  for (int i = 0; i < _Jv_Properties_Count; ++i)
-    {
-      const char *s, *p;
-      // Find the `='.
-      for (s = p = _Jv_Compiler_Properties[i]; *s && *s != '='; ++s)
-	;
-      jstring name = JvNewStringLatin1 (p, s - p);
-      jstring val = JvNewStringLatin1 (*s == '=' ? s + 1 : s);
-      newprops->put (name, val);
-    }
-
-  // Set the system properties from the user's environment.
-#ifndef DISABLE_GETENV_PROPERTIES
-  if (_Jv_Environment_Properties)
-    {
-      size_t i = 0;
-
-      while (_Jv_Environment_Properties[i].key)
-	{
-	  SET (_Jv_Environment_Properties[i].key, 
-	       _Jv_Environment_Properties[i].value);
-	  i++;
-	}
-    }
-#endif
-
-  // The name used to invoke this process (argv[0] in C).
-  SET ("gnu.gcj.progname", _Jv_GetSafeArg (0));
-
-  // Allow platform specific settings and overrides.
-  _Jv_platform_initProperties (newprops);
-
-  // If java.library.path is set, tell libltdl so we search the new
-  // directories as well.  FIXME: does this work properly on Windows?
-  String *path = newprops->getProperty(JvNewStringLatin1("java.library.path"));
-  if (path)
-    {
-      char *val = (char *) _Jv_Malloc (JvGetStringUTFLength (path) + 1);
-      jsize total = JvGetStringUTFRegion (path, 0, path->length(), val);
-      val[total] = '\0';
-      _Jv_SetDLLSearchPath (val);
-      _Jv_Free (val);
-    }
-  else
-    {
-      // Set a value for user code to see.
-      // FIXME: JDK sets this to the actual path used, including
-      // LD_LIBRARY_PATH, etc.
-      SET ("java.library.path", "");
-    }
-
-  // If java.class.path is still not set then set it according to the
-  // CLASSPATH environment variable if given.  See gij.cc main () and
-  // prims.cc _Jv_CreateJavaVM () for all the ways this could have
-  // been set much earlier.
-  // If CLASSPATH isn't set or if the path is empty fall back to "."
-  path = newprops->getProperty(JvNewStringLatin1("java.class.path"));
-  if (!path)
-    {
-      char *classpath = getenv("CLASSPATH");
-      if (classpath && classpath[0] != 0)
-	{
-	  path = JvNewStringLatin1 (classpath);
-	  newprops->put(JvNewStringLatin1 ("java.class.path"), path);
-	}
-    }
-
-  if (!path || path->length() == 0)
-    SET ("java.class.path", ".");
-}
-
 java::lang::Process *
 java::lang::Runtime::execInternal (jstringArray cmd,
 				   jstringArray env,
Index: java/lang/natSystem.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natSystem.cc,v
retrieving revision 1.58
diff -u -r1.58 natSystem.cc
--- java/lang/natSystem.cc	15 Jun 2004 13:43:33 -0000	1.58
+++ java/lang/natSystem.cc	22 Apr 2005 06:58:45 -0000
@@ -130,19 +130,6 @@
   return _Jv_HashCode (obj);
 }
 
-jboolean
-java::lang::System::isWordsBigEndian (void)
-{
-  union
-  {
-    long lval;
-    char cval;
-  } u;
-
-  u.lval = 1;
-  return u.cval == 0;
-}
-
 jstring
 java::lang::System::getenv0 (jstring name)
 {
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.479
diff -u -r1.479 Makefile.am
--- Makefile.am	19 Apr 2005 12:19:18 -0000	1.479
+++ Makefile.am	22 Apr 2005 06:58:46 -0000
@@ -3122,6 +3122,7 @@
 ordinary_java_source_files = $(core_java_source_files) \
 gnu/classpath/ServiceFactory.java \
 gnu/classpath/ServiceProviderLoadingAction.java \
+gnu/classpath/SystemProperties.java \
 gnu/gcj/Core.java \
 gnu/gcj/RawData.java \
 gnu/gcj/RawDataManaged.java \
@@ -3884,6 +3885,7 @@
 
 ## This lists all the C++ source files in subdirectories.
 nat_source_files = \
+gnu/classpath/natSystemProperties.cc \
 gnu/gcj/natCore.cc \
 gnu/gcj/convert/JIS0208_to_Unicode.cc \
 gnu/gcj/convert/JIS0212_to_Unicode.cc \
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.in,v
retrieving revision 1.510
diff -u -r1.510 Makefile.in
--- Makefile.in	19 Apr 2005 12:19:20 -0000	1.510
+++ Makefile.in	22 Apr 2005 06:58:52 -0000
@@ -238,7 +238,8 @@
 	external/w3c_dom/libw3c-gcj.la
 am__libgcj0_convenience_la_SOURCES_DIST = prims.cc jni.cc exception.cc \
 	stacktrace.cc link.cc defineclass.cc interpret.cc verify.cc \
-	gnu/gcj/natCore.cc gnu/gcj/convert/JIS0208_to_Unicode.cc \
+	gnu/classpath/natSystemProperties.cc gnu/gcj/natCore.cc \
+	gnu/gcj/convert/JIS0208_to_Unicode.cc \
 	gnu/gcj/convert/JIS0212_to_Unicode.cc \
 	gnu/gcj/convert/Unicode_to_JIS.cc gnu/gcj/convert/natIconv.cc \
 	gnu/gcj/convert/natInput_EUCJIS.cc \
@@ -453,9 +454,10 @@
 	java/util/regex/PatternSyntaxException.java \
 	gnu/classpath/ServiceFactory.java \
 	gnu/classpath/ServiceProviderLoadingAction.java \
-	gnu/gcj/Core.java gnu/gcj/RawData.java \
-	gnu/gcj/RawDataManaged.java gnu/gcj/io/DefaultMimeTypes.java \
-	gnu/gcj/io/MimeTypes.java gnu/gcj/io/SimpleSHSStream.java \
+	gnu/classpath/SystemProperties.java gnu/gcj/Core.java \
+	gnu/gcj/RawData.java gnu/gcj/RawDataManaged.java \
+	gnu/gcj/io/DefaultMimeTypes.java gnu/gcj/io/MimeTypes.java \
+	gnu/gcj/io/SimpleSHSStream.java \
 	gnu/gcj/runtime/BootClassLoader.java \
 	gnu/gcj/runtime/ExtensionClassLoader.java \
 	gnu/gcj/runtime/FileDeleter.java \
@@ -2281,8 +2283,8 @@
 	gnu/classpath/Configuration.java boehm.cc nogc.cc \
 	sysdep/dwarf2-backtrace.cc posix.cc win32.cc darwin.cc \
 	posix-threads.cc win32-threads.cc no-threads.cc
-am__objects_5 = gnu/gcj/natCore.lo \
-	gnu/gcj/convert/JIS0208_to_Unicode.lo \
+am__objects_5 = gnu/classpath/natSystemProperties.lo \
+	gnu/gcj/natCore.lo gnu/gcj/convert/JIS0208_to_Unicode.lo \
 	gnu/gcj/convert/JIS0212_to_Unicode.lo \
 	gnu/gcj/convert/Unicode_to_JIS.lo gnu/gcj/convert/natIconv.lo \
 	gnu/gcj/convert/natInput_EUCJIS.lo \
@@ -3585,7 +3587,8 @@
 	org/ietf/jgss/Oid.lo org/ietf/jgss/GSSCredential.lo \
 	org/ietf/jgss/ChannelBinding.lo
 am__objects_14 = $(am__objects_8) gnu/classpath/ServiceFactory.lo \
-	gnu/classpath/ServiceProviderLoadingAction.lo gnu/gcj/Core.lo \
+	gnu/classpath/ServiceProviderLoadingAction.lo \
+	gnu/classpath/SystemProperties.lo gnu/gcj/Core.lo \
 	gnu/gcj/RawData.lo gnu/gcj/RawDataManaged.lo \
 	gnu/gcj/io/DefaultMimeTypes.lo gnu/gcj/io/MimeTypes.lo \
 	gnu/gcj/io/SimpleSHSStream.lo \
@@ -6911,6 +6914,7 @@
 ordinary_java_source_files = $(core_java_source_files) \
 gnu/classpath/ServiceFactory.java \
 gnu/classpath/ServiceProviderLoadingAction.java \
+gnu/classpath/SystemProperties.java \
 gnu/gcj/Core.java \
 gnu/gcj/RawData.java \
 gnu/gcj/RawDataManaged.java \
@@ -7668,6 +7672,7 @@
   java/lang/k_cos.c       java/lang/s_sin.c       java/lang/sf_fabs.c
 
 nat_source_files = \
+gnu/classpath/natSystemProperties.cc \
 gnu/gcj/natCore.cc \
 gnu/gcj/convert/JIS0208_to_Unicode.cc \
 gnu/gcj/convert/JIS0212_to_Unicode.cc \
@@ -8194,6 +8199,14 @@
 	jni/classpath/$(DEPDIR)/$(am__dirstamp)
 lib-gnu-java-awt-peer-gtk.la: $(lib_gnu_java_awt_peer_gtk_la_OBJECTS) $(lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES) 
 	$(lib_gnu_java_awt_peer_gtk_la_LINK) $(am_lib_gnu_java_awt_peer_gtk_la_rpath) $(lib_gnu_java_awt_peer_gtk_la_LDFLAGS) $(lib_gnu_java_awt_peer_gtk_la_OBJECTS) $(lib_gnu_java_awt_peer_gtk_la_LIBADD) $(LIBS)
+gnu/classpath/$(am__dirstamp):
+	@$(mkdir_p) gnu/classpath
+	@: > gnu/classpath/$(am__dirstamp)
+gnu/classpath/$(DEPDIR)/$(am__dirstamp):
+	@$(mkdir_p) gnu/classpath/$(DEPDIR)
+	@: > gnu/classpath/$(DEPDIR)/$(am__dirstamp)
+gnu/classpath/natSystemProperties.lo: gnu/classpath/$(am__dirstamp) \
+	gnu/classpath/$(DEPDIR)/$(am__dirstamp)
 gnu/gcj/$(am__dirstamp):
 	@$(mkdir_p) gnu/gcj
 	@: > gnu/gcj/$(am__dirstamp)
@@ -9041,17 +9054,13 @@
 java/util/regex/PatternSyntaxException.lo:  \
 	java/util/regex/$(am__dirstamp) \
 	java/util/regex/$(DEPDIR)/$(am__dirstamp)
-gnu/classpath/$(am__dirstamp):
-	@$(mkdir_p) gnu/classpath
-	@: > gnu/classpath/$(am__dirstamp)
-gnu/classpath/$(DEPDIR)/$(am__dirstamp):
-	@$(mkdir_p) gnu/classpath/$(DEPDIR)
-	@: > gnu/classpath/$(DEPDIR)/$(am__dirstamp)
 gnu/classpath/ServiceFactory.lo: gnu/classpath/$(am__dirstamp) \
 	gnu/classpath/$(DEPDIR)/$(am__dirstamp)
 gnu/classpath/ServiceProviderLoadingAction.lo:  \
 	gnu/classpath/$(am__dirstamp) \
 	gnu/classpath/$(DEPDIR)/$(am__dirstamp)
+gnu/classpath/SystemProperties.lo: gnu/classpath/$(am__dirstamp) \
+	gnu/classpath/$(DEPDIR)/$(am__dirstamp)
 gnu/gcj/Core.lo: gnu/gcj/$(am__dirstamp) \
 	gnu/gcj/$(DEPDIR)/$(am__dirstamp)
 gnu/gcj/RawData.lo: gnu/gcj/$(am__dirstamp) \
@@ -15017,6 +15026,10 @@
 	-rm -f gnu/classpath/ServiceFactory.lo
 	-rm -f gnu/classpath/ServiceProviderLoadingAction.$(OBJEXT)
 	-rm -f gnu/classpath/ServiceProviderLoadingAction.lo
+	-rm -f gnu/classpath/SystemProperties.$(OBJEXT)
+	-rm -f gnu/classpath/SystemProperties.lo
+	-rm -f gnu/classpath/natSystemProperties.$(OBJEXT)
+	-rm -f gnu/classpath/natSystemProperties.lo
 	-rm -f gnu/gcj/Core.$(OBJEXT)
 	-rm -f gnu/gcj/Core.lo
 	-rm -f gnu/gcj/RawData.$(OBJEXT)
@@ -20071,6 +20084,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/Configuration.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/ServiceFactory.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/ServiceProviderLoadingAction.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/SystemProperties.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@gnu/classpath/$(DEPDIR)/natSystemProperties.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/Core.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/RawData.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@gnu/gcj/$(DEPDIR)/RawDataManaged.Plo@am__quote@


More information about the Java-patches mailing list