1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.bcel.generic;
18
19 import java.io.DataOutputStream;
20 import java.io.IOException;
21 import org.apache.bcel.util.ByteSequence;
22
23 /***
24 * RET - Return from subroutine
25 *
26 * <PRE>Stack: ... -> ...</PRE>
27 *
28 * @version $Id: RET.java 386056 2006-03-15 11:31:56Z tcurdt $
29 * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
30 */
31 public class RET extends Instruction implements IndexedInstruction, TypedInstruction {
32
33 private boolean wide;
34 private int index;
35
36
37 /***
38 * Empty constructor needed for the Class.newInstance() statement in
39 * Instruction.readInstruction(). Not to be used otherwise.
40 */
41 RET() {
42 }
43
44
45 public RET(int index) {
46 super(org.apache.bcel.Constants.RET, (short) 2);
47 setIndex(index);
48 }
49
50
51 /***
52 * Dump instruction as byte code to stream out.
53 * @param out Output stream
54 */
55 public void dump( DataOutputStream out ) throws IOException {
56 if (wide) {
57 out.writeByte(org.apache.bcel.Constants.WIDE);
58 }
59 out.writeByte(opcode);
60 if (wide) {
61 out.writeShort(index);
62 } else {
63 out.writeByte(index);
64 }
65 }
66
67
68 private final void setWide() {
69 wide = index > org.apache.bcel.Constants.MAX_BYTE;
70 if (wide) {
71 length = 4;
72 } else {
73 length = 2;
74 }
75 }
76
77
78 /***
79 * Read needed data (e.g. index) from file.
80 */
81 protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException {
82 this.wide = wide;
83 if (wide) {
84 index = bytes.readUnsignedShort();
85 length = 4;
86 } else {
87 index = bytes.readUnsignedByte();
88 length = 2;
89 }
90 }
91
92
93 /***
94 * @return index of local variable containg the return address
95 */
96 public final int getIndex() {
97 return index;
98 }
99
100
101 /***
102 * Set index of local variable containg the return address
103 */
104 public final void setIndex( int n ) {
105 if (n < 0) {
106 throw new ClassGenException("Negative index value: " + n);
107 }
108 index = n;
109 setWide();
110 }
111
112
113 /***
114 * @return mnemonic for instruction
115 */
116 public String toString( boolean verbose ) {
117 return super.toString(verbose) + " " + index;
118 }
119
120
121 /*** @return return address type
122 */
123 public Type getType( ConstantPoolGen cp ) {
124 return ReturnaddressType.NO_TARGET;
125 }
126
127
128 /***
129 * Call corresponding visitor method(s). The order is:
130 * Call visitor methods of implemented interfaces first, then
131 * call methods according to the class hierarchy in descending order,
132 * i.e., the most specific visitXXX() call comes last.
133 *
134 * @param v Visitor object
135 */
136 public void accept( Visitor v ) {
137 v.visitRET(this);
138 }
139 }