Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8151179 address issues raised by JCK team on JEP 274 API
  3. JDK-8152559

MethodHandles.countedLoop(MH, MH, MH, MH) implementation doesn't fit 'implementation requirements'

XMLWordPrintable

    • Icon: Sub-task Sub-task
    • Resolution: Fixed
    • Icon: P3 P3
    • None
    • 9
    • core-libs
    • None

      According to documentation,
      The implementation of this method is equivalent to:

       MethodHandle countedLoop(MethodHandle start, MethodHandle end, MethodHandle init, MethodHandle body) {
           MethodHandle returnVar = dropArguments(identity(init.type().returnType()), 0, int.class, int.class);
           // assume MH_increment and MH_lessThan are handles to x+1 and x<y of type int
           MethodHandle[]
               indexVar = {start, MH_increment}, // i = start; i = i+1
               loopLimit = {end, null, MH_lessThan, returnVar }, // i<end
               bodyClause = {init, dropArguments(body, 1, int.class)}; // v = body(i, v);
           return loop(indexVar, loopLimit, bodyClause);
       }

      Please, observe attached example. In this example handles for 'x+1' and 'x+y' was created as f(x) and f(x,y). In the case of 'prohibited' functions combination, they throws IAE. But these exceptions have slightly different messages:

      found non-effectively identical parameter type lists:
      step: [MethodHandle(int,int)int, null, MethodHandle(Lambdaman,int,int)String]
      pred: [null, MethodHandle(int,int)boolean, null]
      fini: [null, MethodHandle(int,int,String)String, null] (common parameter sequence: [int, int, class java.lang.String, class java.lang.String])



      and


      found non-effectively identical parameter type lists:
      step: [MethodHandle(int)int, null, MethodHandle(Lambdaman,int,int)String]
      pred: [null, MethodHandle(int,int)boolean, null]

      The difference is in the first argument list of 'step'.

      Current jdk9 implementation reference to 'x+1' is f(x,limit)=x+1. It seems this is the origin of difference.
      So, 'implementation requirements' code is not equals to jdk9 implementation.

      Was found on jdk9b108, jdk9b109, jdk9b110.
      Test development in progress, tck_red will be added after test development is completed.
      Example is in attachment.

            mhaupt Michael Haupt
            asolodkaya Anastasiya Solodkaya (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: