Hi, OK, thanks for creating an issue!
Uwe ----- Uwe Schindler uschind...@apache.org ASF Member, Apache Lucene PMC / Committer Bremen, Germany http://lucene.apache.org/ > -----Original Message----- > From: Remi Forax [mailto:fo...@univ-mlv.fr] > Sent: Friday, May 13, 2016 10:37 AM > To: Uwe Schindler <uschind...@apache.org> > Cc: Michael Haupt <michael.ha...@oracle.com>; Core-Libs-Dev <core-libs- > d...@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" <uschind...@apache.org> > > À: "Michael Haupt" <michael.ha...@oracle.com>, "Core-Libs-Dev" <core- > libs-...@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 > <uschind...@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 > > > >