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:
parent
c8832aae41
commit
262fa8a4b5
15 changed files with 255 additions and 54 deletions
|
@ -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"
|
||||
}
|
||||
|
|
7
libjava/testsuite/libjava.jni/pr29812.c
Normal file
7
libjava/testsuite/libjava.jni/pr29812.c
Normal file
|
@ -0,0 +1,7 @@
|
|||
#include <pr29812.h>
|
||||
|
||||
void
|
||||
Java_pr29812_baseN (JNIEnv *env, jclass barf)
|
||||
{
|
||||
/* nothing */
|
||||
}
|
19
libjava/testsuite/libjava.jni/pr29812.h
Normal file
19
libjava/testsuite/libjava.jni/pr29812.h
Normal 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__ */
|
BIN
libjava/testsuite/libjava.jni/pr29812.jar
Normal file
BIN
libjava/testsuite/libjava.jni/pr29812.jar
Normal file
Binary file not shown.
25
libjava/testsuite/libjava.jni/pr29812.java
Normal file
25
libjava/testsuite/libjava.jni/pr29812.java
Normal 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);
|
||||
}
|
||||
}
|
0
libjava/testsuite/libjava.jni/pr29812.out
Normal file
0
libjava/testsuite/libjava.jni/pr29812.out
Normal file
26
libjava/testsuite/libjava.jni/pr29812_injar.c
Normal file
26
libjava/testsuite/libjava.jni/pr29812_injar.c
Normal 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);
|
||||
}
|
19
libjava/testsuite/libjava.jni/pr29812_injar.h
Normal file
19
libjava/testsuite/libjava.jni/pr29812_injar.h
Normal 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__ */
|
BIN
libjava/testsuite/libjava.jni/pr29812_injar.jar
Normal file
BIN
libjava/testsuite/libjava.jni/pr29812_injar.jar
Normal file
Binary file not shown.
12
libjava/testsuite/libjava.jni/pr29812_injar.java
Normal file
12
libjava/testsuite/libjava.jni/pr29812_injar.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
public class pr29812_injar
|
||||
{
|
||||
public class inner
|
||||
{
|
||||
}
|
||||
|
||||
static {
|
||||
System.loadLibrary("pr29812_injar");
|
||||
}
|
||||
|
||||
public static native void doit();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue