MethodHandle for array length

Uwe Schindler uschindler at apache.org
Fri May 13 10:14:55 UTC 2016


Hi,

One addition, maybe add to issue:

If this was added, jdk.dynalink module could use it, too - this was mentioned by Attila already: http://hg.openjdk.java.net/jdk9/dev/nashorn/file/4b118e012ac4/src/jdk.dynalink/share/classes/jdk/dynalink/beans/BeanLinker.java

Uwe

-----
Uwe Schindler
uschindler at apache.org 
ASF Member, Apache Lucene PMC / Committer
Bremen, Germany
http://lucene.apache.org/

> -----Original Message-----
> From: Uwe Schindler [mailto:uschindler at apache.org]
> Sent: Friday, May 13, 2016 11:55 AM
> To: 'Remi Forax' <forax at univ-mlv.fr>
> Cc: 'Michael Haupt' <michael.haupt at oracle.com>; 'Core-Libs-Dev' <core-libs-
> dev at openjdk.java.net>
> Subject: RE: MethodHandle for array length
> 
> Hi,
> 
> OK, thanks for creating an issue!
> 
> Uwe
> 
> -----
> Uwe Schindler
> uschindler at apache.org
> ASF Member, Apache Lucene PMC / Committer
> Bremen, Germany
> http://lucene.apache.org/
> 
> > -----Original Message-----
> > From: Remi Forax [mailto:forax at univ-mlv.fr]
> > Sent: Friday, May 13, 2016 10:37 AM
> > To: Uwe Schindler <uschindler at apache.org>
> > Cc: Michael Haupt <michael.haupt at oracle.com>; Core-Libs-Dev <core-libs-
> > dev at openjdk.java.net>
> > Subject: Re: MethodHandle for array length
> >
> > Hi Uwe,
> > I was planning to add a bug for this feature but it seems that Michael was
> > faster than me,
> >   https://bugs.openjdk.java.net/browse/JDK-8156915
> >
> > regards,
> > Rémi
> >
> > ----- Mail original -----
> > > De: "Uwe Schindler" <uschindler at apache.org>
> > > À: "Michael Haupt" <michael.haupt at oracle.com>, "Core-Libs-Dev"
> <core-
> > libs-dev at openjdk.java.net>
> > > Envoyé: Jeudi 12 Mai 2016 14:34:34
> > > Objet: RE: MethodHandle for array length
> > >
> > > Hi Michael,
> > >
> > > > > Am 11.05.2016 um 21:35 schrieb Uwe Schindler
> > <uschindler at apache.org>:
> > > > > With Java 9 this gets a bit worse: There is no "easy way" with the
> > > > MethodHanldes class to generate a MethodHandles.countedLoop() on
> all
> > > > elements of an array:
> > > > >
> > > > > public static MethodHandle countedLoop(MethodHandle iterations,
> > > > MethodHandle init, MethodHandle  body) [new in Java 9]
> > > >
> > > > this isn't a remedy when you need the index in each iteration, but you
> > can
> > > > generate a loop over all elements of an array using iteratedLoop(), as
> > > > illustrated by this test from LoopCombinatorTest:
> > > >
> > > > @Test
> > > > public static void testIterateSum() throws Throwable {
> > > >     // Integer[] a = new Integer[]{1,2,3,4,5,6}; int sum = 0; for (int e :
> > > >     a) { sum
> > > > += e; } return sum; => 21
> > > >     MethodHandle loop =
> > > > MethodHandles.iteratedLoop(Iterate.MH_sumIterator,
> > Iterate.MH_sumInit,
> > > > Iterate.MH_sumStep);
> > > >     assertEquals(Iterate.MT_sum, loop.type());
> > > >     assertEquals(21, loop.invoke(new Integer[]{1, 2, 3, 4, 5, 6}));
> > > > }
> > > >
> > > > ... where MH_sumIterator is a handle to this method:
> > > >
> > > > static Iterator<Integer> sumIterator(Integer[] a) {
> > > >     return Arrays.asList(a).iterator();
> > > > }
> > >
> > > Of course this works, too.
> > >
> > > My proposal or question here was more about the API inconsistency in
> > general.
> > > You can do a lot here and there, you can implement effective or
> > > non-effective loops with MethodHandles, but still the following holds
> true:
> > > java.lang.invoke.MethodHandles is missing an accessor for
> "array.length",
> > > which is not understandable. The "countedLoop" here was just an
> example
> > use
> > > case (if that one is great or not does not matter), it was just posted to
> > > actually show the API and how it *could* be used.
> > >
> > > The real example from our script engine was not related to loops, it was
> an
> > > actual invokedynamic callsite implementation where it was not possible
> to
> > > figure out how to get a method handle to the very special arraylength
> byte
> > > code, aka "array.length javac sugar". Everything else to handle arrays is
> > > there at one single place, but the array length is missing and you get very
> > > annoyed. If you are not so familiar to bytecode and the mechanics
> behind,
> > > you have a very hard time to find out how to do this: the intuitive
> > > solutions does not work: "array.length" -> aha it’s a field, so let's try
> > > Lookup.findGetter(long[].class, "length", int.class) -> does not work!
> > >
> > > What is so hard to accept the proposal to have
> > > MethodHandles.arrayLengthGetter, implemented in the most effective
> > way (as a
> > > methodhandle that solely calls the special bytecode "arraylength")? In
> fact
> > > thais is like a 10 liner to implement + Javadocs. No need to delay a
> > > release, there are still changes in JDK 9 going on that are far more risky
> > > than this.
> > >
> > > Best,
> > > Uwe
> > >
> > > > Best,
> > > >
> > > > Michael
> > > >
> > > > --
> > > >
> > > >  <http://www.oracle.com/>
> > > > Dr. Michael Haupt | Principal Member of Technical Staff
> > > > Phone: +49 331 200 7277 | Fax: +49 331 200 7561
> > > > Oracle Java Platform Group | LangTools Team | Nashorn
> > > > Oracle Deutschland B.V. & Co. KG | Schiffbauergasse 14 | 14467
> Potsdam,
> > > > Germany
> > > >
> > > > ORACLE Deutschland B.V. & Co. KG | Hauptverwaltung: Riesstraße 25,
> D-
> > > > 80992 München
> > > > Registergericht: Amtsgericht München, HRA 95603
> > > >
> > > > Komplementärin: ORACLE Deutschland Verwaltung B.V. |
> > Hertogswetering
> > > > 163/167, 3543 AS Utrecht, Niederlande
> > > > Handelsregister der Handelskammer Midden-Nederland, Nr. 30143697
> > > > Geschäftsführer: Alexander van der Ven, Jan Schultheiss, Val Maher
> > > >  <http://www.oracle.com/commitment>	Oracle is committed to
> > > > developing practices and products that help protect the environment
> > >
> > >




More information about the core-libs-dev mailing list