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