/* src/vm/properties.c - handling commandline properties
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
- C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
- E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
- J. Wenninger, Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Christian Thalinger
-
- $Id: properties.c 5991 2006-11-15 18:26:40Z twisti $
-
*/
#include "config.h"
+#include <stdint.h>
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/utsname.h>
#include <time.h>
-
-#include "vm/types.h"
+#include <unistd.h>
+#include <sys/utsname.h>
#include "mm/memory.h"
-#include "vm/global.h"
-#include "native/include/java_lang_String.h"
-#include "native/include/java_util_Properties.h"
+#include "native/jni.h"
+#include "native/llni.h"
+
#include "toolbox/list.h"
#include "toolbox/util.h"
-#include "vm/method.h"
-#include "vm/options.h"
+
+#include "vm/global.h"
#include "vm/properties.h"
-#include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/string.hpp"
+#include "vm/vm.hpp"
+
#include "vm/jit/asmpart.h"
+#include "vmcore/class.h"
+#include "vmcore/method.h"
+#include "vmcore/options.h"
+#include "vmcore/os.hpp"
+
/* internal property structure ************************************************/
-typedef struct list_properties_entry list_properties_entry;
+typedef struct list_properties_entry_t list_properties_entry_t;
-struct list_properties_entry {
- char *key;
- char *value;
- listnode linkage;
+struct list_properties_entry_t {
+ const char* key;
+ const char* value;
+ listnode_t linkage;
};
/* global variables ***********************************************************/
-static list *list_properties = NULL;
+static list_t *list_properties = NULL;
/* properties_init *************************************************************
*******************************************************************************/
-bool properties_init(void)
+void properties_init(void)
+{
+ TRACESUBSYSTEMINITIALIZATION("properties_init");
+
+ list_properties = list_create(OFFSET(list_properties_entry_t, linkage));
+}
+
+
+/* properties_set **************************************************************
+
+ Fill the properties list with default values.
+
+*******************************************************************************/
+
+void properties_set(void)
{
+ int len;
+ char *p;
+
+ char *java_home;
+ char *boot_class_path;
+
#if defined(ENABLE_JAVASE)
+ char *class_path;
+ char *boot_library_path;
+ char *extdirs;
+ char *endorseddirs;
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
char *cwd;
- char *env_java_home;
char *env_user;
char *env_home;
char *env_lang;
- char *java_home;
- char *extdirs;
char *lang;
char *country;
struct utsname *utsnamebuf;
- s4 len;
+
+ char *java_library_path;
+# endif
#endif
- /* create the properties list */
+#if defined(ENABLE_JRE_LAYOUT)
+ /* SUN also uses a buffer of 4096-bytes (strace is your friend). */
- list_properties = list_create(OFFSET(list_properties_entry, linkage));
+ p = MNEW(char, 4096);
-#if defined(ENABLE_JAVASE)
- /* get properties from system */
+ if (readlink("/proc/self/exe", p, 4095) == -1)
+ vm_abort("properties_set: readlink failed: %s\n", strerror(errno));
- cwd = _Jv_getcwd();
- env_java_home = getenv("JAVA_HOME");
- env_user = getenv("USER");
- env_home = getenv("HOME");
- env_lang = getenv("LANG");
+ /* We have a path like:
- utsnamebuf = NEW(struct utsname);
+ /path/to/executable/bin/java
- uname(utsnamebuf);
+ or
+
+ /path/to/executeable/jre/bin/java
- /* set JAVA_HOME to default prefix if not defined */
+ Now let's strip two levels. */
- if (env_java_home == NULL)
- env_java_home = cacao_prefix;
+ p = os_dirname(p);
+ p = os_dirname(p);
- /* fill in system properties */
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
- properties_add("java.version", JAVA_VERSION);
- properties_add("java.vendor", "GNU Classpath");
- properties_add("java.vendor.url", "http://www.gnu.org/software/classpath/");
+ /* Set java.home. */
+
+ java_home = strdup(p);
+
+ /* Set the path to Java core native libraries. */
+
+ len = strlen(java_home) + strlen("/lib/classpath") + strlen("0");
+
+ boot_library_path = MNEW(char, len);
- /* add /jre to java.home property */
+ strcpy(boot_library_path, java_home);
+ strcat(boot_library_path, "/lib/classpath");
- len = strlen(env_java_home) + strlen("/jre") + strlen("0");
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ /* Find correct java.home. We check if there is a JRE
+ co-located. */
+
+ /* NOTE: We use the server VM here as it should be available on
+ all architectures. */
+
+ len =
+ strlen(p) +
+ strlen("/jre/lib/"JAVA_ARCH"/server/libjvm.so") +
+ strlen("0");
java_home = MNEW(char, len);
- strcpy(java_home, env_java_home);
- strcat(java_home, "/jre");
+ strcpy(java_home, p);
+ strcat(java_home, "/jre/lib/"JAVA_ARCH"/server/libjvm.so");
+
+ /* Check if that libjvm.so exists. */
+
+ if (os_access(java_home, F_OK) == 0) {
+ /* Yes, we add /jre to java.home. */
+
+ strcpy(java_home, p);
+ strcat(java_home, "/jre");
+ }
+ else {
+ /* No, java.home is parent directory. */
+
+ strcpy(java_home, p);
+ }
+
+ /* Set the path to Java core native libraries. */
+
+ len = strlen(java_home) + strlen("/lib/"JAVA_ARCH) + strlen("0");
+
+ boot_library_path = MNEW(char, len);
+
+ strcpy(boot_library_path, java_home);
+ strcat(boot_library_path, "/lib/"JAVA_ARCH);
+
+# else
+# error unknown classpath configuration
+# endif
+
+ /* Free path. */
+
+ MFREE(p, char, len);
+
+#else
+ java_home = CACAO_PREFIX;
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+ boot_library_path = JAVA_RUNTIME_LIBRARY_LIBDIR"/classpath";
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ boot_library_path = JAVA_RUNTIME_LIBRARY_LIBDIR;
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1)
+
+ /* No boot_library_path required. */
+
+# else
+# error unknown classpath configuration
+# endif
+#endif
properties_add("java.home", java_home);
+ /* Set the bootclasspath. */
+
+ p = getenv("BOOTCLASSPATH");
+
+ if (p != NULL) {
+ boot_class_path = MNEW(char, strlen(p) + strlen("0"));
+ strcpy(boot_class_path, p);
+ }
+ else {
+#if defined(ENABLE_JRE_LAYOUT)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+ len =
+ strlen(java_home) + strlen("/share/cacao/vm.zip:") +
+ strlen(java_home) + strlen("/share/classpath/glibj.zip") +
+ strlen("0");
+
+ boot_class_path = MNEW(char, len);
+
+ strcpy(boot_class_path, java_home);
+ strcat(boot_class_path, "/share/cacao/vm.zip");
+ strcat(boot_class_path, ":");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/share/classpath/glibj.zip");
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ /* This is the bootclasspath taken from HotSpot (see
+ hotspot/src/share/vm/runtime/os.cpp
+ (os::set_boot_path)). */
+
+ len =
+ strlen(java_home) + strlen("/lib/resources.jar:") +
+ strlen(java_home) + strlen("/lib/rt.jar:") +
+ strlen(java_home) + strlen("/lib/sunrsasign.jar:") +
+ strlen(java_home) + strlen("/lib/jsse.jar:") +
+ strlen(java_home) + strlen("/lib/jce.jar:") +
+ strlen(java_home) + strlen("/lib/charsets.jar:") +
+ strlen(java_home) + strlen("/classes") +
+ strlen("0");
+
+ boot_class_path = MNEW(char, len);
+
+ strcpy(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/resources.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/rt.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/sunrsasign.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/jsse.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/jce.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/lib/charsets.jar:");
+ strcat(boot_class_path, java_home);
+ strcat(boot_class_path, "/classes");
+
+# else
+# error unknown classpath configuration
+# endif
+#else
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+ len =
+ strlen(CACAO_VM_ZIP) +
+ strlen(":") +
+ strlen(JAVA_RUNTIME_LIBRARY_CLASSES) +
+ strlen("0");
+
+ boot_class_path = MNEW(char, len);
+
+ strcpy(boot_class_path, CACAO_VM_ZIP);
+ strcat(boot_class_path, ":");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_CLASSES);
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ /* This is the bootclasspath taken from HotSpot (see
+ hotspot/src/share/vm/runtime/os.cpp
+ (os::set_boot_path)). */
+
+ len =
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/resources.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/rt.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/sunrsasign.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/jsse.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/jce.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/lib/charsets.jar:") +
+ strlen(JAVA_RUNTIME_LIBRARY_PREFIX"/classes") +
+ strlen("0");
+
+ boot_class_path = MNEW(char, len);
+
+ strcpy(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/resources.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/rt.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/sunrsasign.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/jsse.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/jce.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/lib/charsets.jar:");
+ strcat(boot_class_path, JAVA_RUNTIME_LIBRARY_PREFIX"/classes");
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1)
+
+ len =
+ strlen(JAVA_RUNTIME_LIBRARY_CLASSES) +
+ strlen("0");
+
+ boot_class_path = MNEW(char, len);
+
+ strcpy(boot_class_path, JAVA_RUNTIME_LIBRARY_CLASSES);
+
+# else
+# error unknown classpath configuration
+# endif
+#endif
+ }
+
+ properties_add("sun.boot.class.path", boot_class_path);
+ properties_add("java.boot.class.path", boot_class_path);
+
+#if defined(ENABLE_JAVASE)
+
+ /* Set the classpath. */
+
+ p = getenv("CLASSPATH");
+
+ if (p != NULL) {
+ class_path = MNEW(char, strlen(p) + strlen("0"));
+ strcpy(class_path, p);
+ }
+ else {
+ class_path = MNEW(char, strlen(".") + strlen("0"));
+ strcpy(class_path, ".");
+ }
+
+ properties_add("java.class.path", class_path);
+
+ /* Add java.vm properties. */
+
properties_add("java.vm.specification.version", "1.0");
properties_add("java.vm.specification.vendor", "Sun Microsystems Inc.");
properties_add("java.vm.specification.name", "Java Virtual Machine Specification");
properties_add("java.vm.version", VERSION);
- properties_add("java.vm.vendor", "CACAO Team");
+ properties_add("java.vm.vendor", "CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO");
properties_add("java.vm.name", "CACAO");
- properties_add("java.specification.version", "1.4");
+
+# if defined(ENABLE_INTRP)
+ if (opt_intrp) {
+ /* XXX We don't support java.lang.Compiler */
+/* properties_add("java.compiler", "cacao.intrp"); */
+ properties_add("java.vm.info", "interpreted mode");
+ }
+ else
+# endif
+ {
+ /* XXX We don't support java.lang.Compiler */
+/* properties_add("java.compiler", "cacao.jit"); */
+ properties_add("java.vm.info", "JIT mode");
+ }
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+ /* Get properties from system. */
+
+ cwd = _Jv_getcwd();
+
+ env_user = getenv("USER");
+ env_home = getenv("HOME");
+ env_lang = getenv("LANG");
+
+ utsnamebuf = NEW(struct utsname);
+
+ uname(utsnamebuf);
+
+ properties_add("java.runtime.version", VERSION);
+ properties_add("java.runtime.name", "CACAO");
+
+ properties_add("java.specification.version", "1.5");
properties_add("java.specification.vendor", "Sun Microsystems Inc.");
properties_add("java.specification.name", "Java Platform API Specification");
+
+ properties_add("java.version", JAVA_VERSION);
+ properties_add("java.vendor", "GNU Classpath");
+ properties_add("java.vendor.url", "http://www.gnu.org/software/classpath/");
+
properties_add("java.class.version", CLASS_VERSION);
- properties_add("java.class.path", _Jv_classpath);
- properties_add("java.runtime.version", VERSION);
- properties_add("java.runtime.name", "CACAO");
+ properties_add("gnu.classpath.boot.library.path", boot_library_path);
- /* Set bootclasspath properties. One for GNU classpath and the
- other for compatibility with Sun (required by most
- applications). */
+ /* Get and set java.library.path. */
- properties_add("java.boot.class.path", _Jv_bootclasspath);
- properties_add("sun.boot.class.path", _Jv_bootclasspath);
+ java_library_path = getenv("LD_LIBRARY_PATH");
-#if defined(WITH_STATIC_CLASSPATH)
- properties_add("gnu.classpath.boot.library.path", ".");
- properties_add("java.library.path" , ".");
-#else
- /* fill gnu.classpath.boot.library.path with GNU Classpath library
- path */
+ if (java_library_path == NULL)
+ java_library_path = "";
- properties_add("gnu.classpath.boot.library.path", classpath_libdir);
- properties_add("java.library.path", _Jv_java_library_path);
-#endif
+ properties_add("java.library.path", java_library_path);
properties_add("java.io.tmpdir", "/tmp");
-#if defined(ENABLE_INTRP)
+# if defined(ENABLE_INTRP)
if (opt_intrp) {
- /* XXX We don't support java.lang.Compiler */
-/* properties_add("java.compiler", "cacao.intrp"); */
- properties_add("java.vm.info", "interpreted mode");
properties_add("gnu.java.compiler.name", "cacao.intrp");
}
else
-#endif
+# endif
{
- /* XXX We don't support java.lang.Compiler */
-/* properties_add("java.compiler", "cacao.jit"); */
- properties_add("java.vm.info", "JIT mode");
properties_add("gnu.java.compiler.name", "cacao.jit");
}
- /* set the java.ext.dirs property */
+ /* Set the java.ext.dirs property. */
- len = strlen(env_java_home) + strlen("/jre/lib/ext") + strlen("0");
+ len = strlen(java_home) + strlen("/jre/lib/ext") + strlen("0");
extdirs = MNEW(char, len);
- strcpy(extdirs, env_java_home);
- strcat(extdirs, "/jre/lib/ext");
+ sprintf(extdirs, "%s/jre/lib/ext", java_home);
properties_add("java.ext.dirs", extdirs);
- properties_add("java.endorsed.dirs", ""CACAO_PREFIX"/jre/lib/endorsed");
+ /* Set the java.ext.endorsed property. */
+
+ len = strlen(java_home) + strlen("/jre/lib/endorsed") + strlen("0");
-#if defined(DISABLE_GC)
+ endorseddirs = MNEW(char, len);
+
+ sprintf(endorseddirs, "%s/jre/lib/endorsed", java_home);
+
+ properties_add("java.endorsed.dirs", endorseddirs);
+
+# if defined(DISABLE_GC)
/* When we disable the GC, we mmap the whole heap to a specific
address, so we can compare call traces. For this reason we have
to add the same properties on different machines, otherwise
properties_add("os.arch", "unknown");
properties_add("os.name", "unknown");
properties_add("os.version", "unknown");
-#else
- /* We need to set the os.arch hardcoded to be compatible with SUN. */
-
-# if defined(__I386__)
- /* map all x86 architectures (i386, i486, i686) to i386 */
-
- properties_add("os.arch", "i386");
-# elif defined(__POWERPC__)
- properties_add("os.arch", "ppc");
-# elif defined(__X86_64__)
- properties_add("os.arch", "amd64");
-# else
- /* default to what uname returns */
-
- properties_add("os.arch", utsnamebuf->machine);
-# endif
-
+# else
+ properties_add("os.arch", JAVA_ARCH);
properties_add("os.name", utsnamebuf->sysname);
properties_add("os.version", utsnamebuf->release);
-#endif
+# endif
+
+# if WORDS_BIGENDIAN == 1
+ properties_add("gnu.cpu.endian", "big");
+# else
+ properties_add("gnu.cpu.endian", "little");
+# endif
properties_add("file.separator", "/");
properties_add("path.separator", ":");
properties_add("line.separator", "\n");
+
properties_add("user.name", env_user ? env_user : "null");
properties_add("user.home", env_home ? env_home : "null");
properties_add("user.dir", cwd ? cwd : "null");
-#if defined(WITH_STATIC_CLASSPATH)
- /* This is just for debugging purposes and can cause troubles in
- GNU Classpath. */
-
- properties_add("gnu.cpu.endian", "unknown");
-#else
-# if WORDS_BIGENDIAN == 1
- properties_add("gnu.cpu.endian", "big");
-# else
- properties_add("gnu.cpu.endian", "little");
-# endif
-#endif
-
/* get locale */
if (env_lang != NULL) {
properties_add("user.language", "en");
properties_add("user.country", "US");
}
+
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ /* Actually this property is set by OpenJDK, but we need it in
+ nativevm_preinit(). */
+
+ properties_add("sun.boot.library.path", boot_library_path);
+
+ /* Set the java.ext.dirs property. */
+
+ len =
+ strlen(java_home) + strlen("/lib/ext") +
+ strlen(":") +
+ strlen("/usr/java/packages/lib/ext") +
+ strlen("0");
+
+ extdirs = MNEW(char, len);
+
+ sprintf(extdirs, "%s/lib/ext:/usr/java/packages/lib/ext", java_home);
+
+ properties_add("java.ext.dirs", extdirs);
+
+ /* Set the java.ext.endorsed property. */
+
+ len = strlen(java_home) + strlen("/lib/endorsed") + strlen("0");
+
+ endorseddirs = MNEW(char, len);
+
+ sprintf(endorseddirs, "%s/lib/endorsed", java_home);
+
+ properties_add("java.endorsed.dirs", endorseddirs);
+
+# else
+
+# error unknown classpath configuration
+
+# endif
+
#elif defined(ENABLE_JAVAME_CLDC1_1)
+
properties_add("microedition.configuration", "CLDC-1.1");
- properties_add("microedition.platform", "PowerPC");
- properties_add("microedition.encoding", "ISO-8859-1");
+ properties_add("microedition.platform", "generic");
+ properties_add("microedition.encoding", "ISO8859_1");
properties_add("microedition.profiles", "");
+
#else
-#error unknown Java configuration
-#endif
- /* everything's ok */
+# error unknown Java configuration
- return true;
+#endif
}
-/* properties_postinit *********************************************************
+/* properties_add **************************************************************
- Re-set some properties that may have changed during command-line
- parsing.
+ Adds a property entry to the internal property list. If there's
+ already an entry with the same key, replace it.
*******************************************************************************/
-bool properties_postinit(void)
+void properties_add(const char *key, const char *value)
{
-#if defined(ENABLE_JAVASE)
- properties_add("java.class.path", _Jv_classpath);
- properties_add("java.boot.class.path", _Jv_bootclasspath);
- properties_add("sun.boot.class.path", _Jv_bootclasspath);
-#endif
+ list_properties_entry_t *pe;
- /* everything's ok */
+ /* search for the entry */
- return true;
-}
+ for (pe = list_first(list_properties); pe != NULL;
+ pe = list_next(list_properties, pe)) {
+ if (strcmp(pe->key, key) == 0) {
+ /* entry was found, replace the value */
+#if !defined(NDEBUG)
+ if (opt_DebugProperties) {
+ printf("[properties_add: key=%s, old value=%s, new value=%s]\n",
+ key, pe->value, value);
+ }
+#endif
-/* properties_add **************************************************************
+ pe->value = value;
- Adds a property entry to the internal property list.
+ return;
+ }
+ }
-*******************************************************************************/
+ /* entry was not found, insert a new one */
-void properties_add(char *key, char *value)
-{
- list_properties_entry *p;
+#if !defined(NDEBUG)
+ if (opt_DebugProperties) {
+ printf("[properties_add: key=%s, value=%s]\n", key, value);
+ }
+#endif
- p = NEW(list_properties_entry);
+ pe = NEW(list_properties_entry_t);
- p->key = key;
- p->value = value;
+ pe->key = key;
+ pe->value = value;
- list_add_last_unsynced(list_properties, p);
+ list_add_last(list_properties, pe);
}
*******************************************************************************/
-char *properties_get(char *key)
+const char *properties_get(const char *key)
{
- list_properties_entry *pe;
+ list_properties_entry_t *pe;
- /* We search backwards, so we get the newest entry for a key, as
- the list may contain more than one entry for a specific key. */
-
- for (pe = list_last(list_properties); pe != NULL;
- pe = list_prev(list_properties, pe)) {
+ for (pe = list_first(list_properties); pe != NULL;
+ pe = list_next(list_properties, pe)) {
if (strcmp(pe->key, key) == 0)
return pe->value;
}
}
+/* properties_system_add *******************************************************
+
+ Adds a given property to the Java system properties.
+
+*******************************************************************************/
+
+void properties_system_add(java_handle_t *p, const char *key, const char *value)
+{
+ classinfo *c;
+ methodinfo *m;
+ java_handle_t *k;
+ java_handle_t *v;
+
+ /* search for method to add properties */
+
+ LLNI_class_get(p, c);
+
+ m = class_resolveclassmethod(c,
+ utf_put,
+ utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"),
+ NULL,
+ true);
+
+ if (m == NULL)
+ return;
+
+ /* add to the Java system properties */
+
+ k = javastring_new_from_utf_string(key);
+ v = javastring_new_from_utf_string(value);
+
+ (void) vm_call_method(m, p, k, v);
+}
+
+
/* properties_system_add_all ***************************************************
Adds all properties from the properties list to the Java system
properties.
+ ARGUMENTS:
+ p.... is actually a java_util_Properties structure
+
*******************************************************************************/
#if defined(ENABLE_JAVASE)
-void properties_system_add_all(java_util_Properties *p)
+void properties_system_add_all(java_handle_t *p)
{
- list_properties_entry *pe;
- methodinfo *m;
- java_lang_String *key;
- java_lang_String *value;
+ list_properties_entry_t *pe;
+ classinfo *c;
+ methodinfo *m;
+ java_handle_t *key;
+ java_handle_t *value;
/* search for method to add properties */
- m = class_resolveclassmethod(p->header.vftbl->class,
- utf_new_char("put"),
+ LLNI_class_get(p, c);
+
+ m = class_resolveclassmethod(c,
+ utf_put,
utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"),
NULL,
true);
key = javastring_new_from_utf_string(pe->key);
value = javastring_new_from_utf_string(pe->value);
- (void) vm_call_method(m, (java_objectheader *) p, key, value);
+ (void) vm_call_method(m, (java_handle_t *) p, key, value);
}
}
#endif /* defined(ENABLE_JAVASE) */
+/* properties_dump *************************************************************
+
+ Dump all property entries.
+
+*******************************************************************************/
+
+void properties_dump(void)
+{
+ list_t *l;
+ list_properties_entry_t *pe;
+
+ /* For convenience. */
+
+ l = list_properties;
+
+ for (pe = list_first(l); pe != NULL; pe = list_next(l, pe)) {
+ log_println("[properties_dump: key=%s, value=%s]", pe->key, pe->value);
+ }
+}
+
+
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where