re PR java/29812 (env->klass value is not updated during the native calls)

PR java/29812:
	* testsuite/libjava.jni/pr29812.java: New file.
	* testsuite/libjava.jni/pr29812_injar.java: New file.
	* testsuite/libjava.jni/pr29812_injar.jar: New file.
	* testsuite/libjava.jni/pr29812.out: New file.
	* testsuite/libjava.jni/pr29812_injar.c: New file.
	* testsuite/libjava.jni/pr29812_injar.h: New file.
	* testsuite/libjava.jni/pr29812.jar: New file.
	* testsuite/libjava.jni/pr29812.c: New file.
	* testsuite/libjava.jni/pr29812.h: New file.
	* testsuite/libjava.jni/jni.exp (gcj_jni_get_cxxflags_invocation):
	New proc.
	(gcj_jni_invocation_test_one): Use it.
	(gcj_jni_pr29812): New proc.
	(gcj_jni_run): Use it.
	* java/lang/natRuntime.cc (_load): Push a new system frame before
	calling JNI_OnLoad.
	* include/jvm.h (_Jv_JNI_PopSystemFrame): Declare.
	(_Jv_GetJNIEnvNewFrameWithLoader): Likewise.
	* jni.cc (struct _Jv_JNI_LocalFrame) <marker>: Now unsigned char.
	<allocated_p>: Now bool.
	<loader>: New field.
	(_Jv_JNI_EnsureLocalCapacity): Updated.
	(_Jv_JNI_NewLocalRef): Likewise.
	(_Jv_JNI_NewLocalRef): Likewise.
	(_Jv_JNI_PopLocalFrame): Likewise.
	(_Jv_JNI_FindClass): Likewise.
	(_Jv_GetJNIEnvNewFrame): Likewise.
	(_Jv_JNI_AttachCurrentThread): Likewise.
	(_Jv_GetJNIEnvNewFrameWithLoader): New function.
	(_Jv_GetJNIEnvNewFrame): Use it.
	* include/jni_md.h (_CLASSPATH_JNIENV_CONTENTS): Removed 'klass'.

From-SVN: r121064
This commit is contained in:
Tom Tromey 2007-01-22 23:04:16 +00:00 committed by Tom Tromey
parent c8832aae41
commit 262fa8a4b5
15 changed files with 255 additions and 54 deletions

View file

