Issue Details (XML | Word | Printable)

Key: RVM-831
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: David Grove
Reporter: Byeong Lee
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
RVM

Incomplete implementation of GetFieldID and GetStaticFieldID

Created: 17/Jun/09 12:13 PM   Updated: 19/Jun/09 11:22 AM   Resolved: 19/Jun/09 11:22 AM
Return to search
Component/s: Runtime: JNI
Affects Version/s: 3.1.0
Fix Version/s: 3.1.1

Time Tracking:
Not Specified

File Attachments: 1. Text File JNIGetFieldID.patch (3 kB)
2. File TestJNIGetFieldID.c (0.8 kB)
3. Java Source File TestJNIGetFieldID.java (1 kB)

Environment: IA32, and Ubuntu

Testcase included: yes
Patch Submitted: Yes


 Description  « Hide

Both GetFieldID and GetStaticFieldID does not correctly run the test case which I attach.
Jikes RVM produced wrong results, which are different from what Hotspot 1.6.0_13 and J9 1.6(SR4) showed:

$rvm TestJNIGetFieldID
instance_a: fail
static_s: fail
static_f: fail

$java -showversion TestJNIGetFieldID
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Server VM (build 11.3-b02, mixed mode)
instance_a: pass
static_s: pass
static_f: pass

$java -showversion TestJNIGetFieldID
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxi3260sr4-20090219_01(SR4))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260-20090215_29883 (JIT enabled, AOT enabled)
J9VM - 20090215_029883_lHdSMr
JIT - r9_20090213_2028
GC - 20090213_AA)
JCL - 20090218_01
instance_a: pass
static_s: pass
static_f: pass

GetFieldID could not handle a hidden instance field, and GetStaticFieldID could not find
a static field in super classes or interfaces. I attach my patch.



David Grove made changes - 17/Jun/09 12:22 PM
Field Original Value New Value
Assignee Byeong Lee [ bclee ] David Grove [ dgrove ]
David Grove added a comment - 17/Jun/09 05:02 PM

The patch is more complex than it needs to be to fix the problem. Working on simpler fix.


David Grove made changes - 17/Jun/09 05:03 PM
Fix Version/s svn head [ 14573 ]
Fix Version/s 3.1.1 [ 14900 ]
David Grove added a comment - 17/Jun/09 09:30 PM

fix and test cases committed in r15712.


David Grove made changes - 17/Jun/09 09:30 PM
Resolution Fixed [ 1 ]
Status Open [ 1 ] Closed [ 6 ]
Byeong Lee added a comment - 18/Jun/09 10:47 PM - edited

The r15712 does not yet complete the GetStaticFieldID, and here is an updated testcase.

m$svn diff  testing/tests/jni/src/TestJNIGetFieldID.java
Index: testing/tests/jni/src/TestJNIGetFieldID.java
===================================================================
--- testing/tests/jni/src/TestJNIGetFieldID.java	(revision 15712)
+++ testing/tests/jni/src/TestJNIGetFieldID.java	(working copy)
@@ -74,6 +74,18 @@
       allTestPass = false;
     }
 
