1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.bcel.classfile;
20
21 import java.io.DataInput;
22 import java.io.DataOutputStream;
23 import java.io.IOException;
24 import java.util.Arrays;
25 import java.util.Iterator;
26 import java.util.stream.Stream;
27
28 import org.apache.bcel.Const;
29 import org.apache.bcel.util.Args;
30
31
32
33
34
35
36
37
38 public class LocalVariableTable extends Attribute implements Iterable<LocalVariable> {
39
40 private static final LocalVariable[] EMPTY_ARRAY = {};
41
42 private LocalVariable[] localVariableTable;
43
44
45
46
47
48
49
50
51
52
53 LocalVariableTable(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException {
54 this(nameIndex, length, (LocalVariable[]) null, constantPool);
55 final int localVariableTableLength = input.readUnsignedShort();
56 localVariableTable = new LocalVariable[localVariableTableLength];
57 for (int i = 0; i < localVariableTableLength; i++) {
58 localVariableTable[i] = new LocalVariable(input, constantPool);
59 }
60 }
61
62
63
64
65
66
67
68
69
70 public LocalVariableTable(final int nameIndex, final int length, final LocalVariable[] localVariableTable, final ConstantPool constantPool) {
71 super(Const.ATTR_LOCAL_VARIABLE_TABLE, nameIndex, length, constantPool);
72 this.localVariableTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY;
73 Args.requireU2(this.localVariableTable.length, "localVariableTable.length");
74 }
75
76
77
78
79
80
81
82 public LocalVariableTable(final LocalVariableTable c) {
83 this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), c.getConstantPool());
84 }
85
86
87
88
89
90
91
92 @Override
93 public void accept(final Visitor v) {
94 v.visitLocalVariableTable(this);
95 }
96
97
98
99
100 @Override
101 public Attribute copy(final ConstantPool constantPool) {
102 final LocalVariableTable c = (LocalVariableTable) clone();
103 c.localVariableTable = new LocalVariable[localVariableTable.length];
104 Arrays.setAll(c.localVariableTable, i -> localVariableTable[i].copy());
105 c.setConstantPool(constantPool);
106 return c;
107 }
108
109
110
111
112
113
114
115 @Override
116 public final void dump(final DataOutputStream file) throws IOException {
117 super.dump(file);
118 file.writeShort(Args.requireU2(localVariableTable.length, "localVariableTable.length"));
119 for (final LocalVariable variable : localVariableTable) {
120 variable.dump(file);
121 }
122 }
123
124
125
126
127
128
129
130
131 @java.lang.Deprecated
132 public final LocalVariable getLocalVariable(final int index) {
133 for (final LocalVariable variable : localVariableTable) {
134 if (variable.getIndex() == index) {
135 return variable;
136 }
137 }
138 return null;
139 }
140
141
142
143
144
145
146
147
148 public final LocalVariable getLocalVariable(final int index, final int pc) {
149 for (final LocalVariable variable : localVariableTable) {
150 if (variable.getIndex() == index) {
151 final int startPc = variable.getStartPC();
152 final int endPc = startPc + variable.getLength();
153 if (pc >= startPc && pc < endPc) {
154 return variable;
155 }
156 }
157 }
158 return null;
159 }
160
161
162
163
164
165
166 public final LocalVariable[] getLocalVariableTable() {
167 return localVariableTable;
168 }
169
170
171
172
173
174
175 public final int getTableLength() {
176 return localVariableTable.length;
177 }
178
179 @Override
180 public Iterator<LocalVariable> iterator() {
181 return Stream.of(localVariableTable).iterator();
182 }
183
184
185
186
187
188
189 public final void setLocalVariableTable(final LocalVariable[] localVariableTable) {
190 this.localVariableTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY;
191 }
192
193
194
195
196 @Override
197 public final String toString() {
198 final StringBuilder buf = new StringBuilder();
199 for (int i = 0; i < localVariableTable.length; i++) {
200 buf.append(localVariableTable[i]);
201 if (i < localVariableTable.length - 1) {
202 buf.append('\n');
203 }
204 }
205 return buf.toString();
206 }
207 }