1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.commons.compress.harmony.unpack200.bytecode;
20
21 import java.io.DataOutputStream;
22 import java.io.IOException;
23 import java.util.Objects;
24
25 import org.apache.commons.compress.harmony.unpack200.SegmentUtils;
26
27
28
29
30 public class CPNameAndType extends ConstantPoolEntry {
31
32 CPUTF8 descriptor;
33
34 transient int descriptorIndex;
35
36 CPUTF8 name;
37
38 transient int nameIndex;
39
40 private boolean hashCodeComputed;
41
42 private int cachedHashCode;
43
44
45
46
47
48
49
50
51
52 public CPNameAndType(final CPUTF8 name, final CPUTF8 descriptor, final int globalIndex) {
53 super(CP_NameAndType, globalIndex);
54 this.name = Objects.requireNonNull(name, "name");
55 this.descriptor = Objects.requireNonNull(descriptor, "descriptor");
56 }
57
58
59
60
61
62 @Override
63 public boolean equals(final Object obj) {
64 if (this == obj) {
65 return true;
66 }
67 if (obj == null || getClass() != obj.getClass()) {
68 return false;
69 }
70 final CPNameAndType other = (CPNameAndType) obj;
71 return Objects.equals(descriptor, other.descriptor)
72 && Objects.equals(name, other.name);
73 }
74
75 private void generateHashCode() {
76 hashCodeComputed = true;
77 final int PRIME = 31;
78 int result = 1;
79 result = PRIME * result + descriptor.hashCode();
80 result = PRIME * result + name.hashCode();
81 cachedHashCode = result;
82 }
83
84 @Override
85 protected ClassFileEntry[] getNestedClassFileEntries() {
86 return new ClassFileEntry[] { name, descriptor };
87 }
88
89 @Override
90 public int hashCode() {
91 if (!hashCodeComputed) {
92 generateHashCode();
93 }
94 return cachedHashCode;
95 }
96
97
98
99
100
101
102
103 public int invokeInterfaceCount() {
104 return 1 + SegmentUtils.countInvokeInterfaceArgs(descriptor.underlyingString());
105 }
106
107 @Override
108 protected void resolve(final ClassConstantPool pool) {
109 super.resolve(pool);
110 descriptorIndex = pool.indexOf(descriptor);
111 nameIndex = pool.indexOf(name);
112 }
113
114 @Override
115 public String toString() {
116 return "NameAndType: " + name + "(" + descriptor + ")";
117 }
118
119 @Override
120 protected void writeBody(final DataOutputStream dos) throws IOException {
121 dos.writeShort(nameIndex);
122 dos.writeShort(descriptorIndex);
123 }
124 }