@ -101,7 +101,8 @@ proc gcj_jni_test_one {file} {
# The base name. We use it for several purposes.
set main [file rootname [file tail $file]]
if {! [runtest_file_p $runtests $main]} {
if {! [runtest_file_p $runtests $main]
|| $main == "pr29812" || $main == "pr29812_injar"} {
# Simply skip it.
return 1
}
@ -235,6 +236,33 @@ proc gcj_jni_invocation_compile_c_to_binary {file {options {}}} {
return 1
}
proc gcj_jni_get_cxxflags_invocation {} {
# Darwin needs -liconv linked, otherwise we get some unresolved.
# If you're building the compiler with --prefix set to a place
# where it's not yet installed, then the linker won't be able to
# find the libgcc used by libffi.dylib. We could pass the
# -dylib_file option, but that's complicated, and it's much easier
# to just make the linker find libgcc using -L options.
# Similar logic applies to libgcj.
if { [istarget "*-*-darwin*"] } {
set cxxflags "-L../.libs -shared-libgcc -ljvm -lgcj -liconv"
} else {
global LIBJAVA
if [info exists LIBJAVA] {
set libjava $LIBJAVA;
} else {
set libjava [libjava_find_lib libjava gcj]
}
set cxxflags "$libjava -ljvm"
}
if { [istarget "*-*-solaris*"] } {
lappend cxxflags "-lsocket"
}
return $cxxflags
}
# Do all the work for a single invocation API test. Return 0 on
# failure.
proc gcj_jni_invocation_test_one {file} {
@ -259,29 +287,8 @@ proc gcj_jni_invocation_test_one {file} {
# pass "bytecompile $file"
set cfile [file rootname $file].c
# Darwin needs -liconv linked, otherwise we get some unresolved.
# If you're building the compiler with --prefix set to a place
# where it's not yet installed, then the linker won't be able to
# find the libgcc used by libffi.dylib. We could pass the
# -dylib_file option, but that's complicated, and it's much easier
# to just make the linker find libgcc using -L options.
# Similar logic applies to libgcj.
if { [istarget "*-*-darwin*"] } {
set cxxflags "-L../.libs -shared-libgcc -ljvm -lgcj -liconv"
} else {
global LIBJAVA
if [info exists LIBJAVA] {
set libjava $LIBJAVA;
} else {
set libjava [libjava_find_lib libjava gcj]
}
set cxxflags "$libjava -ljvm"
}
if { [istarget "*-*-solaris*"] } {
lappend cxxflags "-lsocket"
}
set cxxflags [gcj_jni_get_cxxflags_invocation]
if {! [gcj_jni_invocation_compile_c_to_binary $cfile $cxxflags]} {
# FIXME
return 0
@ -309,6 +316,40 @@ proc gcj_jni_invocation_test_one {file} {
return 1
}
proc gcj_jni_pr29812 {} {
global srcdir subdir
global INTERPRETER runtests
# Set up a global we need.
libjava_arguments
set b ${srcdir}/${subdir}
if {! [runtest_file_p $runtests pr29812]} {
# Simply skip it.
return 1
}
if {! [gcj_jni_compile_c_to_so $b/pr29812.c ""]} {
return 0
}
if {! [gcj_jni_compile_c_to_so $b/pr29812_injar.c ""]} {
return 0
}
set gij [libjava_find_gij]
if {$INTERPRETER == "yes" && $gij != ""} {
if {! [libjava_invoke pr29812 "gij test" opts $gij \
"" $b/pr29812.out "" \
-classpath $b/pr29812.jar pr29812 $b/pr29812_injar.jar]} {
return 0
}
}
# When we succeed we remove all our clutter.
eval gcj_cleanup [glob -nocomplain -- *pr29812*]
}
# Run the JNI tests.
proc gcj_jni_run {} {
global srcdir subdir
@ -328,6 +369,8 @@ proc gcj_jni_run {} {
foreach x $srcfiles {
gcj_jni_invocation_test_one $x
}
gcj_jni_pr29812
} else {
verbose "JNI tests not run in cross-compilation environment"
}

View file

@ -0,0 +1,7 @@
#include <pr29812.h>
void
Java_pr29812_baseN (JNIEnv *env, jclass barf)
{
/* nothing */
}

View file

@ -0,0 +1,19 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#ifndef __pr29812__
#define __pr29812__
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT void JNICALL Java_pr29812_baseN (JNIEnv *env, jclass);
#ifdef __cplusplus
}
#endif
#endif /* __pr29812__ */

Binary file not shown.

View file

@ -0,0 +1,25 @@
import java.io.File;
import java.net.*;
import java.lang.reflect.Method;
public class pr29812
{
static {
System.loadLibrary("pr29812");
}
public static native void baseN();
public static void main(String[] args) throws Throwable
{
// Make sure JNI environment is initialized.
baseN();
File jar = new File(args[0]);
URL u = jar.toURL();
URLClassLoader uc = new URLClassLoader(new URL[] { u });
Class k = uc.loadClass("pr29812_injar");
Method m = k.getMethod("doit", (Class[]) null);
m.invoke(null, (Object[]) null);
}
}

View file

@ -0,0 +1,26 @@
#include <stdlib.h>
#include <assert.h>
#include <pr29812_injar.h>
JNIEXPORT jint JNICALL
JNI_OnLoad (JavaVM *vm, void *nothing)
{
JNIEnv *env;
jint r;
jclass k;
r = (*vm)->GetEnv (vm, (void **) &env, JNI_VERSION_1_2);
assert (r == JNI_OK);
k = (*env)->FindClass (env, "pr29812_injar$inner");
assert (k != NULL);
return JNI_VERSION_1_2;
}
void
Java_pr29812_1injar_doit (JNIEnv *env, jclass b)
{
jclass k = (*env)->FindClass(env, "pr29812_injar$inner");
assert (k != NULL);
}

View file

@ -0,0 +1,19 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#ifndef __pr29812_1injar__
#define __pr29812_1injar__
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT void JNICALL Java_pr29812_1injar_doit (JNIEnv *env, jclass);
#ifdef __cplusplus
}
#endif
#endif /* __pr29812_1injar__ */

Binary file not shown.

View file

@ -0,0 +1,12 @@
public class pr29812_injar
{
public class inner
{
}
static {
System.loadLibrary("pr29812_injar");
}
public static native void doit();
}