This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: PR 16923
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Sat, 19 Feb 2005 23:46:58 -0500
- Subject: Patch: PR 16923
Hi,
Here is a fix for PR 16923. We were ignoring -D arguments passed in to
JNI_CreateJavaVM. This patch adds JVM argument support to CNI's
JNI_CreateJavaVM equivalent, JvCreateJavaVM, adds support for parsing -D
options and adds a JNI invocation API test to the testsuite along with
DejaGNU glue to run it.
OK for mainline?
Tom
2005-02-19 Thomas Fitzsimmons <fitzsim@redhat.com>
* jni.cc (JNI_CreateJavaVM): Pass args to _Jv_CreateJavaVM. Move
argument parsing code ...
* prims.cc (_Jv_CreateJavaVM): ... here.
* testsuite/libjava.jni/jni.exp
(gcj_invocation_compile_c_to_binary): New procedure.
(gcj_invocation_test_one): Likewise.
(gcj_jni_run): Run JNI invocation API tests.
* testsuite/libjava.jni/invocation/PR16923.c,
testsuite/libjava.jni/invocation/PR16923.java,
testsuite/libjava.jni/invocation/PR16923.out: New test.
Index: jni.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni.cc,v
retrieving revision 1.94
diff -u -r1.94 jni.cc
--- jni.cc 14 Feb 2005 13:51:29 -0000 1.94
+++ jni.cc 20 Feb 2005 04:20:33 -0000
@@ -2498,7 +2498,7 @@
{
JvAssert (! the_vm);
- _Jv_CreateJavaVM (NULL);
+ _Jv_CreateJavaVM (args);
// FIXME: synchronize
JavaVM *nvm = (JavaVM *) _Jv_MallocUnchecked (sizeof (JavaVM));
@@ -2506,48 +2506,6 @@
return JNI_ERR;
nvm->functions = &_Jv_JNI_InvokeFunctions;
- // Parse the arguments.
- if (args != NULL)
- {
- jint version = * (jint *) args;
- // We only support 1.2 and 1.4.
- if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4)
- return JNI_EVERSION;
- JavaVMInitArgs *ia = reinterpret_cast<JavaVMInitArgs *> (args);
- for (int i = 0; i < ia->nOptions; ++i)
- {
- if (! strcmp (ia->options[i].optionString, "vfprintf")
- || ! strcmp (ia->options[i].optionString, "exit")
- || ! strcmp (ia->options[i].optionString, "abort"))
- {
- // We are required to recognize these, but for now we
- // don't handle them in any way. FIXME.
- continue;
- }
- else if (! strncmp (ia->options[i].optionString,
- "-verbose", sizeof ("-verbose") - 1))
- {
- // We don't do anything with this option either. We
- // might want to make sure the argument is valid, but we
- // don't really care all that much for now.
- continue;
- }
- else if (! strncmp (ia->options[i].optionString, "-D", 2))
- {
- // FIXME.
- continue;
- }
- else if (ia->ignoreUnrecognized)
- {
- if (ia->options[i].optionString[0] == '_'
- || ! strncmp (ia->options[i].optionString, "-X", 2))
- continue;
- }
-
- return JNI_ERR;
- }
- }
-
jint r =_Jv_JNI_AttachCurrentThread (nvm, penv, NULL);
if (r < 0)
return r;
Index: prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.103
diff -u -r1.103 prims.cc
--- prims.cc 16 Feb 2005 04:16:06 -0000 1.103
+++ prims.cc 20 Feb 2005 04:20:34 -0000
@@ -910,15 +910,86 @@
}
jint
-_Jv_CreateJavaVM (void* /*vm_args*/)
+_Jv_CreateJavaVM (void* vm_args)
{
using namespace gcj;
-
+ int option_count = 0;
+
if (runtimeInitialized)
return -1;
runtimeInitialized = true;
+ _Jv_Compiler_Properties = NULL;
+
+ // Parse the arguments.
+ if (vm_args != NULL)
+ {
+ jint version = * (jint *) vm_args;
+ // We only support 1.2 and 1.4.
+ if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4)
+ return JNI_EVERSION;
+ JavaVMInitArgs *ia = reinterpret_cast<JavaVMInitArgs *> (vm_args);
+ for (int i = 0; i < ia->nOptions; ++i)
+ {
+ if (! strcmp (ia->options[i].optionString, "vfprintf")
+ || ! strcmp (ia->options[i].optionString, "exit")
+ || ! strcmp (ia->options[i].optionString, "abort"))
+ {
+ // We are required to recognize these, but for now we
+ // don't handle them in any way. FIXME.
+ continue;
+ }
+ else if (! strncmp (ia->options[i].optionString,
+ "-verbose", sizeof ("-verbose") - 1)
+ || ! strncmp (ia->options[i].optionString,
+ "-verbose:class",
+ sizeof ("-verbose:class") - 1))
+ {
+ gcj::verbose_class_flag = true;
+ continue;
+ }
+ else if (! strncmp (ia->options[i].optionString,
+ "-verbosegc", sizeof ("-verbosegc") - 1)
+ || ! strncmp (ia->options[i].optionString,
+ "-verbose:gc", sizeof ("-verbose:gc") - 1))
+ {
+ // FIXME: we should add functions to boehm-gc that
+ // toggle GC_print_stats, GC_PRINT_ADDRESS_MAP and
+ // GC_print_back_height.
+ }
+ else if (! strncmp (ia->options[i].optionString,
+ "-verbose:jni", sizeof ("-verbose:jni") - 1))
+ {
+ // FIXME: implement
+ }
+ else if (! strncmp (ia->options[i].optionString, "-D", 2))
+ {
+ _Jv_Compiler_Properties = (const char**) realloc
+ (_Jv_Compiler_Properties, (option_count + 1) * sizeof (char*));
+
+ _Jv_Compiler_Properties[option_count++] =
+ strdup (ia->options[i].optionString + 2);
+
+ continue;
+ }
+ else if (ia->ignoreUnrecognized)
+ {
+ if (ia->options[i].optionString[0] == '_'
+ || ! strncmp (ia->options[i].optionString, "-X", 2))
+ continue;
+ }
+
+ return JNI_ERR;
+ }
+ }
+
+ /* Terminate _Jv_Compiler_Properties with a NULL element. */
+ _Jv_Compiler_Properties = (const char**) realloc
+ (_Jv_Compiler_Properties, (option_count + 1) * sizeof (char*));
+
+ _Jv_Compiler_Properties[option_count] = NULL;
+
PROCESS_GCJ_PROPERTIES;
/* Threads must be initialized before the GC, so that it inherits the
Index: testsuite/libjava.jni/jni.exp
===================================================================
RCS file: /cvs/gcc/gcc/libjava/testsuite/libjava.jni/jni.exp,v
retrieving revision 1.17
diff -u -r1.17 jni.exp
--- testsuite/libjava.jni/jni.exp 21 Dec 2004 01:01:07 -0000 1.17
+++ testsuite/libjava.jni/jni.exp 20 Feb 2005 04:20:38 -0000
@@ -181,6 +181,85 @@
return 1
}
+# Compile a single C file and produce binary. OPTIONS is a list of
+# options to pass to the compiler. Returns 0 on failure, 1 on
+# success.
+proc gcj_invocation_compile_c_to_binary {file {options {}}} {
+ global srcdir
+ global host_triplet
+ verbose "options: $options"
+ set options_cxx $options
+ set options ""
+
+ set filename [file tail $file]
+ set name [file rootname $filename]
+
+ # Find jni.h.
+ lappend options "additional_flags=-I$srcdir/../include"
+
+ # Append C++ options
+ lappend options "additional_flags=$options_cxx"
+
+ set x [libjava_prune_warnings \
+ [target_compile $file $name executable $options]]
+ if {$x != ""} {
+ verbose "target_compile failed: $x" 2
+ fail "$filename compilation"
+ return 0
+ }
+
+ pass "$filename compilation"
+ return 1
+}
+
+# Do all the work for a single invocation API test. Return 0 on
+# failure.
+proc gcj_invocation_test_one {file} {
+ global runtests
+ global host_triplet
+ global INTERPRETER
+
+ # The base name. We use it for several purposes.
+ set main [file rootname [file tail $file]]
+ if {! [runtest_file_p $runtests $main]} {
+ # Simply skip it.
+ return 1
+ }
+
+ if {! [bytecompile_file $file [pwd]]} {
+ fail "bytecompile $file"
+ # FIXME - should use `untested' on all remaining tests.
+ # But that is hard.
+ return 0
+ }
+ pass "bytecompile $file"
+
+ set cfile [file rootname $file].c
+ set cxxflags "-lgcj"
+
+ if {! [gcj_invocation_compile_c_to_binary $cfile $cxxflags]} {
+ # FIXME
+ return 0
+ }
+
+ set resultfile [file rootname $file].out
+
+ if {! [gcj_invoke $main $resultfile ""]} {
+ # FIXME
+ return 0
+ }
+
+ # We purposely ignore errors here; we still want to run the other
+ # appropriate tests.
+ set errname [file rootname [file tail $file]]
+
+ # When we succeed we remove all our clutter.
+ eval gcj_cleanup [glob -nocomplain -- ${main}.*] \
+ [list $main]
+
+ return 1
+}
+
# Run the JNI tests.
proc gcj_jni_run {} {
global srcdir subdir
@@ -193,6 +272,13 @@
foreach x $srcfiles {
gcj_jni_test_one $x
}
+
+ # Run JNI invocation API tests
+ catch { lsort [glob -nocomplain ${srcdir}/${subdir}/invocation/*.java] } srcfiles
+
+ foreach x $srcfiles {
+ gcj_invocation_test_one $x
+ }
} else {
verbose "JNI tests not run in cross-compilation environment"
}
Index: testsuite/libjava.jni/invocation/PR16923.c
===================================================================
RCS file: testsuite/libjava.jni/invocation/PR16923.c
diff -N testsuite/libjava.jni/invocation/PR16923.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/invocation/PR16923.c 20 Feb 2005 04:20:38 -0000
@@ -0,0 +1,43 @@
+#include <assert.h>
+#include <jni.h>
+
+union env_union
+{
+ void *void_env;
+ JNIEnv *jni_env;
+};
+
+int
+main (int argc, const char** argv)
+{
+ union env_union tmp;
+ JNIEnv* env;
+ JavaVM* jvm;
+ JavaVMInitArgs vm_args;
+ JavaVMOption options[1];
+ jclass class_id;
+ jmethodID method_id;
+ jint result;
+
+ options[0].optionString = "-DPR16923=optionReceived";
+
+ vm_args.version = JNI_VERSION_1_2;
+ vm_args.ignoreUnrecognized = JNI_TRUE;
+ vm_args.options = options;
+ vm_args.nOptions = 1;
+
+ result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
+ assert (result >= 0);
+
+ env = tmp.jni_env;
+
+ class_id = (*env)->FindClass (env, "PR16923");
+ assert (class_id);
+
+ method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
+ assert (method_id);
+
+ (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
+
+ return 0;
+}
Index: testsuite/libjava.jni/invocation/PR16923.java
===================================================================
RCS file: testsuite/libjava.jni/invocation/PR16923.java
diff -N testsuite/libjava.jni/invocation/PR16923.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/invocation/PR16923.java 20 Feb 2005 04:20:38 -0000
@@ -0,0 +1,7 @@
+public class PR16923
+{
+ public static void printIt ()
+ {
+ System.out.println (System.getProperty ("PR16923"));
+ }
+}
Index: testsuite/libjava.jni/invocation/PR16923.out
===================================================================
RCS file: testsuite/libjava.jni/invocation/PR16923.out
diff -N testsuite/libjava.jni/invocation/PR16923.out
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/invocation/PR16923.out 20 Feb 2005 04:20:38 -0000
@@ -0,0 +1 @@
+optionReceived