+    try {
+      if (getStaticFinalF(I.class) == 1) {
+        if (verbose) System.out.println("static_I.f: pass");
+      } else {
+        if (verbose) System.out.println("static_I.f: fail");
+        allTestPass = false;
+      }
+    } catch(Throwable e) {
+      if (verbose) System.out.println("static_f: fail");
+      allTestPass = false;
+    }
+
     if (allTestPass) {
       System.out.println("PASS: TestJNIGetFieldID");
     } else {

Here is a failure in Jikes RVM, and successes in Hotspot and J9:

$rvm -showversion -Djava.library.path=./target/tests/byeong/prototype/jni -classpath ./target/tests/byeong/prototype/jni/classes TestJNIGetFieldID
production Jikes RVM 3.1.0+svn (r15711M)
instance_a: pass
static_s: pass
static_f: pass
static_f: fail
FAIL: TestJNIGetFieldID

$java -showversion -Djava.library.path=./target/tests/byeong/prototype/jni -classpath ./target/tests/byeong/prototype/jni/classes TestJNIGetFieldID
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Server VM (build 11.3-b02, mixed mode)

instance_a: pass
static_s: pass
static_f: pass
static_I.f: pass
PASS: TestJNIGetFieldID

$java -showversion -Djava.library.path=./target/tests/byeong/prototype/jni -classpath ./target/tests/byeong/prototype/jni/classes TestJNIGetFieldID
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxi3260sr4-20090219_01(SR4))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux x86-32 jvmxi3260-20090215_29883 (JIT enabled, AOT enabled)
J9VM - 20090215_029883_lHdSMr
JIT  - r9_20090213_2028
GC   - 20090213_AA)
JCL  - 20090218_01

instance_a: pass
static_s: pass
static_f: pass
static_I.f: pass
PASS: TestJNIGetFieldID

Here is a proposed patch and the result:

$svn diff rvm/src/org/jikesrvm/jni/JNIFunctions.java
Index: rvm/src/org/jikesrvm/jni/JNIFunctions.java
===================================================================
--- rvm/src/org/jikesrvm/jni/JNIFunctions.java	(revision 15712)
+++ rvm/src/org/jikesrvm/jni/JNIFunctions.java	(working copy)
@@ -3447,12 +3447,13 @@
             }
           }
         }
-        // Now search all implemented interfaces (includes inherited interfaces)
-        for (RVMClass curClass : rvmType.asClass().getAllImplementedInterfaces()) {
-          for (RVMField field : curClass.getStaticFields()) {
-            if (field.getName() == fieldName && field.getDescriptor() == descriptor) {
+      }
+
+      // Now search all implemented interfaces (includes inherited interfaces)
+      for (RVMClass curClass : rvmType.asClass().getAllImplementedInterfaces()) {
+        for (RVMField field : curClass.getStaticFields()) {
+          if (field.getName() == fieldName && field.getDescriptor() == descriptor) {
               return field.getId();
-            }
           }
         }
       }

$rvm -showversion -Djava.library.path=./target/tests/byeong/prototype/jni -classpath ./target/tests/byeong/prototype/jni/classes TestJNIGetFieldID
prototype Jikes RVM 3.1.0+svn (r15712M)
instance_a: pass
static_s: pass
static_f: pass
static_I.f: pass
PASS: TestJNIGetFieldID

The RVM r15711rejects an interface class, which the JNI specification allows:
". The field may be defined in the class or interface referred to by clazz or in one of its superclass or superinterfaces. "
http://java.sun.com/docs/books/jni/html/functions.html#65115


Byeong Lee made changes - 18/Jun/09 10:47 PM
Status Closed [ 6 ] Reopened [ 4 ]
Resolution Fixed [ 1 ]
David Grove added a comment - 19/Jun/09 10:23 AM

Hi BK,

Are you actually working with a more complex example in which the order of traversing superclasses vs. superinterfaces matters? The current svn head passes the extended test case for me. So unless it is a question of ordering (the field is declared in both an interface of this class and as a field of a superclass and we are supposed to find the interface one in preference to the superclass one), then I don't see why it isn't working for you.


Byeong Lee added a comment - 19/Jun/09 11:03 AM

Hi Dave,

I am not working with the complex example on Jikes RVM. I also observed that the SVN head passed the extended test.
For some reason, my local version of Jikes RVM did not work with the extended test. The RVM-831 is OK to be closed.


David Grove added a comment - 19/Jun/09 11:22 AM

ok, Appreciate getting nice test cases along with the bug report...thanks!


David Grove made changes - 19/Jun/09 11:22 AM
Resolution Fixed [ 1 ]
Status Reopened [ 4 ] Closed [ 6 ]