Hi Uwe,

you're welcome. Note it's up for review now: 
http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-May/041211.html

Best,

Michael

> Am 13.05.2016 um 11:54 schrieb Uwe Schindler <uschind...@apache.org>:
> 
> 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


-- 

 <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

Reply via email to