1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.bcel.classfile;
21
22 import java.io.DataInput;
23 import java.io.DataOutputStream;
24 import java.io.IOException;
25 import java.util.Arrays;
26 import java.util.Iterator;
27 import java.util.stream.Stream;
28
29 import org.apache.bcel.Const;
30 import org.apache.bcel.util.Args;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public class LocalVariableTypeTable extends Attribute implements Iterable<LocalVariable> {
66
67 private static final LocalVariable[] EMPTY_ARRAY = {};
68
69 private LocalVariable[] localVariableTypeTable;
70
71 LocalVariableTypeTable(final int nameIdx, final int len, final DataInput input, final ConstantPool cpool) throws IOException {
72 this(nameIdx, len, (LocalVariable[]) null, cpool);
73 final int localVariableTypeTableLength = input.readUnsignedShort();
74 localVariableTypeTable = new LocalVariable[localVariableTypeTableLength];
75 for (int i = 0; i < localVariableTypeTableLength; i++) {
76 localVariableTypeTable[i] = new LocalVariable(input, cpool);
77 }
78 }
79
80 public LocalVariableTypeTable(final int nameIndex, final int length, final LocalVariable[] localVariableTypeTable, final ConstantPool constantPool) {
81 super(Const.ATTR_LOCAL_VARIABLE_TYPE_TABLE, nameIndex, length, constantPool);
82 this.localVariableTypeTable = localVariableTypeTable != null ? localVariableTypeTable : LocalVariable.EMPTY_ARRAY;
83 Args.requireU2(this.localVariableTypeTable.length, "localVariableTypeTable.length");
84 }
85
86 public LocalVariableTypeTable(final LocalVariableTypeTable c) {
87 this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), c.getConstantPool());
88 }
89
90 @Override
91 public void accept(final Visitor v) {
92 v.visitLocalVariableTypeTable(this);
93 }
94
95
96
97
98 @Override
99 public Attribute copy(final ConstantPool constantPool) {
100 final LocalVariableTypeTable c = (LocalVariableTypeTable) clone();
101 c.localVariableTypeTable = new LocalVariable[localVariableTypeTable.length];
102 Arrays.setAll(c.localVariableTypeTable, i -> localVariableTypeTable[i].copy());
103 c.setConstantPool(constantPool);
104 return c;
105 }
106
107 @Override
108 public final void dump(final DataOutputStream file) throws IOException {
109 super.dump(file);
110 file.writeShort(localVariableTypeTable.length);
111 for (final LocalVariable variable : localVariableTypeTable) {
112 variable.dump(file);
113 }
114 }
115
116 public final LocalVariable getLocalVariable(final int index) {
117 for (final LocalVariable variable : localVariableTypeTable) {
118 if (variable.getIndex() == index) {
119 return variable;
120 }
121 }
122 return null;
123 }
124
125 public final LocalVariable[] getLocalVariableTypeTable() {
126 return localVariableTypeTable;
127 }
128
129 public final int getTableLength() {
130 return localVariableTypeTable == null ? 0 : localVariableTypeTable.length;
131 }
132
133 @Override
134 public Iterator<LocalVariable> iterator() {
135 return Stream.of(localVariableTypeTable).iterator();
136 }
137
138 public final void setLocalVariableTable(final LocalVariable[] localVariableTable) {
139 this.localVariableTypeTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY;
140 }
141
142
143
144
145 @Override
146 public final String toString() {
147 final StringBuilder buf = new StringBuilder();
148 for (int i = 0; i < localVariableTypeTable.length; i++) {
149 buf.append(localVariableTypeTable[i].toStringShared(true));
150 if (i < localVariableTypeTable.length - 1) {
151 buf.append('\n');
152 }
153 }
154 return buf.toString();
155 }
156 }