|
38 | 38 | import jdk.internal.access.SharedSecrets;
|
39 | 39 | import jdk.internal.vm.annotation.ForceInline;
|
40 | 40 |
|
| 41 | +import static java.lang.classfile.constantpool.PoolEntry.TAG_UTF8; |
41 | 42 | import static jdk.internal.util.ModifiedUtf.putChar;
|
42 | 43 | import static jdk.internal.util.ModifiedUtf.utfLen;
|
43 | 44 |
|
@@ -114,6 +115,83 @@ public void writeU2(int x) {
|
114 | 115 | this.offset = offset + 2;
|
115 | 116 | }
|
116 | 117 |
|
| 118 | + @ForceInline |
| 119 | + public void writeU1U1(int x1, int x2) { |
| 120 | + reserveSpace(2); |
| 121 | + byte[] elems = this.elems; |
| 122 | + int offset = this.offset; |
| 123 | + elems[offset ] = (byte) x1; |
| 124 | + elems[offset + 1] = (byte) x2; |
| 125 | + this.offset = offset + 2; |
| 126 | + } |
| 127 | + |
| 128 | + public void writeU1U2(int u1, int u2) { |
| 129 | + reserveSpace(3); |
| 130 | + byte[] elems = this.elems; |
| 131 | + int offset = this.offset; |
| 132 | + elems[offset ] = (byte) u1; |
| 133 | + elems[offset + 1] = (byte) (u2 >> 8); |
| 134 | + elems[offset + 2] = (byte) u2; |
| 135 | + this.offset = offset + 3; |
| 136 | + } |
| 137 | + |
| 138 | + public void writeU1U1U1(int x1, int x2, int x3) { |
| 139 | + reserveSpace(3); |
| 140 | + byte[] elems = this.elems; |
| 141 | + int offset = this.offset; |
| 142 | + elems[offset ] = (byte) x1; |
| 143 | + elems[offset + 1] = (byte) x2; |
| 144 | + elems[offset + 2] = (byte) x3; |
| 145 | + this.offset = offset + 3; |
| 146 | + } |
| 147 | + |
| 148 | + public void writeU1U1U2(int x1, int x2, int x3) { |
| 149 | + reserveSpace(4); |
| 150 | + byte[] elems = this.elems; |
| 151 | + int offset = this.offset; |
| 152 | + elems[offset ] = (byte) x1; |
| 153 | + elems[offset + 1] = (byte) x2; |
| 154 | + elems[offset + 2] = (byte) (x3 >> 8); |
| 155 | + elems[offset + 3] = (byte) x3; |
| 156 | + this.offset = offset + 4; |
| 157 | + } |
| 158 | + |
| 159 | + public void writeU1U2U2(int x1, int x2, int x3) { |
| 160 | + reserveSpace(5); |
| 161 | + byte[] elems = this.elems; |
| 162 | + int offset = this.offset; |
| 163 | + elems[offset ] = (byte) x1; |
| 164 | + elems[offset + 1] = (byte) (x2 >> 8); |
| 165 | + elems[offset + 2] = (byte) x2; |
| 166 | + elems[offset + 3] = (byte) (x3 >> 8); |
| 167 | + elems[offset + 4] = (byte) x3; |
| 168 | + this.offset = offset + 5; |
| 169 | + } |
| 170 | + |
| 171 | + public void writeU2U2(int x1, int x2) { |
| 172 | + reserveSpace(4); |
| 173 | + byte[] elems = this.elems; |
| 174 | + int offset = this.offset; |
| 175 | + elems[offset ] = (byte) (x1 >> 8); |
| 176 | + elems[offset + 1] = (byte) x1; |
| 177 | + elems[offset + 2] = (byte) (x2 >> 8); |
| 178 | + elems[offset + 3] = (byte) x2; |
| 179 | + this.offset = offset + 4; |
| 180 | + } |
| 181 | + |
| 182 | + public void writeU2U2U2(int x1, int x2, int x3) { |
| 183 | + reserveSpace(6); |
| 184 | + byte[] elems = this.elems; |
| 185 | + int offset = this.offset; |
| 186 | + elems[offset ] = (byte) (x1 >> 8); |
| 187 | + elems[offset + 1] = (byte) x1; |
| 188 | + elems[offset + 2] = (byte) (x2 >> 8); |
| 189 | + elems[offset + 3] = (byte) x2; |
| 190 | + elems[offset + 4] = (byte) (x3 >> 8); |
| 191 | + elems[offset + 5] = (byte) x3; |
| 192 | + this.offset = offset + 6; |
| 193 | + } |
| 194 | + |
117 | 195 | @Override
|
118 | 196 | public void writeInt(int x) {
|
119 | 197 | reserveSpace(4);
|
@@ -162,21 +240,22 @@ public void writeBytes(BufWriterImpl other) {
|
162 | 240 | }
|
163 | 241 |
|
164 | 242 | @SuppressWarnings("deprecation")
|
165 |
| - void writeUTF(String str) { |
| 243 | + void writeUtfEntry(String str) { |
166 | 244 | int strlen = str.length();
|
167 | 245 | int countNonZeroAscii = JLA.countNonZeroAscii(str);
|
168 | 246 | int utflen = utfLen(str, countNonZeroAscii);
|
169 | 247 | if (utflen > 65535) {
|
170 | 248 | throw new IllegalArgumentException("string too long");
|
171 | 249 | }
|
172 |
| - reserveSpace(utflen + 2); |
| 250 | + reserveSpace(utflen + 3); |
173 | 251 |
|
174 | 252 | int offset = this.offset;
|
175 | 253 | byte[] elems = this.elems;
|
176 | 254 |
|
177 |
| - elems[offset ] = (byte) (utflen >> 8); |
178 |
| - elems[offset + 1] = (byte) utflen; |
179 |
| - offset += 2; |
| 255 | + elems[offset ] = (byte) TAG_UTF8; |
| 256 | + elems[offset + 1] = (byte) (utflen >> 8); |
| 257 | + elems[offset + 2] = (byte) utflen; |
| 258 | + offset += 3; |
180 | 259 |
|
181 | 260 | str.getBytes(0, countNonZeroAscii, elems, offset);
|
182 | 261 | offset += countNonZeroAscii;
|
@@ -269,13 +348,21 @@ public void copyTo(byte[] array, int bufferOffset) {
|
269 | 348 | // writeIndex methods ensure that any CP info written
|
270 | 349 | // is relative to the correct constant pool
|
271 | 350 |
|
272 |
| - @ForceInline |
273 |
| - @Override |
274 |
| - public void writeIndex(PoolEntry entry) { |
| 351 | + public int cpIndex(PoolEntry entry) { |
275 | 352 | int idx = AbstractPoolEntry.maybeClone(constantPool, entry).index();
|
276 | 353 | if (idx < 1 || idx > Character.MAX_VALUE)
|
277 | 354 | throw invalidIndex(idx, entry);
|
278 |
| - writeU2(idx); |
| 355 | + return idx; |
| 356 | + } |
| 357 | + |
| 358 | + @ForceInline |
| 359 | + @Override |
| 360 | + public void writeIndex(PoolEntry entry) { |
| 361 | + writeU2(cpIndex(entry)); |
| 362 | + } |
| 363 | + |
| 364 | + public void writeIndex(int bytecode, PoolEntry entry) { |
| 365 | + writeU1U2(bytecode, cpIndex(entry)); |
279 | 366 | }
|
280 | 367 |
|
281 | 368 | static IllegalArgumentException invalidIndex(int idx, PoolEntry entry) {
|
|
0 commit comments