-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArrayType.java
80 lines (69 loc) · 2.72 KB
/
ArrayType.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package bridge.asm;
import org.objectweb.asm.Type;
import java.util.Map;
import static org.objectweb.asm.Opcodes.*;
import static org.objectweb.asm.Type.getType;
public final class ArrayType extends KnownType {
public final int depth;
public final KnownType root, element;
ArrayType(Map<Type, KnownType> arrays, TypeMap types, Type type, Class<?> loaded) {
super(type);
int depth = 0;
final String desc = type.getDescriptor();
final KnownType root;
if (loaded != null) {
while (loaded.isArray()) {
loaded = loaded.getComponentType();
++depth;
}
this.root = root = types.get(loaded);
} else {
while (desc.charAt(depth) == '[') {
++depth;
}
this.root = root = types.load(getType(desc.substring(depth)));
}
if ((this.depth = depth) == 0) {
throw new IllegalArgumentException(desc);
} else if (depth == 1) {
access = ((element = root).access & (ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE)) | ACC_ABSTRACT | ACC_FINAL;
} else {
access = (element = get(arrays, types, getType(desc.substring(1)))).access;
}
arrays.put(type, this);
final String depthd_m1 = desc.substring(1, depth);
final String depthd = desc.substring(0, depth);
final KnownType extended = root.extended;
if (extended != null) {
this.extended = get(arrays, types, getType(depthd + extended.type.getDescriptor()));
} else {
this.extended = get(arrays, types, getType(depthd_m1 + "Ljava/lang/Object;"));
}
int i = 0;
final KnownType[] interfaces = root.implemented;
final KnownType[] implemented = this.implemented = new KnownType[interfaces.length + 2];
for (int length = interfaces.length; i != length;) {
implemented[i] = get(arrays, types, getType(depthd + interfaces[i++].type.getDescriptor()));
}
implemented[i] = get(arrays, types, getType(depthd_m1 + "Ljava/lang/Cloneable;"));
implemented[i+1] = get(arrays, types, getType(depthd_m1 + "Ljava/io/Serializable;"));
}
private static KnownType get(Map<Type, KnownType> arrays, TypeMap types, Type type) {
if (type.getSort() != Type.ARRAY) return types.load(type);
KnownType value = arrays.get(type);
if (value != null) return value;
return new ArrayType(arrays, types, type, null);
}
@Override
public boolean isPrimitive() {
return false;
}
@Override
public boolean isInterface() {
return false;
}
@Override
public boolean isArray() {
return true;
}
}