[multiple changes]

2005-04-25  Archie Cobbs  <archie@dellroad.org>

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

2005-04-25  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.

From-SVN: r98734
This commit is contained in:
Michael Koch 2005-04-25 19:48:35 +00:00
parent 8efae6bbfa
commit ee141b8822
10 changed files with 641 additions and 554 deletions

View file

@ -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 @@ exception statement from your version. */
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;
@ -72,47 +73,9 @@ public class Runtime
*/
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.&lt;clinit&gt; 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.&lt;clinit&gt; uses a String literal, possibly triggering initialization
* String.&lt;clinit&gt; calls WeakHashMap.&lt;init&gt;, triggering initialization
* AbstractMap, WeakHashMap, WeakHashMap$1 have no dependencies
* String.&lt;clinit&gt; calls CaseInsensitiveComparator.&lt;init&gt;, triggering
* initialization
* CaseInsensitiveComparator has no dependencies
* Object.&lt;clinit&gt; calls System.loadLibrary, triggering initialization
* System.&lt;clinit&gt; calls System.loadLibrary
* System.loadLibrary calls Runtime.getRuntime, triggering initialization
* Runtime.&lt;clinit&gt; calls Properties.&lt;init&gt;, triggering initialization
* Dictionary, Hashtable, and Properties have no dependencies
* Runtime.&lt;clinit&gt; calls VMRuntime.insertSystemProperties, triggering
* initialization of VMRuntime; the VM must make sure that there are
* not any harmful dependencies
* Runtime.&lt;clinit&gt; calls Runtime.&lt;init&gt;
* Runtime.&lt;init&gt; calls StringTokenizer.&lt;init&gt;, 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);
}
/**
@ -134,8 +97,7 @@ public class Runtime
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 +108,11 @@ public class Runtime
{
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 +283,15 @@ public class Runtime
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 +701,4 @@ public class Runtime
*/
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

View file

@ -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 @@ exception statement from your version. */
package java.lang;
import gnu.classpath.Configuration;
import gnu.classpath.SystemProperties;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@ -65,77 +65,6 @@ public final class System
// WARNING: System is a CORE class in the bootstrap cycle. See the comments
// 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
@ -246,7 +175,7 @@ public final class System
* @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 @@ public final class System
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertiesAccess();
return properties;
return SystemProperties.getProperties();
}
/**
@ -400,13 +329,7 @@ public final class System
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 @@ public final class System
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 @@ public final class System
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 @@ public final class System
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 @@ public final class System
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 @@ public final class System
* 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 @@ public final class System
* 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
@ -591,13 +525,6 @@ public final class System
return Runtime.nativeGetLibname("", libname);
}
/**
* Detect big-endian systems.
*
* @return true if the system is big-endian.
*/
static native boolean isWordsBigEndian();
/**
* Set {@link #in} to a new InputStream.
*

View file

@ -37,6 +37,8 @@ exception statement from your version. */
package java.lang;
import gnu.classpath.SystemProperties;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Serializable;
@ -170,7 +172,7 @@ public class Throwable implements Serializable
public Throwable(String message, Throwable cause)
{
this(message);
initCause(cause);
this.cause = cause;
}
/**
@ -401,13 +403,7 @@ public class Throwable implements Serializable
*/
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

View file

@ -24,7 +24,6 @@ details. */
#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 @@ details. */
#endif
#include <errno.h>
#ifdef HAVE_UNAME
#include <sys/utsname.h>
#endif
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
@ -83,12 +78,6 @@ _Jv_FindSymbolInExecutable (const char *symname)
return data.result;
}
void
_Jv_SetDLLSearchPath (const char *path)
{
lt_dlsetsearchpath (path);
}
#else
void *
@ -97,12 +86,6 @@ _Jv_FindSymbolInExecutable (const char *)
return NULL;
}
void
_Jv_SetDLLSearchPath (const char *)
{
// Nothing.
}
#endif /* USE_LTDL */
@ -296,324 +279,6 @@ java::lang::Runtime::traceMethodCalls (jboolean)
// 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,

View file

@ -130,19 +130,6 @@ java::lang::System::identityHashCode (jobject obj)
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)
{