View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   package com.sun.org.apache.bcel.internal.generic;
6   
7   /* ====================================================================
8    * The Apache Software License, Version 1.1
9    *
10   * Copyright (c) 2001 The Apache Software Foundation.  All rights
11   * reserved.
12   *
13   * Redistribution and use in source and binary forms, with or without
14   * modification, are permitted provided that the following conditions
15   * are met:
16   *
17   * 1. Redistributions of source code must retain the above copyright
18   *    notice, this list of conditions and the following disclaimer.
19   *
20   * 2. Redistributions in binary form must reproduce the above copyright
21   *    notice, this list of conditions and the following disclaimer in
22   *    the documentation and/or other materials provided with the
23   *    distribution.
24   *
25   * 3. The end-user documentation included with the redistribution,
26   *    if any, must include the following acknowledgment:
27   *       "This product includes software developed by the
28   *        Apache Software Foundation (http://www.apache.org/)."
29   *    Alternately, this acknowledgment may appear in the software itself,
30   *    if and wherever such third-party acknowledgments normally appear.
31   *
32   * 4. The names "Apache" and "Apache Software Foundation" and
33   *    "Apache BCEL" must not be used to endorse or promote products
34   *    derived from this software without prior written permission. For
35   *    written permission, please contact apache@apache.org.
36   *
37   * 5. Products derived from this software may not be called "Apache",
38   *    "Apache BCEL", nor may "Apache" appear in their name, without
39   *    prior written permission of the Apache Software Foundation.
40   *
41   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52   * SUCH DAMAGE.
53   * ====================================================================
54   *
55   * This software consists of voluntary contributions made by many
56   * individuals on behalf of the Apache Software Foundation.  For more
57   * information on the Apache Software Foundation, please see
58   * <http://www.apache.org/>.
59   */
60  import com.sun.org.apache.bcel.internal.Constants;
61  import com.sun.org.apache.bcel.internal.classfile.*;
62  import java.util.StringTokenizer;
63  
64  /**
65   * Super class for the INVOKExxx family of instructions.
66   *
67   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
68   */
69  public abstract class InvokeInstruction extends FieldOrMethod
70    implements ExceptionThrower, TypedInstruction, StackConsumer, StackProducer {
71    /**
72     * Empty constructor needed for the Class.newInstance() statement in
73     * Instruction.readInstruction(). Not to be used otherwise.
74     */
75    InvokeInstruction() {}
76  
77    /**
78     * @param index to constant pool
79     */
80    protected InvokeInstruction(short opcode, int index) {
81      super(opcode, index);
82    }
83  
84    /**
85     * @return mnemonic for instruction with symbolic references resolved
86     */
87    public String toString(ConstantPool cp) {
88      Constant        c   = cp.getConstant(index);
89      StringTokenizer tok = new StringTokenizer(cp.constantToString(c));
90  
91      return Constants.OPCODE_NAMES[opcode] + " " +
92        tok.nextToken().replace('.', '/') + tok.nextToken();
93    }
94  
95    /**
96     * Also works for instructions whose stack effect depends on the
97     * constant pool entry they reference.
98     * @return Number of words consumed from stack by this instruction
99     */
100   public int consumeStack(ConstantPoolGen cpg) {
101       String signature = getSignature(cpg);
102       Type[] args      = Type.getArgumentTypes(signature);
103       int    sum;
104 
105       if(opcode == Constants.INVOKESTATIC)
106         sum = 0;
107       else
108         sum = 1;  // this reference
109 
110       int n = args.length;
111       for (int i = 0; i < n; i++)
112         sum += args[i].getSize();
113 
114       return sum;
115    }
116 
117   /**
118    * Also works for instructions whose stack effect depends on the
119    * constant pool entry they reference.
120    * @return Number of words produced onto stack by this instruction
121    */
122   public int produceStack(ConstantPoolGen cpg) {
123     return getReturnType(cpg).getSize();
124   }
125 
126   /** @return return type of referenced method.
127    */
128   public Type getType(ConstantPoolGen cpg) {
129     return getReturnType(cpg);
130   }
131 
132   /** @return name of referenced method.
133    */
134   public String getMethodName(ConstantPoolGen cpg) {
135     return getName(cpg);
136   }
137 
138   /** @return return type of referenced method.
139    */
140   public Type getReturnType(ConstantPoolGen cpg) {
141     return Type.getReturnType(getSignature(cpg));
142   }
143 
144   /** @return argument types of referenced method.
145    */
146   public Type[] getArgumentTypes(ConstantPoolGen cpg) {
147     return Type.getArgumentTypes(getSignature(cpg));
148   }
149 }