libjava.exp (gcj_invoke): Moved...

* 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
This commit is contained in:
Tom Tromey 2003-03-22 07:14:53 +00:00 committed by Tom Tromey
parent 442c0874ea
commit 6932a1994e
10 changed files with 252 additions and 44 deletions

View file

@ -1,3 +1,17 @@
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.

View file

@ -457,6 +457,50 @@ proc gcj_link {program main files {options {}}} {
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.

View file

@ -0,0 +1,119 @@
# 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

View file

@ -0,0 +1,22 @@
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();
}
}

View file

@ -0,0 +1,6 @@
232300
true
maude
232300
true
maude

View file

@ -0,0 +1,15 @@
#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);
}

View file

@ -0,0 +1,10 @@
#include <stdio.h>
#include "shortfield.h"
void shortfield::ouch ()
{
printf ("list: %d %d 0x%x\n",
modCount,
size__,
data);
}

View file

@ -0,0 +1,21 @@
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();
}
}

View file

@ -0,0 +1 @@
list: 99 2 0x12345678

View file

@ -43,50 +43,6 @@ proc gcj_jni_build_header {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
}
}
# Do all the work for a single JNI test. Return 0 on failure.
proc gcj_jni_test_one {file} {
global runtests