1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
6 * Licensed to the Apache Software Foundation (ASF) under one or more
7 * contributor license agreements.  See the NOTICE file distributed with
8 * this work for additional information regarding copyright ownership.
9 * The ASF licenses this file to You under the Apache License, Version 2.0
10 * (the "License"); you may not use this file except in compliance with
11 * the License.  You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22package com.sun.org.apache.bcel.internal.generic;
23
24import java.io.DataOutputStream;
25import java.io.IOException;
26
27import com.sun.org.apache.bcel.internal.Const;
28import com.sun.org.apache.bcel.internal.ExceptionConst;
29
30/**
31 * INVOKESTATIC - Invoke a class (static) method
32 *
33 * <PRE>Stack: ..., [arg1, [arg2 ...]] -&gt; ...</PRE>
34 *
35 * @version $Id: INVOKESTATIC.java 1747278 2016-06-07 17:28:43Z britter $
36 * @see
37 * <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokestatic">
38 * The invokestatic instruction in The Java Virtual Machine Specification</a>
39 */
40public class INVOKESTATIC extends InvokeInstruction {
41
42    /**
43     * Empty constructor needed for the Class.newInstance() statement in
44     * Instruction.readInstruction(). Not to be used otherwise.
45     */
46    INVOKESTATIC() {
47    }
48
49
50    public INVOKESTATIC(final int index) {
51        super(Const.INVOKESTATIC, index);
52    }
53
54
55    /**
56     * Dump instruction as byte code to stream out.
57     * @param out Output stream
58     */
59    @Override
60    public void dump( final DataOutputStream out ) throws IOException {
61      out.writeByte(super.getOpcode());
62      out.writeShort(super.getIndex());
63    }
64
65    @Override
66    public Class<?>[] getExceptions() {
67        return ExceptionConst.createExceptions(ExceptionConst.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION,
68            ExceptionConst.UNSATISFIED_LINK_ERROR,
69            ExceptionConst.INCOMPATIBLE_CLASS_CHANGE_ERROR);
70    }
71
72
73    /**
74     * Call corresponding visitor method(s). The order is:
75     * Call visitor methods of implemented interfaces first, then
76     * call methods according to the class hierarchy in descending order,
77     * i.e., the most specific visitXXX() call comes last.
78     *
79     * @param v Visitor object
80     */
81    @Override
82    public void accept( final Visitor v ) {
83        v.visitExceptionThrower(this);
84        v.visitTypedInstruction(this);
85        v.visitStackConsumer(this);
86        v.visitStackProducer(this);
87        v.visitLoadClass(this);
88        v.visitCPInstruction(this);
89        v.visitFieldOrMethod(this);
90        v.visitInvokeInstruction(this);
91        v.visitINVOKESTATIC(this);
92    }
93}
94