compiler accepts incompatible method reference for Sam conversion

Ali Ebrahimi ali.ebrahimi1781 at gmail.com
Sat Jul 16 00:59:57 PDT 2011


Hi,
for me this still crash with full lambda repo build.
The main reason for this, i think, is that hotspot sub-repo of lambda
repository is not sync with jdkb147(currently, latest tag is jdkb143).

Best Regards,
Ali Ebrahimi

On Wed, Jul 13, 2011 at 1:22 PM, Maurizio Cimadamore <
maurizio.cimadamore at oracle.com> wrote:

> Ali,
> this works for me (using b147 - or the VM bundled in the lambda repo).
> There have been tons of fixes in the MH area lately, so make sure you grab a
> more recent JDK 7 snapshot (I used to see those problems too before the
> latest lambda merge, but now ost of them went away).
>
> Note also that, in cases in which 292 code is still unstable, you can
> switch back to the old generation logic using the -XDuseProxy flag, which
> should remove all 292-related problems (as, by doing so,
> java.lang.reflect.Proxy will be used instead).
>
> I will be pushing a fix for the other issue (incompatible method ref
> erroneously accepted by javac) shortly.
>
> Thanks
> Maurizio
>
>
> On 13/07/11 10:36, Ali Ebrahimi wrote:
>
>> Hi Remi,
>>
>> On 7/13/11, Rémi Forax<forax at univ-mlv.fr>  wrote:
>>
>>> On 07/13/2011 06:01 AM, Ali Ebrahimi wrote:
>>>
>>> Hi Ali,
>>>
>>> ...
>>>
>>>> MethodHandle mh =
>>>> MethodHandles.lookup().**findStatic(MethodHandleTest.**class,
>>>> "sTest", MethodType.methodType(void.**class,int.class,int.class));
>>>> MethodHandle smh = mh.asSpreader(Object[].class,
>>>> mh.type().parameterCount());
>>>>
>>>> smh.invoke(new Object[]{i,i});<==============**=crash
>>>>
>>>> main cause: mh.asSpreader
>>>>
>>>> I don't known this crash appears in jdkb147.
>>>>
>>> What you want here is to use asCollector, not asSpreader.
>>> asSpreader requires that the method as already an object array
>>> and extract the value from it.
>>>
>> May be i'm wrong. but this code picked from MethodHandleProxies class
>>
>>     public static
>>     <T>  T asInterfaceInstance(final Class<T>  intfc, final MethodHandle
>> target) {
>>         final Method sm = getSingleMethod(intfc);
>>         if (sm == null)
>>             throw new IllegalArgumentException("not a single-method
>> interface: "+intfc.getName());
>>         MethodType smMT = MethodType.methodType(sm.**getReturnType(),
>> sm.getParameterTypes());
>>         MethodHandle checkTarget = target.asType(smMT);  // make throw WMT
>>         checkTarget =
>> checkTarget.asType(**checkTarget.type().**changeReturnType(Object.class)*
>> *);
>>         final MethodHandle vaTarget =
>> checkTarget.asSpreader(Object[**].class, smMT.parameterCount());
>>         return intfc.cast(Proxy.**newProxyInstance(
>>                 intfc.getClassLoader(),
>>                 new Class[]{ intfc, WrapperInstance.class },
>>                 new InvocationHandler() {
>>                     private Object getArg(String name) {
>>                         if ((Object)name ==
>> "getWrapperInstanceTarget")  return target;
>>                         if ((Object)name == "getWrapperInstanceType")
>>   return intfc;
>>                         throw new AssertionError();
>>                     }
>>                     public Object invoke(Object proxy, Method method,
>> Object[] args) throws Throwable {
>>                         if (method.getDeclaringClass() ==
>> WrapperInstance.class)
>>                             return getArg(method.getName());
>>                         if (method.equals(sm))
>>                             return vaTarget.invokeExact(args);
>>                         if (isObjectMethod(method))
>>                             return callObjectMethod(this, method, args);
>>                         throw new InternalError();
>>                     }
>>                 }));
>>     }
>>
>> and this results in this crash:
>> class MethodHandleTest{
>> ...
>> public static void sTest(int x,int y){
>>      //   System.out.println("stest");
>>     }
>>
>>   static interface Sam{
>>         void m(int x,int y);
>>     }
>> ..
>> Sam sam = MethodHandleTest#sTest;
>>         sam.m(1,1);<==========
>>
>>  In your example, the call to mh.asSpreader should return a runtime
>>> exception,
>>> I will investigate why it's not the case when I will be at my office :)
>>>
>>>  Best Regards,
>>>> Ali Ebrahimi
>>>>
>>> regards,
>>> Rémi
>>>
>>>
>>> ______________________________**_________________
>>> mlvm-dev mailing list
>>> mlvm-dev at openjdk.java.net
>>> http://mail.openjdk.java.net/**mailman/listinfo/mlvm-dev<http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev>
>>>
>>>  Best Regards,
>> Ali Ebrahimi
>>
>>
>


More information about the lambda-dev mailing list