* lib/libjava.exp (gcj_invoke): Moved...
* libjava.jni/jni.exp: ...from here.
* libjava.cni/shortfield.out: New file.
* libjava.cni/shortfield.java: New file.
* libjava.cni/natshortfield.cc: New file.
* libjava.cni/natlongfield.cc: New file.
* libjava.cni/longfield.out: New file.
* libjava.cni/longfield.java: New file.
* libjava.cni/cni.exp: New file.
From-SVN: r64702
+2003-03-22 Tom Tromey <tromey@redhat.com>
+
+ * lib/libjava.exp (gcj_invoke): Moved...
+ * libjava.jni/jni.exp: ...from here.
+
+ * libjava.cni/shortfield.out: New file.
+ * libjava.cni/shortfield.java: New file.
+ * libjava.cni/natshortfield.cc: New file.
+ * libjava.cni/natlongfield.cc: New file.
+ * libjava.cni/longfield.out: New file.
+ * libjava.cni/longfield.java: New file.
+
+ * libjava.cni/cni.exp: New file.
+
2003-03-11 Tom Tromey <tromey@redhat.com>
* libjava.lang/initfield.java: New file.
return 1
}
+# Invoke the program and see what happens. Return 0 on failure.
+proc gcj_invoke {program expectFile ld_library_additions} {
+ global env
+ set lib_path $env(LD_LIBRARY_PATH)
+
+ set newval .
+ if {[llength $ld_library_additions] > 0} {
+ append newval :[join $ld_library_additions :]
+ }
+ append newval :$lib_path
+
+ setenv LD_LIBRARY_PATH $newval
+ setenv SHLIB_PATH $newval
+
+ verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"
+
+ set result [libjava_load ./$program]
+ set status [lindex $result 0]
+ set output [lindex $result 1]
+
+ # Restore setting
+ setenv LD_LIBRARY_PATH $lib_path
+ setenv SHLIB_PATH $lib_path
+
+ if {$status != "pass"} {
+ verbose "got $output"
+ fail "$program run"
+ untested "$program output"
+ return 0
+ }
+
+ set id [open $expectFile r]
+ set expected [read $id]
+ close $id
+
+ if {! [string compare $output $expected]} {
+ pass "$program output"
+ return 1
+ } else {
+ fail "$program output"
+ return 0
+ }
+}
+
# Invoke a program and check its output. EXECUTABLE is the program;
# ARGS are the arguments to the program. Returns 1 if tests passed
# (or things were left untested), 0 otherwise.
--- /dev/null
+# Tests for CNI code.
+
+# Compile a single C++ file and produce a .o file. OPTIONS is a list
+# of options to pass to the compiler. Returns 0 on failure, 1 on
+# success.
+proc gcj_cni_compile_cxx_to_o {file {options {}}} {
+ global srcdir
+
+ set name [file rootname [file tail $file]]
+ set oname ${name}.o
+
+ # Find the generated header.
+ lappend options "additional_flags=-I. -I.."
+ # Find libgcj headers.
+ lappend options "additional_flags=-I$srcdir/.."
+
+ set x [libjava_prune_warnings \
+ [target_compile $file $oname object $options]]
+ if {$x != ""} {
+ verbose "target_compile failed: $x" 2
+ fail "[file tail $file] compilation"
+ return 0
+ }
+
+ pass "[file tail $file] compilation"
+ return 1
+}
+
+# Build header files given name of .java file. Return 0 on failure.
+proc gcj_cni_build_headers {file} {
+ set gcjh [find_gcjh]
+ set jvscan [find_jvscan]
+
+ set class_out [string trim \
+ [libjava_prune_warnings \
+ [lindex [local_exec "$jvscan --encoding=UTF-8 $file --list-class" "" "" 300] 1]]]
+ if {[string match "*parse error*" $class_out]} {
+ fail "$file header generation"
+ return 0
+ }
+
+ foreach file [split $class_out] {
+ set x [string trim [libjava_prune_warnings \
+ [lindex [local_exec "$gcjh $file" "" "" 300] 1]]]
+ if {$x != ""} {
+ verbose "local_exec failed: $x" 2
+ fail "$file header generation"
+ return 0
+ }
+ }
+
+ pass "$file header generation"
+ return 1
+}
+
+# Do all the work for a single CNI test. Return 0 on failure.
+proc gcj_cni_test_one {file} {
+ global runtests
+
+ # 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"
+
+ if {! [gcj_cni_build_headers $file]} {
+ # FIXME
+ return 0
+ }
+
+ set cfile [file join [file dirname $file] nat$main.cc]
+ if {! [gcj_cni_compile_cxx_to_o $cfile]} {
+ # FIXME
+ return 0
+ }
+
+ if {! [gcj_link $main $main [list $file nat$main.o]]} {
+ # FIXME
+ return 0
+ }
+
+ if {! [gcj_invoke $main [file rootname $file].out {}]} {
+ # FIXME
+ return 0
+ }
+
+ # When we succeed we remove all our clutter.
+ eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main nat$main.o]
+
+ return 1
+}
+
+# Run the CNI tests.
+proc gcj_cni_run {} {
+ global srcdir subdir
+ global build_triplet host_triplet
+
+ # For now we only test CNI on native builds.
+ if {$build_triplet == $host_triplet} {
+ catch { lsort [glob -nocomplain ${srcdir}/${subdir}/*.java] } srcfiles
+
+ foreach x $srcfiles {
+ gcj_cni_test_one $x
+ }
+ } else {
+ verbose "CNI tests not run in cross-compilation environment"
+ }
+}
+
+gcj_cni_run
--- /dev/null
+public class longfield
+{
+ long lval = 232300;
+ boolean bval = true;
+ String sval = "maude";
+
+ public native void doitc ();
+
+ public void doitj()
+ {
+ System.out.println(lval);
+ System.out.println(bval);
+ System.out.println(sval);
+ }
+
+ public static void main(String[] args)
+ {
+ longfield f = new longfield();
+ f.doitc();
+ f.doitj();
+ }
+}
--- /dev/null
+232300
+true
+maude
+232300
+true
+maude
--- /dev/null
+#include <gcj/cni.h>
+
+#include "longfield.h"
+#include <java/lang/System.h>
+#include <java/io/PrintStream.h>
+
+void
+longfield::doitc ()
+{
+ java::io::PrintStream *ps = java::lang::System::out;
+
+ ps->println(lval);
+ ps->println(bval);
+ ps->println(sval);
+}
--- /dev/null
+#include <stdio.h>
+#include "shortfield.h"
+
+void shortfield::ouch ()
+{
+ printf ("list: %d %d 0x%x\n",
+ modCount,
+ size__,
+ data);
+}
--- /dev/null
+class shortfieldbase
+{
+ short modCount;
+}
+
+public class shortfield extends shortfieldbase
+{
+ short size__;
+ int data;
+
+ native void ouch ();
+
+ public static void main (String[] s)
+ {
+ shortfield f = new shortfield();
+ f.modCount = 99;
+ f.size__ = 2;
+ f.data = 0x12345678;
+ f.ouch();
+ }
+}
--- /dev/null
+list: 99 2 0x12345678
return 1
}
-# Invoke the program and see what happens. Return 0 on failure.
-proc gcj_invoke {program expectFile ld_library_additions} {
- global env
- set lib_path $env(LD_LIBRARY_PATH)
-
- set newval .
- if {[llength $ld_library_additions] > 0} {
- append newval :[join $ld_library_additions :]
- }
- append newval :$lib_path
-
- setenv LD_LIBRARY_PATH $newval
- setenv SHLIB_PATH $newval
-
- verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"
-
- set result [libjava_load ./$program]
- set status [lindex $result 0]
- set output [lindex $result 1]
-
- # Restore setting
- setenv LD_LIBRARY_PATH $lib_path
- setenv SHLIB_PATH $lib_path
-
- if {$status != "pass"} {
- verbose "got $output"
- fail "$program run"
- untested "$program output"
- return 0
- }
-
- set id [open $expectFile r]
- set expected [read $id]
- close $id
-
- if {! [string compare $output $expected]} {
- pass "$program output"
- return 1
- } else {
- fail "$program output"
- return 0
- }
-}
-
# Do all the work for a single JNI test. Return 0 on failure.
proc gcj_jni_test_one {file} {
global runtests