Adopting JEP 303 (Intrinsics for LDC and INVOKEDYNAMIC) into Amber

Vicente Romero vicente.romero at oracle.com
Wed Apr 19 12:50:33 UTC 2017


Hi Tagir,

On 04/18/2017 11:14 PM, Tagir Valeev wrote:
> 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:

yes you are correct VarHandles are not supported yet. Regarding methods 
with arguments of type java.lang.Class, we are considering removing them 
in favor or ClassConstant. Also I have already remove the 
Constables.{VOID, INT, ...} family from the API.

>
>
> 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.

Thanks,
Vicente

>
>
> On Tue, Apr 18, 2017 at 9:13 PM, Brian Goetz <brian.goetz at oracle.com 
> <mailto: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.Int
>         <http://java.lang.invoke.Int>rinsics.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 <mailto: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
>             <http://hg.openjdk.java.net/amber/amber/jdk/rev/2eeb80b82c9c>
>             [2]
>             http://hg.openjdk.java.net/amber/amber/langtools/rev/7be70b52c760
>             <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/
>                 <http://cr.openjdk.java.net/%7Ebriangoetz/JDK-8178320/webrev/>
>
>                 Prototype implementation coming soon.
>
>
>
>
>



More information about the amber-dev mailing list