001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License. 
016     *
017     */
018    package org.apache.bcel.generic;
019    
020    import java.io.DataOutputStream;
021    import java.io.IOException;
022    import org.apache.bcel.util.ByteSequence;
023    
024    /** 
025     * JSR_W - Jump to subroutine
026     *
027     * @version $Id: JSR_W.java 1152072 2011-07-29 01:54:05Z dbrosius $
028     * @author  <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
029     */
030    public class JSR_W extends JsrInstruction {
031    
032        private static final long serialVersionUID = -7352049131416924650L;
033    
034    
035        /**
036         * Empty constructor needed for the Class.newInstance() statement in
037         * Instruction.readInstruction(). Not to be used otherwise.
038         */
039        JSR_W() {
040        }
041    
042    
043        public JSR_W(InstructionHandle target) {
044            super(org.apache.bcel.Constants.JSR_W, target);
045            length = 5;
046        }
047    
048    
049        /**
050         * Dump instruction as byte code to stream out.
051         * @param out Output stream
052         */
053        @Override
054        public void dump( DataOutputStream out ) throws IOException {
055            index = getTargetOffset();
056            out.writeByte(opcode);
057            out.writeInt(index);
058        }
059    
060    
061        /**
062         * Read needed data (e.g. index) from file.
063         */
064        @Override
065        protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException {
066            index = bytes.readInt();
067            length = 5;
068        }
069    
070    
071        /**
072         * Call corresponding visitor method(s). The order is:
073         * Call visitor methods of implemented interfaces first, then
074         * call methods according to the class hierarchy in descending order,
075         * i.e., the most specific visitXXX() call comes last.
076         *
077         * @param v Visitor object
078         */
079        @Override
080        public void accept( Visitor v ) {
081            v.visitStackProducer(this);
082            v.visitBranchInstruction(this);
083            v.visitJsrInstruction(this);
084            v.visitJSR_W(this);
085        }
086    }