Uploaded image for project: 'JikesRVM'
  1. JikesRVM
  2. RVM-831

Incomplete implementation of GetFieldID and GetStaticFieldID

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Medium
    • Resolution: Fixed
    • Affects Version/s: 3.1.0
    • Fix Version/s: 3.1.1
    • Component/s: Runtime: JNI
    • Labels:
      None
    • Environment:

      IA32, and Ubuntu

      Description

      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.

        Gliffy Diagrams

          Attachments

            Activity

            Hide
            dgrove David Grove added a comment -

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

            Show
            dgrove David Grove added a comment - The patch is more complex than it needs to be to fix the problem. Working on simpler fix.
            Hide
            dgrove David Grove added a comment -

            fix and test cases committed in r15712.

            Show
            dgrove David Grove added a comment - fix and test cases committed in r15712.
            Hide
            bclee Byeong Lee added a comment -

            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

            Show
            bclee Byeong Lee added a comment - 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
            Hide
            dgrove David Grove added a comment -

            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.

            Show
            dgrove David Grove added a comment - 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.
            Hide
            bclee Byeong Lee added a comment -

            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.

            Show
            bclee Byeong Lee added a comment - 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.
            Hide
            dgrove David Grove added a comment -

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

            Show
            dgrove David Grove added a comment - ok, Appreciate getting nice test cases along with the bug report...thanks!

              People

              • Assignee:
                dgrove David Grove
                Reporter:
                bclee Byeong Lee
              • Votes:
                0 Vote for this issue
                Watchers:
                0 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: