Main.asm revision 1555:376a63a077ee
1202375Srdivacky/* 2202375Srdivacky * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3202375Srdivacky * 4202375Srdivacky * Redistribution and use in source and binary forms, with or without 5202375Srdivacky * modification, are permitted provided that the following conditions 6202375Srdivacky * are met: 7202375Srdivacky * 8202375Srdivacky * - Redistributions of source code must retain the above copyright 9202375Srdivacky * notice, this list of conditions and the following disclaimer. 10202375Srdivacky * 11202375Srdivacky * - Redistributions in binary form must reproduce the above copyright 12202375Srdivacky * notice, this list of conditions and the following disclaimer in the 13202375Srdivacky * documentation and/or other materials provided with the distribution. 14202375Srdivacky * 15226633Sdim * - Neither the name of Oracle nor the names of its 16249423Sdim * contributors may be used to endorse or promote products derived 17249423Sdim * from this software without specific prior written permission. 18234353Sdim * 19202375Srdivacky * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20202375Srdivacky * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21202375Srdivacky * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22202375Srdivacky * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23202375Srdivacky * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24202375Srdivacky * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25202375Srdivacky * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26202375Srdivacky * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27210299Sed * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28202375Srdivacky * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29202375Srdivacky * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30202375Srdivacky */ 31210299Sed 32202375Srdivacky// Simple sample to demonstrate openjdk asmtools assembler with 33249423Sdim// nashorn dynalink linker in a invokedynamic instruction. 34202375Srdivacky// 35224145Sdim// To assemble this file, use the following command: 36224145Sdim// 37239462Sdim// java -cp <asmtools.jar> org.openjdk.asmtools.Main jasm Main.asm 38224145Sdim// 39224145Sdim// See also: https://wiki.openjdk.java.net/display/CodeTools/asmtools 40224145Sdim// 41224145Sdim// NOTE: Uses dynalink API defined by JEP-276 (http://openjdk.java.net/jeps/276) 42224145Sdim 43202375Srdivackysuper public class Main 44202375Srdivacky version 52:0 45202375Srdivacky{ 46210299Sed 47202375Srdivackyprivate static final Field linker:"Ljdk/dynalink/DynamicLinker;"; 48202375Srdivacky 49202375Srdivacky/* 50249423Sdim static { 51202375Srdivacky // create dynalink linker factory 52202375Srdivacky final DynamicLinkerFactory factory = new DynamicLinkerFactory(); 53202375Srdivacky 54202375Srdivacky // create standard linker that can handle Java POJOs 55202375Srdivacky linker = factory.createLinker(); 56202375Srdivacky } 57249423Sdim*/ 58202375Srdivackystatic Method "<clinit>":"()V" 59249423Sdim stack 2 locals 1 60202375Srdivacky{ 61202375Srdivacky new class jdk/dynalink/DynamicLinkerFactory; 62249423Sdim dup; 63202375Srdivacky invokespecial Method jdk/dynalink/DynamicLinkerFactory."<init>":"()V"; 64202375Srdivacky astore_0; 65202375Srdivacky aload_0; 66202375Srdivacky invokevirtual Method jdk/dynalink/DynamicLinkerFactory.createLinker:"()Ljdk/dynalink/DynamicLinker;"; 67202375Srdivacky putstatic Field linker:"Ljdk/dynalink/DynamicLinker;"; 68202375Srdivacky return; 69202375Srdivacky} 70202375Srdivacky 71202375Srdivacky/* 72202375Srdivacky // Bootstrap method used with invokedynamic methods 73202375Srdivacky 74202375Srdivacky public static CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType type) { 75202375Srdivacky // use dynalink linker to perform the actual linking 76202375Srdivacky return linker.link( 77202375Srdivacky new SimpleRelinkableCallSite( 78202375Srdivacky new CallSiteDescriptor( 79202375Srdivacky MethodHandles.publicLookup(), 80202375Srdivacky new NamedOperation(StandardOperation.GET_PROPERTY, name), type) 81243830Sdim ) 82202375Srdivacky ); 83202375Srdivacky } 84226633Sdim 85249423Sdim */ 86202375Srdivackypublic static Method bootstrap:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" 87202375Srdivacky stack 10 locals 3 88202375Srdivacky{ 89202375Srdivacky getstatic Field linker:"Ljdk/dynalink/DynamicLinker;"; 90226633Sdim new class jdk/dynalink/support/SimpleRelinkableCallSite; 91226633Sdim dup; 92202375Srdivacky new class jdk/dynalink/CallSiteDescriptor; 93202375Srdivacky dup; 94202375Srdivacky invokestatic Method java/lang/invoke/MethodHandles.publicLookup:"()Ljava/lang/invoke/MethodHandles$Lookup;"; 95202375Srdivacky new class jdk/dynalink/NamedOperation; 96202375Srdivacky dup; 97202375Srdivacky getstatic Field jdk/dynalink/StandardOperation.GET_PROPERTY:"Ljdk/dynalink/StandardOperation;"; 98202375Srdivacky aload_1; 99202375Srdivacky invokespecial Method jdk/dynalink/NamedOperation."<init>":"(Ljdk/dynalink/Operation;Ljava/lang/Object;)V"; 100221345Sdim aload_2; 101221345Sdim invokespecial Method jdk/dynalink/CallSiteDescriptor."<init>":"(Ljava/lang/invoke/MethodHandles$Lookup;Ljdk/dynalink/Operation;Ljava/lang/invoke/MethodType;)V"; 102202375Srdivacky invokespecial Method jdk/dynalink/support/SimpleRelinkableCallSite."<init>":"(Ljdk/dynalink/CallSiteDescriptor;)V"; 103202375Srdivacky invokevirtual Method jdk/dynalink/DynamicLinker.link:"(Ljdk/dynalink/RelinkableCallSite;)Ljdk/dynalink/RelinkableCallSite;"; 104202375Srdivacky checkcast class java/lang/invoke/CallSite; 105202375Srdivacky areturn; 106202375Srdivacky} 107249423Sdim 108249423Sdim// default constructor that does nothing! 109249423Sdimpublic Method "<init>":"()V" 110249423Sdim stack 1 locals 1 111249423Sdim{ 112249423Sdim aload_0; 113202375Srdivacky invokespecial Method java/lang/Object."<init>":"()V"; 114202375Srdivacky return; 115202375Srdivacky} 116210299Sed 117202375Srdivackypublic static Method main:"([Ljava/lang/String;)V" 118202375Srdivacky stack 2 locals 2 119249423Sdim{ 120202375Srdivacky // List l = new ArrayList(); 121202375Srdivacky new class java/util/ArrayList; 122202375Srdivacky dup; 123202375Srdivacky invokespecial Method java/util/ArrayList."<init>":"()V"; 124202375Srdivacky astore_1; 125202375Srdivacky aload_1; 126202375Srdivacky 127202375Srdivacky // l.add("hello"); 128202375Srdivacky ldc String "hello"; 129202375Srdivacky invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2; 130210299Sed pop; 131202375Srdivacky 132226633Sdim // l.add("world"); 133202375Srdivacky aload_1; 134249423Sdim ldc String "world"; 135210299Sed invokeinterface InterfaceMethod java/util/List.add:"(Ljava/lang/Object;)Z", 2; 136210299Sed pop; 137202375Srdivacky 138226633Sdim // printLength(l); 139202375Srdivacky aload_1; 140249423Sdim invokestatic Method printLength:"(Ljava/lang/Object;)V"; 141202375Srdivacky 142202375Srdivacky // printLength(args); // args is argument of main method 143202375Srdivacky aload_0; 144249423Sdim invokestatic Method printLength:"(Ljava/lang/Object;)V"; 145202375Srdivacky return; 146202375Srdivacky} 147202375Srdivacky 148221345Sdimprivate static Method printLength:"(Ljava/lang/Object;)V" 149202375Srdivacky stack 2 locals 1 150202375Srdivacky{ 151202375Srdivacky getstatic Field java/lang/System.out:"Ljava/io/PrintStream;"; 152223017Sdim aload_0; 153202375Srdivacky 154202375Srdivacky // Using bootstrap method in this class with the following invokedynamic 155202375Srdivacky // which uses dynalink linker. Dynalink's bean linker handles Java beans. 156202375Srdivacky // 'length' property on a bean - arrays, lists supported 157249423Sdim 158202375Srdivacky 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;"; 159202375Srdivacky 160249423Sdim // print 'length' value 161202375Srdivacky invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/Object;)V"; 162202375Srdivacky return; 163202375Srdivacky} 164202375Srdivacky 165202375Srdivacky} // end Class Main 166234353Sdim