Adopting JEP 303 (Intrinsics for LDC and INVOKEDYNAMIC) into Amber
Tagir Valeev
amaembo at gmail.com
Wed Apr 19 03:14:08 UTC 2017
Thank you for the hint! It also seems that ClassConstant.of(MH.class) does
not work either and VarHandles are not supported yet. However the following
sample finally worked for me:
import java.lang.invoke.*;
import java.lang.invoke.Constables.*;
import java.lang.reflect.*;
public class MH {
private static void test() {
System.out.println("Hello");
}
public static void main(String[] args) throws Throwable {
final MethodHandle handle = Intrinsics.ldc(
MethodHandleConstant.ofStatic(ClassConstant.of("LMH;"), "test",
MethodTypeConstant.of(ClassConstant.of("V"))));
handle.invokeExact();
}
}
With best regards,
Tagir Valeev.
On Tue, Apr 18, 2017 at 9:13 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> The primitive fields (Constables.VOID and friends) are not yet hooked up;
> for the time being, replace with ClassConstant.of("V").
>
>
> On 4/18/2017 2:17 AM, Tagir Valeev wrote:
>
>> Hello!
>>
>> I tried to play with this, but still no success. Fresh build from
>> constant-folding branch. I tried to compile the following files:
>>
>> // MH.java
>>
>> import java.lang.invoke.*;
>> import java.lang.invoke.Constables.*;
>> import java.lang.reflect.*;
>>
>> public class MH {
>> private static void test() {
>> System.out.println("Hello");
>> }
>>
>>
>> public static void main(String[] args) throws Throwable {
>> final MethodHandle handle = Intrinsics.ldc(
>> MethodHandleConstant.ofStatic(ClassConstant.of(MH.class), "test",
>> MethodTypeConstant.of(Constables.VOID)));
>> handle.invokeExact();
>> }
>>
>> }
>>
>> // VH.java
>> import java.lang.invoke.*;
>> import java.lang.invoke.Constables.*;
>> import java.lang.reflect.*;
>>
>> public class VH {
>> private static volatile int counter;
>>
>> private static final VarHandle COUNTER = Intrinsics.ldc(
>> VarHandleConstant.ofStaticField(ClassConstant.of(VH.class),
>> "counter",
>> Constables.INT));
>>
>> public static void main(String[] args) {
>> System.out.println(COUNTER.getAndAdd(1));
>> System.out.println(COUNTER.getAndAdd(1));
>> }
>> }
>>
>> Building with "javac -XDdoConstantFold=true MH.java" or "javac
>> -XDdoConstantFold=true VH.java",
>> javac silently exists without producing .class file or reporting any
>> error.
>> Tried with -verbose, the output ends like this:
>>
>> [loading /modules/java.base/java/lang/annotation/RetentionPolicy.class]
>> [loading /modules/java.base/java/lang/annotation/Target.class]
>> [loading /modules/java.base/java/lang/annotation/ElementType.class]
>> [checking VH]
>> [loading /modules/java.base/java/io/Serializable.class]
>> [loading /modules/java.base/java/lang/AutoCloseable.class]
>> [loading /modules/java.base/java/lang/Class.class]
>> [loading /modules/java.base/java/lang/invoke/Constable.class]
>> [loading /modules/java.base/java/lang/invoke/Intrinsics.class]
>> [total 1484ms]
>>
>> Without -XDdoConstantFold=true the class file is produced and dies like
>>
>> Exception in thread "main" java.lang.UnsupportedOperationException: no
>> reflective access
>> at java.base/java.lang.invoke.Intrinsics.ldc(Intrinsics.java:42)
>> at MH.main(MH.java:12)
>>
>> Which is expected behavior, I guess.
>>
>> Am I doing something wrong? Could you compile these files on your side?
>> Sorry if my tries look lame: I'm very new to this.
>>
>> With best regards,
>> Tagir Valeev.
>>
>> On Tue, Apr 18, 2017 at 9:07 AM, Vicente Romero <
>> vicente.romero at oracle.com>
>> wrote:
>>
>> Hi,
>>>
>>> Support for JEP 303 has been pushed in the amber repo [1, 2] (branch name
>>> is 'constant-folding'). The development is mature although there are some
>>> fresh areas like using reflection for accessing the API methods.
>>> Reflection
>>> is needed as the classes defined in the API see [1] are not available in
>>> the boot JDK. There is still some ongoing research so some changes to the
>>> API and the code are to be expected in the near future,
>>>
>>> Thanks,
>>> Vicente
>>>
>>>
>>> [1] http://hg.openjdk.java.net/amber/amber/jdk/rev/2eeb80b82c9c
>>> [2] http://hg.openjdk.java.net/amber/amber/langtools/rev/7be70b52c760
>>>
>>>
>>> On 04/17/2017 04:22 PM, Brian Goetz wrote:
>>>
>>> JEP 303 (Intrinsics for LDC and INVOKEDYNAMIC) is hereby adopted into
>>>> Project Amber.
>>>>
>>>> A first draft of the API can be found at:
>>>>
>>>> http://cr.openjdk.java.net/~briangoetz/JDK-8178320/webrev/
>>>>
>>>> Prototype implementation coming soon.
>>>>
>>>>
>>>>
>>>>
>
More information about the amber-dev
mailing list