• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // ASM: a very small and fast Java bytecode manipulation framework
2 // Copyright (c) 2000-2011 INRIA, France Telecom
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions
7 // are met:
8 // 1. Redistributions of source code must retain the above copyright
9 //    notice, this list of conditions and the following disclaimer.
10 // 2. Redistributions in binary form must reproduce the above copyright
11 //    notice, this list of conditions and the following disclaimer in the
12 //    documentation and/or other materials provided with the distribution.
13 // 3. Neither the name of the copyright holders nor the names of its
14 //    contributors may be used to endorse or promote products derived from
15 //    this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 // THE POSSIBILITY OF SUCH DAMAGE.
28 package org.objectweb.asm.tree;
29 
30 import java.util.Map;
31 import org.objectweb.asm.Handle;
32 import org.objectweb.asm.MethodVisitor;
33 import org.objectweb.asm.Opcodes;
34 
35 /**
36  * A node that represents an invokedynamic instruction.
37  *
38  * @author Remi Forax
39  */
40 public class InvokeDynamicInsnNode extends AbstractInsnNode {
41 
42   /** The method's name. */
43   public String name;
44 
45   /** The method's descriptor (see {@link org.objectweb.asm.Type}). */
46   public String desc;
47 
48   /** The bootstrap method. */
49   public Handle bsm;
50 
51   /** The bootstrap method constant arguments. */
52   public Object[] bsmArgs;
53 
54   /**
55    * Constructs a new {@link InvokeDynamicInsnNode}.
56    *
57    * @param name the method's name.
58    * @param descriptor the method's descriptor (see {@link org.objectweb.asm.Type}).
59    * @param bootstrapMethodHandle the bootstrap method.
60    * @param bootstrapMethodArguments the bootstrap method constant arguments. Each argument must be
61    *     an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String}, {@link
62    *     org.objectweb.asm.Type} or {@link Handle} value. This method is allowed to modify the
63    *     content of the array so a caller should expect that this array may change.
64    */
InvokeDynamicInsnNode( final String name, final String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments)65   public InvokeDynamicInsnNode(
66       final String name,
67       final String descriptor,
68       final Handle bootstrapMethodHandle,
69       final Object... bootstrapMethodArguments) {
70     super(Opcodes.INVOKEDYNAMIC);
71     this.name = name;
72     this.desc = descriptor;
73     this.bsm = bootstrapMethodHandle;
74     this.bsmArgs = bootstrapMethodArguments; // NOPMD(ArrayIsStoredDirectly): public field.
75   }
76 
77   @Override
getType()78   public int getType() {
79     return INVOKE_DYNAMIC_INSN;
80   }
81 
82   @Override
accept(final MethodVisitor methodVisitor)83   public void accept(final MethodVisitor methodVisitor) {
84     methodVisitor.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
85     acceptAnnotations(methodVisitor);
86   }
87 
88   @Override
clone(final Map<LabelNode, LabelNode> clonedLabels)89   public AbstractInsnNode clone(final Map<LabelNode, LabelNode> clonedLabels) {
90     return new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs).cloneAnnotations(this);
91   }
92 }
93