< prev index next >

samples/Main.asm

Print this page

        

@@ -36,17 +36,78 @@
 //
 //    java -cp <asmtools.jar> org.openjdk.asmtools.Main jasm Main.asm
 //
 // See also: https://wiki.openjdk.java.net/display/CodeTools/asmtools
 //
-// NOTE: Uses nashorn internals and so *may* break with later nashorn!
+// NOTE: Uses dynalink API defined by JEP-276 (http://openjdk.java.net/jeps/276)
 
 super public class Main
         version 52:0
 {
 
+private static final Field linker:"Ljdk/dynalink/DynamicLinker;";
 
+/*
+   static {
+        // create dynalink linker factory
+        final DynamicLinkerFactory factory = new DynamicLinkerFactory();
+
+        // create standard linker that can handle Java POJOs
+        linker = factory.createLinker();
+   }
+*/
+static Method "<clinit>":"()V"
+        stack 2 locals 1
+{
+    new     class jdk/dynalink/DynamicLinkerFactory;
+    dup;
+    invokespecial   Method jdk/dynalink/DynamicLinkerFactory."<init>":"()V";
+    astore_0;
+    aload_0;
+    invokevirtual   Method jdk/dynalink/DynamicLinkerFactory.createLinker:"()Ljdk/dynalink/DynamicLinker;";
+    putstatic       Field linker:"Ljdk/dynalink/DynamicLinker;";
+    return;
+}
+
+/*
+    // Bootstrap method used with invokedynamic methods
+
+    public static CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType type) {
+        // use dynalink linker to perform the actual linking
+        return linker.link(
+            new SimpleRelinkableCallSite(
+                new CallSiteDescriptor(
+                    MethodHandles.publicLookup(), 
+                    new NamedOperation(StandardOperation.GET_PROPERTY, name), type)
+            )
+        );
+    }
+
+ */
+public static Method bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"
+        stack 10 locals 3
+{
+    getstatic       Field linker:"Ljdk/dynalink/DynamicLinker;";
+    new     class jdk/dynalink/support/SimpleRelinkableCallSite;
+    dup;
+    new     class jdk/dynalink/CallSiteDescriptor;
+    dup;
+    invokestatic    Method java/lang/invoke/MethodHandles.publicLookup:"()Ljava/lang/invoke/MethodHandles$Lookup;";
+    new     class jdk/dynalink/NamedOperation;
+    dup;
+    getstatic       Field jdk/dynalink/StandardOperation.GET_PROPERTY:"Ljdk/dynalink/StandardOperation;";
+    aload_1;
+    invokespecial   Method jdk/dynalink/NamedOperation."<init>":"(Ljdk/dynalink/Operation;Ljava/lang/Object;)V";
+    aload_2;
+    invokespecial   Method jdk/dynalink/CallSiteDescriptor."<init>":"(Ljava/lang/invoke/MethodHandles$Lookup;Ljdk/dynalink/Operation;Ljava/lang/invoke/MethodType;)V";
+    invokespecial   Method jdk/dynalink/support/SimpleRelinkableCallSite."<init>":"(Ljdk/dynalink/CallSiteDescriptor;)V";
+    invokevirtual   Method jdk/dynalink/DynamicLinker.link:"(Ljdk/dynalink/RelinkableCallSite;)Ljdk/dynalink/RelinkableCallSite;";
+    checkcast       class java/lang/invoke/CallSite;
+    areturn;
+}
+
+// default constructor that does nothing!
 public Method "<init>":"()V"
         stack 1 locals 1
 {
                 aload_0;
                 invokespecial   Method java/lang/Object."<init>":"()V";

@@ -88,14 +149,15 @@
         stack 2 locals 1
 {
                 getstatic       Field java/lang/System.out:"Ljava/io/PrintStream;";
                 aload_0;
 
-                // Using nashorn embedded dynalink linker with the following invokedynamic
+    // Using bootstrap method in this class with the following invokedynamic
+    // which uses dynalink linker. Dynalink's bean linker handles Java beans.
                 // 'length' property on a bean - arrays, lists supported
 
-                invokedynamic   InvokeDynamic REF_invokeStatic:jdk/nashorn/internal/runtime/linker/Bootstrap.bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/CallSite;":"dyn:getProp|getElem|getMethod:length":"(Ljava/lang/Object;)Ljava/lang/Object;" int 0;
+    invokedynamic   InvokeDynamic REF_invokeStatic:Main.bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;":"length":"(Ljava/lang/Object;)Ljava/lang/Object;";
 
                 // print 'length' value
                 invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/Object;)V";
                 return;
 }
< prev index next >