1 | /* |
2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | #include "precompiled.hpp" |
25 | #include "jvm.h" |
26 | #include "aot/aotLoader.hpp" |
27 | #include "classfile/classFileParser.hpp" |
28 | #include "classfile/classFileStream.hpp" |
29 | #include "classfile/classLoader.hpp" |
30 | #include "classfile/classLoaderData.inline.hpp" |
31 | #include "classfile/defaultMethods.hpp" |
32 | #include "classfile/dictionary.hpp" |
33 | #include "classfile/javaClasses.inline.hpp" |
34 | #include "classfile/moduleEntry.hpp" |
35 | #include "classfile/packageEntry.hpp" |
36 | #include "classfile/symbolTable.hpp" |
37 | #include "classfile/systemDictionary.hpp" |
38 | #include "classfile/verificationType.hpp" |
39 | #include "classfile/verifier.hpp" |
40 | #include "classfile/vmSymbols.hpp" |
41 | #include "logging/log.hpp" |
42 | #include "logging/logStream.hpp" |
43 | #include "memory/allocation.hpp" |
44 | #include "memory/metadataFactory.hpp" |
45 | #include "memory/oopFactory.hpp" |
46 | #include "memory/resourceArea.hpp" |
47 | #include "memory/universe.hpp" |
48 | #include "oops/annotations.hpp" |
49 | #include "oops/constantPool.inline.hpp" |
50 | #include "oops/fieldStreams.hpp" |
51 | #include "oops/instanceKlass.hpp" |
52 | #include "oops/instanceMirrorKlass.hpp" |
53 | #include "oops/klass.inline.hpp" |
54 | #include "oops/klassVtable.hpp" |
55 | #include "oops/metadata.hpp" |
56 | #include "oops/method.inline.hpp" |
57 | #include "oops/oop.inline.hpp" |
58 | #include "oops/symbol.hpp" |
59 | #include "prims/jvmtiExport.hpp" |
60 | #include "prims/jvmtiThreadState.hpp" |
61 | #include "runtime/arguments.hpp" |
62 | #include "runtime/handles.inline.hpp" |
63 | #include "runtime/javaCalls.hpp" |
64 | #include "runtime/os.hpp" |
65 | #include "runtime/perfData.hpp" |
66 | #include "runtime/reflection.hpp" |
67 | #include "runtime/safepointVerifiers.hpp" |
68 | #include "runtime/signature.hpp" |
69 | #include "runtime/timer.hpp" |
70 | #include "services/classLoadingService.hpp" |
71 | #include "services/threadService.hpp" |
72 | #include "utilities/align.hpp" |
73 | #include "utilities/bitMap.inline.hpp" |
74 | #include "utilities/copy.hpp" |
75 | #include "utilities/exceptions.hpp" |
76 | #include "utilities/globalDefinitions.hpp" |
77 | #include "utilities/growableArray.hpp" |
78 | #include "utilities/macros.hpp" |
79 | #include "utilities/ostream.hpp" |
80 | #include "utilities/resourceHash.hpp" |
81 | #include "utilities/utf8.hpp" |
82 | |
83 | #if INCLUDE_CDS |
84 | #include "classfile/systemDictionaryShared.hpp" |
85 | #endif |
86 | #if INCLUDE_JFR |
87 | #include "jfr/support/jfrTraceIdExtension.hpp" |
88 | #endif |
89 | |
90 | // We generally try to create the oops directly when parsing, rather than |
91 | // allocating temporary data structures and copying the bytes twice. A |
92 | // temporary area is only needed when parsing utf8 entries in the constant |
93 | // pool and when parsing line number tables. |
94 | |
95 | // We add assert in debug mode when class format is not checked. |
96 | |
97 | #define JAVA_CLASSFILE_MAGIC 0xCAFEBABE |
98 | #define JAVA_MIN_SUPPORTED_VERSION 45 |
99 | #define JAVA_PREVIEW_MINOR_VERSION 65535 |
100 | |
101 | // Used for two backward compatibility reasons: |
102 | // - to check for new additions to the class file format in JDK1.5 |
103 | // - to check for bug fixes in the format checker in JDK1.5 |
104 | #define JAVA_1_5_VERSION 49 |
105 | |
106 | // Used for backward compatibility reasons: |
107 | // - to check for javac bug fixes that happened after 1.5 |
108 | // - also used as the max version when running in jdk6 |
109 | #define JAVA_6_VERSION 50 |
110 | |
111 | // Used for backward compatibility reasons: |
112 | // - to disallow argument and require ACC_STATIC for <clinit> methods |
113 | #define JAVA_7_VERSION 51 |
114 | |
115 | // Extension method support. |
116 | #define JAVA_8_VERSION 52 |
117 | |
118 | #define JAVA_9_VERSION 53 |
119 | |
120 | #define JAVA_10_VERSION 54 |
121 | |
122 | #define JAVA_11_VERSION 55 |
123 | |
124 | #define JAVA_12_VERSION 56 |
125 | |
126 | #define JAVA_13_VERSION 57 |
127 | |
128 | void ClassFileParser::set_class_bad_constant_seen(short bad_constant) { |
129 | assert((bad_constant == JVM_CONSTANT_Module || |
130 | bad_constant == JVM_CONSTANT_Package) && _major_version >= JAVA_9_VERSION, |
131 | "Unexpected bad constant pool entry" ); |
132 | if (_bad_constant_seen == 0) _bad_constant_seen = bad_constant; |
133 | } |
134 | |
135 | void ClassFileParser::parse_constant_pool_entries(const ClassFileStream* const stream, |
136 | ConstantPool* cp, |
137 | const int length, |
138 | TRAPS) { |
139 | assert(stream != NULL, "invariant" ); |
140 | assert(cp != NULL, "invariant" ); |
141 | |
142 | // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize |
143 | // this function (_current can be allocated in a register, with scalar |
144 | // replacement of aggregates). The _current pointer is copied back to |
145 | // stream() when this function returns. DON'T call another method within |
146 | // this method that uses stream(). |
147 | const ClassFileStream cfs1 = *stream; |
148 | const ClassFileStream* const cfs = &cfs1; |
149 | |
150 | assert(cfs->allocated_on_stack(), "should be local" ); |
151 | debug_only(const u1* const old_current = stream->current();) |
152 | |
153 | // Used for batching symbol allocations. |
154 | const char* names[SymbolTable::symbol_alloc_batch_size]; |
155 | int lengths[SymbolTable::symbol_alloc_batch_size]; |
156 | int indices[SymbolTable::symbol_alloc_batch_size]; |
157 | unsigned int hashValues[SymbolTable::symbol_alloc_batch_size]; |
158 | int names_count = 0; |
159 | |
160 | // parsing Index 0 is unused |
161 | for (int index = 1; index < length; index++) { |
162 | // Each of the following case guarantees one more byte in the stream |
163 | // for the following tag or the access_flags following constant pool, |
164 | // so we don't need bounds-check for reading tag. |
165 | const u1 tag = cfs->get_u1_fast(); |
166 | switch (tag) { |
167 | case JVM_CONSTANT_Class : { |
168 | cfs->guarantee_more(3, CHECK); // name_index, tag/access_flags |
169 | const u2 name_index = cfs->get_u2_fast(); |
170 | cp->klass_index_at_put(index, name_index); |
171 | break; |
172 | } |
173 | case JVM_CONSTANT_Fieldref: { |
174 | cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
175 | const u2 class_index = cfs->get_u2_fast(); |
176 | const u2 name_and_type_index = cfs->get_u2_fast(); |
177 | cp->field_at_put(index, class_index, name_and_type_index); |
178 | break; |
179 | } |
180 | case JVM_CONSTANT_Methodref: { |
181 | cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
182 | const u2 class_index = cfs->get_u2_fast(); |
183 | const u2 name_and_type_index = cfs->get_u2_fast(); |
184 | cp->method_at_put(index, class_index, name_and_type_index); |
185 | break; |
186 | } |
187 | case JVM_CONSTANT_InterfaceMethodref: { |
188 | cfs->guarantee_more(5, CHECK); // class_index, name_and_type_index, tag/access_flags |
189 | const u2 class_index = cfs->get_u2_fast(); |
190 | const u2 name_and_type_index = cfs->get_u2_fast(); |
191 | cp->interface_method_at_put(index, class_index, name_and_type_index); |
192 | break; |
193 | } |
194 | case JVM_CONSTANT_String : { |
195 | cfs->guarantee_more(3, CHECK); // string_index, tag/access_flags |
196 | const u2 string_index = cfs->get_u2_fast(); |
197 | cp->string_index_at_put(index, string_index); |
198 | break; |
199 | } |
200 | case JVM_CONSTANT_MethodHandle : |
201 | case JVM_CONSTANT_MethodType: { |
202 | if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
203 | classfile_parse_error( |
204 | "Class file version does not support constant tag %u in class file %s" , |
205 | tag, CHECK); |
206 | } |
207 | if (tag == JVM_CONSTANT_MethodHandle) { |
208 | cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags |
209 | const u1 ref_kind = cfs->get_u1_fast(); |
210 | const u2 method_index = cfs->get_u2_fast(); |
211 | cp->method_handle_index_at_put(index, ref_kind, method_index); |
212 | } |
213 | else if (tag == JVM_CONSTANT_MethodType) { |
214 | cfs->guarantee_more(3, CHECK); // signature_index, tag/access_flags |
215 | const u2 signature_index = cfs->get_u2_fast(); |
216 | cp->method_type_index_at_put(index, signature_index); |
217 | } |
218 | else { |
219 | ShouldNotReachHere(); |
220 | } |
221 | break; |
222 | } |
223 | case JVM_CONSTANT_Dynamic : { |
224 | if (_major_version < Verifier::DYNAMICCONSTANT_MAJOR_VERSION) { |
225 | classfile_parse_error( |
226 | "Class file version does not support constant tag %u in class file %s" , |
227 | tag, CHECK); |
228 | } |
229 | cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
230 | const u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
231 | const u2 name_and_type_index = cfs->get_u2_fast(); |
232 | if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) { |
233 | _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
234 | } |
235 | cp->dynamic_constant_at_put(index, bootstrap_specifier_index, name_and_type_index); |
236 | break; |
237 | } |
238 | case JVM_CONSTANT_InvokeDynamic : { |
239 | if (_major_version < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
240 | classfile_parse_error( |
241 | "Class file version does not support constant tag %u in class file %s" , |
242 | tag, CHECK); |
243 | } |
244 | cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags |
245 | const u2 bootstrap_specifier_index = cfs->get_u2_fast(); |
246 | const u2 name_and_type_index = cfs->get_u2_fast(); |
247 | if (_max_bootstrap_specifier_index < (int) bootstrap_specifier_index) { |
248 | _max_bootstrap_specifier_index = (int) bootstrap_specifier_index; // collect for later |
249 | } |
250 | cp->invoke_dynamic_at_put(index, bootstrap_specifier_index, name_and_type_index); |
251 | break; |
252 | } |
253 | case JVM_CONSTANT_Integer: { |
254 | cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
255 | const u4 bytes = cfs->get_u4_fast(); |
256 | cp->int_at_put(index, (jint)bytes); |
257 | break; |
258 | } |
259 | case JVM_CONSTANT_Float: { |
260 | cfs->guarantee_more(5, CHECK); // bytes, tag/access_flags |
261 | const u4 bytes = cfs->get_u4_fast(); |
262 | cp->float_at_put(index, *(jfloat*)&bytes); |
263 | break; |
264 | } |
265 | case JVM_CONSTANT_Long: { |
266 | // A mangled type might cause you to overrun allocated memory |
267 | guarantee_property(index + 1 < length, |
268 | "Invalid constant pool entry %u in class file %s" , |
269 | index, |
270 | CHECK); |
271 | cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
272 | const u8 bytes = cfs->get_u8_fast(); |
273 | cp->long_at_put(index, bytes); |
274 | index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
275 | break; |
276 | } |
277 | case JVM_CONSTANT_Double: { |
278 | // A mangled type might cause you to overrun allocated memory |
279 | guarantee_property(index+1 < length, |
280 | "Invalid constant pool entry %u in class file %s" , |
281 | index, |
282 | CHECK); |
283 | cfs->guarantee_more(9, CHECK); // bytes, tag/access_flags |
284 | const u8 bytes = cfs->get_u8_fast(); |
285 | cp->double_at_put(index, *(jdouble*)&bytes); |
286 | index++; // Skip entry following eigth-byte constant, see JVM book p. 98 |
287 | break; |
288 | } |
289 | case JVM_CONSTANT_NameAndType: { |
290 | cfs->guarantee_more(5, CHECK); // name_index, signature_index, tag/access_flags |
291 | const u2 name_index = cfs->get_u2_fast(); |
292 | const u2 signature_index = cfs->get_u2_fast(); |
293 | cp->name_and_type_at_put(index, name_index, signature_index); |
294 | break; |
295 | } |
296 | case JVM_CONSTANT_Utf8 : { |
297 | cfs->guarantee_more(2, CHECK); // utf8_length |
298 | u2 utf8_length = cfs->get_u2_fast(); |
299 | const u1* utf8_buffer = cfs->current(); |
300 | assert(utf8_buffer != NULL, "null utf8 buffer" ); |
301 | // Got utf8 string, guarantee utf8_length+1 bytes, set stream position forward. |
302 | cfs->guarantee_more(utf8_length+1, CHECK); // utf8 string, tag/access_flags |
303 | cfs->skip_u1_fast(utf8_length); |
304 | |
305 | // Before storing the symbol, make sure it's legal |
306 | if (_need_verify) { |
307 | verify_legal_utf8(utf8_buffer, utf8_length, CHECK); |
308 | } |
309 | |
310 | if (has_cp_patch_at(index)) { |
311 | Handle patch = clear_cp_patch_at(index); |
312 | guarantee_property(java_lang_String::is_instance(patch()), |
313 | "Illegal utf8 patch at %d in class file %s" , |
314 | index, |
315 | CHECK); |
316 | const char* const str = java_lang_String::as_utf8_string(patch()); |
317 | // (could use java_lang_String::as_symbol instead, but might as well batch them) |
318 | utf8_buffer = (const u1*) str; |
319 | utf8_length = (u2) strlen(str); |
320 | } |
321 | |
322 | unsigned int hash; |
323 | Symbol* const result = SymbolTable::lookup_only((const char*)utf8_buffer, |
324 | utf8_length, |
325 | hash); |
326 | if (result == NULL) { |
327 | names[names_count] = (const char*)utf8_buffer; |
328 | lengths[names_count] = utf8_length; |
329 | indices[names_count] = index; |
330 | hashValues[names_count++] = hash; |
331 | if (names_count == SymbolTable::symbol_alloc_batch_size) { |
332 | SymbolTable::new_symbols(_loader_data, |
333 | cp, |
334 | names_count, |
335 | names, |
336 | lengths, |
337 | indices, |
338 | hashValues); |
339 | names_count = 0; |
340 | } |
341 | } else { |
342 | cp->symbol_at_put(index, result); |
343 | } |
344 | break; |
345 | } |
346 | case JVM_CONSTANT_Module: |
347 | case JVM_CONSTANT_Package: { |
348 | // Record that an error occurred in these two cases but keep parsing so |
349 | // that ACC_Module can be checked for in the access_flags. Need to |
350 | // throw NoClassDefFoundError in that case. |
351 | if (_major_version >= JAVA_9_VERSION) { |
352 | cfs->guarantee_more(3, CHECK); |
353 | cfs->get_u2_fast(); |
354 | set_class_bad_constant_seen(tag); |
355 | break; |
356 | } |
357 | } |
358 | default: { |
359 | classfile_parse_error("Unknown constant tag %u in class file %s" , |
360 | tag, |
361 | CHECK); |
362 | break; |
363 | } |
364 | } // end of switch(tag) |
365 | } // end of for |
366 | |
367 | // Allocate the remaining symbols |
368 | if (names_count > 0) { |
369 | SymbolTable::new_symbols(_loader_data, |
370 | cp, |
371 | names_count, |
372 | names, |
373 | lengths, |
374 | indices, |
375 | hashValues); |
376 | } |
377 | |
378 | // Copy _current pointer of local copy back to stream. |
379 | assert(stream->current() == old_current, "non-exclusive use of stream" ); |
380 | stream->set_current(cfs1.current()); |
381 | |
382 | } |
383 | |
384 | static inline bool valid_cp_range(int index, int length) { |
385 | return (index > 0 && index < length); |
386 | } |
387 | |
388 | static inline Symbol* check_symbol_at(const ConstantPool* cp, int index) { |
389 | assert(cp != NULL, "invariant" ); |
390 | if (valid_cp_range(index, cp->length()) && cp->tag_at(index).is_utf8()) { |
391 | return cp->symbol_at(index); |
392 | } |
393 | return NULL; |
394 | } |
395 | |
396 | #ifdef ASSERT |
397 | PRAGMA_DIAG_PUSH |
398 | PRAGMA_FORMAT_NONLITERAL_IGNORED |
399 | void ClassFileParser::report_assert_property_failure(const char* msg, TRAPS) const { |
400 | ResourceMark rm(THREAD); |
401 | fatal(msg, _class_name->as_C_string()); |
402 | } |
403 | |
404 | void ClassFileParser::report_assert_property_failure(const char* msg, |
405 | int index, |
406 | TRAPS) const { |
407 | ResourceMark rm(THREAD); |
408 | fatal(msg, index, _class_name->as_C_string()); |
409 | } |
410 | PRAGMA_DIAG_POP |
411 | #endif |
412 | |
413 | void ClassFileParser::parse_constant_pool(const ClassFileStream* const stream, |
414 | ConstantPool* const cp, |
415 | const int length, |
416 | TRAPS) { |
417 | assert(cp != NULL, "invariant" ); |
418 | assert(stream != NULL, "invariant" ); |
419 | |
420 | // parsing constant pool entries |
421 | parse_constant_pool_entries(stream, cp, length, CHECK); |
422 | if (class_bad_constant_seen() != 0) { |
423 | // a bad CP entry has been detected previously so stop parsing and just return. |
424 | return; |
425 | } |
426 | |
427 | int index = 1; // declared outside of loops for portability |
428 | int num_klasses = 0; |
429 | |
430 | // first verification pass - validate cross references |
431 | // and fixup class and string constants |
432 | for (index = 1; index < length; index++) { // Index 0 is unused |
433 | const jbyte tag = cp->tag_at(index).value(); |
434 | switch (tag) { |
435 | case JVM_CONSTANT_Class: { |
436 | ShouldNotReachHere(); // Only JVM_CONSTANT_ClassIndex should be present |
437 | break; |
438 | } |
439 | case JVM_CONSTANT_Fieldref: |
440 | // fall through |
441 | case JVM_CONSTANT_Methodref: |
442 | // fall through |
443 | case JVM_CONSTANT_InterfaceMethodref: { |
444 | if (!_need_verify) break; |
445 | const int klass_ref_index = cp->klass_ref_index_at(index); |
446 | const int name_and_type_ref_index = cp->name_and_type_ref_index_at(index); |
447 | check_property(valid_klass_reference_at(klass_ref_index), |
448 | "Invalid constant pool index %u in class file %s" , |
449 | klass_ref_index, CHECK); |
450 | check_property(valid_cp_range(name_and_type_ref_index, length) && |
451 | cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
452 | "Invalid constant pool index %u in class file %s" , |
453 | name_and_type_ref_index, CHECK); |
454 | break; |
455 | } |
456 | case JVM_CONSTANT_String: { |
457 | ShouldNotReachHere(); // Only JVM_CONSTANT_StringIndex should be present |
458 | break; |
459 | } |
460 | case JVM_CONSTANT_Integer: |
461 | break; |
462 | case JVM_CONSTANT_Float: |
463 | break; |
464 | case JVM_CONSTANT_Long: |
465 | case JVM_CONSTANT_Double: { |
466 | index++; |
467 | check_property( |
468 | (index < length && cp->tag_at(index).is_invalid()), |
469 | "Improper constant pool long/double index %u in class file %s" , |
470 | index, CHECK); |
471 | break; |
472 | } |
473 | case JVM_CONSTANT_NameAndType: { |
474 | if (!_need_verify) break; |
475 | const int name_ref_index = cp->name_ref_index_at(index); |
476 | const int signature_ref_index = cp->signature_ref_index_at(index); |
477 | check_property(valid_symbol_at(name_ref_index), |
478 | "Invalid constant pool index %u in class file %s" , |
479 | name_ref_index, CHECK); |
480 | check_property(valid_symbol_at(signature_ref_index), |
481 | "Invalid constant pool index %u in class file %s" , |
482 | signature_ref_index, CHECK); |
483 | break; |
484 | } |
485 | case JVM_CONSTANT_Utf8: |
486 | break; |
487 | case JVM_CONSTANT_UnresolvedClass: // fall-through |
488 | case JVM_CONSTANT_UnresolvedClassInError: { |
489 | ShouldNotReachHere(); // Only JVM_CONSTANT_ClassIndex should be present |
490 | break; |
491 | } |
492 | case JVM_CONSTANT_ClassIndex: { |
493 | const int class_index = cp->klass_index_at(index); |
494 | check_property(valid_symbol_at(class_index), |
495 | "Invalid constant pool index %u in class file %s" , |
496 | class_index, CHECK); |
497 | cp->unresolved_klass_at_put(index, class_index, num_klasses++); |
498 | break; |
499 | } |
500 | case JVM_CONSTANT_StringIndex: { |
501 | const int string_index = cp->string_index_at(index); |
502 | check_property(valid_symbol_at(string_index), |
503 | "Invalid constant pool index %u in class file %s" , |
504 | string_index, CHECK); |
505 | Symbol* const sym = cp->symbol_at(string_index); |
506 | cp->unresolved_string_at_put(index, sym); |
507 | break; |
508 | } |
509 | case JVM_CONSTANT_MethodHandle: { |
510 | const int ref_index = cp->method_handle_index_at(index); |
511 | check_property(valid_cp_range(ref_index, length), |
512 | "Invalid constant pool index %u in class file %s" , |
513 | ref_index, CHECK); |
514 | const constantTag tag = cp->tag_at(ref_index); |
515 | const int ref_kind = cp->method_handle_ref_kind_at(index); |
516 | |
517 | switch (ref_kind) { |
518 | case JVM_REF_getField: |
519 | case JVM_REF_getStatic: |
520 | case JVM_REF_putField: |
521 | case JVM_REF_putStatic: { |
522 | check_property( |
523 | tag.is_field(), |
524 | "Invalid constant pool index %u in class file %s (not a field)" , |
525 | ref_index, CHECK); |
526 | break; |
527 | } |
528 | case JVM_REF_invokeVirtual: |
529 | case JVM_REF_newInvokeSpecial: { |
530 | check_property( |
531 | tag.is_method(), |
532 | "Invalid constant pool index %u in class file %s (not a method)" , |
533 | ref_index, CHECK); |
534 | break; |
535 | } |
536 | case JVM_REF_invokeStatic: |
537 | case JVM_REF_invokeSpecial: { |
538 | check_property( |
539 | tag.is_method() || |
540 | ((_major_version >= JAVA_8_VERSION) && tag.is_interface_method()), |
541 | "Invalid constant pool index %u in class file %s (not a method)" , |
542 | ref_index, CHECK); |
543 | break; |
544 | } |
545 | case JVM_REF_invokeInterface: { |
546 | check_property( |
547 | tag.is_interface_method(), |
548 | "Invalid constant pool index %u in class file %s (not an interface method)" , |
549 | ref_index, CHECK); |
550 | break; |
551 | } |
552 | default: { |
553 | classfile_parse_error( |
554 | "Bad method handle kind at constant pool index %u in class file %s" , |
555 | index, CHECK); |
556 | } |
557 | } // switch(refkind) |
558 | // Keep the ref_index unchanged. It will be indirected at link-time. |
559 | break; |
560 | } // case MethodHandle |
561 | case JVM_CONSTANT_MethodType: { |
562 | const int ref_index = cp->method_type_index_at(index); |
563 | check_property(valid_symbol_at(ref_index), |
564 | "Invalid constant pool index %u in class file %s" , |
565 | ref_index, CHECK); |
566 | break; |
567 | } |
568 | case JVM_CONSTANT_Dynamic: { |
569 | const int name_and_type_ref_index = |
570 | cp->bootstrap_name_and_type_ref_index_at(index); |
571 | |
572 | check_property(valid_cp_range(name_and_type_ref_index, length) && |
573 | cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
574 | "Invalid constant pool index %u in class file %s" , |
575 | name_and_type_ref_index, CHECK); |
576 | // bootstrap specifier index must be checked later, |
577 | // when BootstrapMethods attr is available |
578 | |
579 | // Mark the constant pool as having a CONSTANT_Dynamic_info structure |
580 | cp->set_has_dynamic_constant(); |
581 | break; |
582 | } |
583 | case JVM_CONSTANT_InvokeDynamic: { |
584 | const int name_and_type_ref_index = |
585 | cp->bootstrap_name_and_type_ref_index_at(index); |
586 | |
587 | check_property(valid_cp_range(name_and_type_ref_index, length) && |
588 | cp->tag_at(name_and_type_ref_index).is_name_and_type(), |
589 | "Invalid constant pool index %u in class file %s" , |
590 | name_and_type_ref_index, CHECK); |
591 | // bootstrap specifier index must be checked later, |
592 | // when BootstrapMethods attr is available |
593 | break; |
594 | } |
595 | default: { |
596 | fatal("bad constant pool tag value %u" , cp->tag_at(index).value()); |
597 | ShouldNotReachHere(); |
598 | break; |
599 | } |
600 | } // switch(tag) |
601 | } // end of for |
602 | |
603 | _first_patched_klass_resolved_index = num_klasses; |
604 | cp->allocate_resolved_klasses(_loader_data, num_klasses + _max_num_patched_klasses, CHECK); |
605 | |
606 | if (_cp_patches != NULL) { |
607 | // need to treat this_class specially... |
608 | |
609 | // Add dummy utf8 entries in the space reserved for names of patched classes. We'll use "*" |
610 | // for now. These will be replaced with actual names of the patched classes in patch_class(). |
611 | Symbol* s = vmSymbols::star_name(); |
612 | for (int n=_orig_cp_size; n<cp->length(); n++) { |
613 | cp->symbol_at_put(n, s); |
614 | } |
615 | |
616 | int this_class_index; |
617 | { |
618 | stream->guarantee_more(8, CHECK); // flags, this_class, super_class, infs_len |
619 | const u1* const mark = stream->current(); |
620 | stream->skip_u2_fast(1); // skip flags |
621 | this_class_index = stream->get_u2_fast(); |
622 | stream->set_current(mark); // revert to mark |
623 | } |
624 | |
625 | for (index = 1; index < length; index++) { // Index 0 is unused |
626 | if (has_cp_patch_at(index)) { |
627 | guarantee_property(index != this_class_index, |
628 | "Illegal constant pool patch to self at %d in class file %s" , |
629 | index, CHECK); |
630 | patch_constant_pool(cp, index, cp_patch_at(index), CHECK); |
631 | } |
632 | } |
633 | } |
634 | |
635 | if (!_need_verify) { |
636 | return; |
637 | } |
638 | |
639 | // second verification pass - checks the strings are of the right format. |
640 | // but not yet to the other entries |
641 | for (index = 1; index < length; index++) { |
642 | const jbyte tag = cp->tag_at(index).value(); |
643 | switch (tag) { |
644 | case JVM_CONSTANT_UnresolvedClass: { |
645 | const Symbol* const class_name = cp->klass_name_at(index); |
646 | // check the name, even if _cp_patches will overwrite it |
647 | verify_legal_class_name(class_name, CHECK); |
648 | break; |
649 | } |
650 | case JVM_CONSTANT_NameAndType: { |
651 | if (_need_verify) { |
652 | const int sig_index = cp->signature_ref_index_at(index); |
653 | const int name_index = cp->name_ref_index_at(index); |
654 | const Symbol* const name = cp->symbol_at(name_index); |
655 | const Symbol* const sig = cp->symbol_at(sig_index); |
656 | guarantee_property(sig->utf8_length() != 0, |
657 | "Illegal zero length constant pool entry at %d in class %s" , |
658 | sig_index, CHECK); |
659 | guarantee_property(name->utf8_length() != 0, |
660 | "Illegal zero length constant pool entry at %d in class %s" , |
661 | name_index, CHECK); |
662 | |
663 | if (sig->char_at(0) == JVM_SIGNATURE_FUNC) { |
664 | // Format check method name and signature |
665 | verify_legal_method_name(name, CHECK); |
666 | verify_legal_method_signature(name, sig, CHECK); |
667 | } else { |
668 | // Format check field name and signature |
669 | verify_legal_field_name(name, CHECK); |
670 | verify_legal_field_signature(name, sig, CHECK); |
671 | } |
672 | } |
673 | break; |
674 | } |
675 | case JVM_CONSTANT_Dynamic: { |
676 | const int name_and_type_ref_index = |
677 | cp->name_and_type_ref_index_at(index); |
678 | // already verified to be utf8 |
679 | const int name_ref_index = |
680 | cp->name_ref_index_at(name_and_type_ref_index); |
681 | // already verified to be utf8 |
682 | const int signature_ref_index = |
683 | cp->signature_ref_index_at(name_and_type_ref_index); |
684 | const Symbol* const name = cp->symbol_at(name_ref_index); |
685 | const Symbol* const signature = cp->symbol_at(signature_ref_index); |
686 | if (_need_verify) { |
687 | // CONSTANT_Dynamic's name and signature are verified above, when iterating NameAndType_info. |
688 | // Need only to be sure signature is non-zero length and the right type. |
689 | if (signature->utf8_length() == 0 || |
690 | signature->char_at(0) == JVM_SIGNATURE_FUNC) { |
691 | throwIllegalSignature("CONSTANT_Dynamic" , name, signature, CHECK); |
692 | } |
693 | } |
694 | break; |
695 | } |
696 | case JVM_CONSTANT_InvokeDynamic: |
697 | case JVM_CONSTANT_Fieldref: |
698 | case JVM_CONSTANT_Methodref: |
699 | case JVM_CONSTANT_InterfaceMethodref: { |
700 | const int name_and_type_ref_index = |
701 | cp->name_and_type_ref_index_at(index); |
702 | // already verified to be utf8 |
703 | const int name_ref_index = |
704 | cp->name_ref_index_at(name_and_type_ref_index); |
705 | // already verified to be utf8 |
706 | const int signature_ref_index = |
707 | cp->signature_ref_index_at(name_and_type_ref_index); |
708 | const Symbol* const name = cp->symbol_at(name_ref_index); |
709 | const Symbol* const signature = cp->symbol_at(signature_ref_index); |
710 | if (tag == JVM_CONSTANT_Fieldref) { |
711 | if (_need_verify) { |
712 | // Field name and signature are verified above, when iterating NameAndType_info. |
713 | // Need only to be sure signature is non-zero length and the right type. |
714 | if (signature->utf8_length() == 0 || |
715 | signature->char_at(0) == JVM_SIGNATURE_FUNC) { |
716 | throwIllegalSignature("Field" , name, signature, CHECK); |
717 | } |
718 | } |
719 | } else { |
720 | if (_need_verify) { |
721 | // Method name and signature are verified above, when iterating NameAndType_info. |
722 | // Need only to be sure signature is non-zero length and the right type. |
723 | if (signature->utf8_length() == 0 || |
724 | signature->char_at(0) != JVM_SIGNATURE_FUNC) { |
725 | throwIllegalSignature("Method" , name, signature, CHECK); |
726 | } |
727 | } |
728 | // 4509014: If a class method name begins with '<', it must be "<init>" |
729 | const unsigned int name_len = name->utf8_length(); |
730 | if (tag == JVM_CONSTANT_Methodref && |
731 | name_len != 0 && |
732 | name->char_at(0) == '<' && |
733 | name != vmSymbols::object_initializer_name()) { |
734 | classfile_parse_error( |
735 | "Bad method name at constant pool index %u in class file %s" , |
736 | name_ref_index, CHECK); |
737 | } |
738 | } |
739 | break; |
740 | } |
741 | case JVM_CONSTANT_MethodHandle: { |
742 | const int ref_index = cp->method_handle_index_at(index); |
743 | const int ref_kind = cp->method_handle_ref_kind_at(index); |
744 | switch (ref_kind) { |
745 | case JVM_REF_invokeVirtual: |
746 | case JVM_REF_invokeStatic: |
747 | case JVM_REF_invokeSpecial: |
748 | case JVM_REF_newInvokeSpecial: { |
749 | const int name_and_type_ref_index = |
750 | cp->name_and_type_ref_index_at(ref_index); |
751 | const int name_ref_index = |
752 | cp->name_ref_index_at(name_and_type_ref_index); |
753 | const Symbol* const name = cp->symbol_at(name_ref_index); |
754 | if (ref_kind == JVM_REF_newInvokeSpecial) { |
755 | if (name != vmSymbols::object_initializer_name()) { |
756 | classfile_parse_error( |
757 | "Bad constructor name at constant pool index %u in class file %s" , |
758 | name_ref_index, CHECK); |
759 | } |
760 | } else { |
761 | if (name == vmSymbols::object_initializer_name()) { |
762 | classfile_parse_error( |
763 | "Bad method name at constant pool index %u in class file %s" , |
764 | name_ref_index, CHECK); |
765 | } |
766 | } |
767 | break; |
768 | } |
769 | // Other ref_kinds are already fully checked in previous pass. |
770 | } // switch(ref_kind) |
771 | break; |
772 | } |
773 | case JVM_CONSTANT_MethodType: { |
774 | const Symbol* const no_name = vmSymbols::type_name(); // place holder |
775 | const Symbol* const signature = cp->method_type_signature_at(index); |
776 | verify_legal_method_signature(no_name, signature, CHECK); |
777 | break; |
778 | } |
779 | case JVM_CONSTANT_Utf8: { |
780 | assert(cp->symbol_at(index)->refcount() != 0, "count corrupted" ); |
781 | } |
782 | } // switch(tag) |
783 | } // end of for |
784 | } |
785 | |
786 | Handle ClassFileParser::clear_cp_patch_at(int index) { |
787 | Handle patch = cp_patch_at(index); |
788 | _cp_patches->at_put(index, Handle()); |
789 | assert(!has_cp_patch_at(index), "" ); |
790 | return patch; |
791 | } |
792 | |
793 | void ClassFileParser::patch_class(ConstantPool* cp, int class_index, Klass* k, Symbol* name) { |
794 | int name_index = _orig_cp_size + _num_patched_klasses; |
795 | int resolved_klass_index = _first_patched_klass_resolved_index + _num_patched_klasses; |
796 | |
797 | cp->klass_at_put(class_index, name_index, resolved_klass_index, k, name); |
798 | _num_patched_klasses ++; |
799 | } |
800 | |
801 | void ClassFileParser::patch_constant_pool(ConstantPool* cp, |
802 | int index, |
803 | Handle patch, |
804 | TRAPS) { |
805 | assert(cp != NULL, "invariant" ); |
806 | |
807 | BasicType patch_type = T_VOID; |
808 | |
809 | switch (cp->tag_at(index).value()) { |
810 | |
811 | case JVM_CONSTANT_UnresolvedClass: { |
812 | // Patching a class means pre-resolving it. |
813 | // The name in the constant pool is ignored. |
814 | if (java_lang_Class::is_instance(patch())) { |
815 | guarantee_property(!java_lang_Class::is_primitive(patch()), |
816 | "Illegal class patch at %d in class file %s" , |
817 | index, CHECK); |
818 | Klass* k = java_lang_Class::as_Klass(patch()); |
819 | patch_class(cp, index, k, k->name()); |
820 | } else { |
821 | guarantee_property(java_lang_String::is_instance(patch()), |
822 | "Illegal class patch at %d in class file %s" , |
823 | index, CHECK); |
824 | Symbol* const name = java_lang_String::as_symbol(patch()); |
825 | patch_class(cp, index, NULL, name); |
826 | } |
827 | break; |
828 | } |
829 | |
830 | case JVM_CONSTANT_String: { |
831 | // skip this patch and don't clear it. Needs the oop array for resolved |
832 | // references to be created first. |
833 | return; |
834 | } |
835 | case JVM_CONSTANT_Integer: patch_type = T_INT; goto patch_prim; |
836 | case JVM_CONSTANT_Float: patch_type = T_FLOAT; goto patch_prim; |
837 | case JVM_CONSTANT_Long: patch_type = T_LONG; goto patch_prim; |
838 | case JVM_CONSTANT_Double: patch_type = T_DOUBLE; goto patch_prim; |
839 | patch_prim: |
840 | { |
841 | jvalue value; |
842 | BasicType value_type = java_lang_boxing_object::get_value(patch(), &value); |
843 | guarantee_property(value_type == patch_type, |
844 | "Illegal primitive patch at %d in class file %s" , |
845 | index, CHECK); |
846 | switch (value_type) { |
847 | case T_INT: cp->int_at_put(index, value.i); break; |
848 | case T_FLOAT: cp->float_at_put(index, value.f); break; |
849 | case T_LONG: cp->long_at_put(index, value.j); break; |
850 | case T_DOUBLE: cp->double_at_put(index, value.d); break; |
851 | default: assert(false, "" ); |
852 | } |
853 | } // end patch_prim label |
854 | break; |
855 | |
856 | default: { |
857 | // %%% TODO: put method handles into CONSTANT_InterfaceMethodref, etc. |
858 | guarantee_property(!has_cp_patch_at(index), |
859 | "Illegal unexpected patch at %d in class file %s" , |
860 | index, CHECK); |
861 | return; |
862 | } |
863 | } // end of switch(tag) |
864 | |
865 | // On fall-through, mark the patch as used. |
866 | clear_cp_patch_at(index); |
867 | } |
868 | class NameSigHash: public ResourceObj { |
869 | public: |
870 | const Symbol* _name; // name |
871 | const Symbol* _sig; // signature |
872 | NameSigHash* _next; // Next entry in hash table |
873 | }; |
874 | |
875 | static const int HASH_ROW_SIZE = 256; |
876 | |
877 | static unsigned int hash(const Symbol* name, const Symbol* sig) { |
878 | unsigned int raw_hash = 0; |
879 | raw_hash += ((unsigned int)(uintptr_t)name) >> (LogHeapWordSize + 2); |
880 | raw_hash += ((unsigned int)(uintptr_t)sig) >> LogHeapWordSize; |
881 | |
882 | return (raw_hash + (unsigned int)(uintptr_t)name) % HASH_ROW_SIZE; |
883 | } |
884 | |
885 | |
886 | static void initialize_hashtable(NameSigHash** table) { |
887 | memset((void*)table, 0, sizeof(NameSigHash*) * HASH_ROW_SIZE); |
888 | } |
889 | // Return false if the name/sig combination is found in table. |
890 | // Return true if no duplicate is found. And name/sig is added as a new entry in table. |
891 | // The old format checker uses heap sort to find duplicates. |
892 | // NOTE: caller should guarantee that GC doesn't happen during the life cycle |
893 | // of table since we don't expect Symbol*'s to move. |
894 | static bool put_after_lookup(const Symbol* name, const Symbol* sig, NameSigHash** table) { |
895 | assert(name != NULL, "name in constant pool is NULL" ); |
896 | |
897 | // First lookup for duplicates |
898 | int index = hash(name, sig); |
899 | NameSigHash* entry = table[index]; |
900 | while (entry != NULL) { |
901 | if (entry->_name == name && entry->_sig == sig) { |
902 | return false; |
903 | } |
904 | entry = entry->_next; |
905 | } |
906 | |
907 | // No duplicate is found, allocate a new entry and fill it. |
908 | entry = new NameSigHash(); |
909 | entry->_name = name; |
910 | entry->_sig = sig; |
911 | |
912 | // Insert into hash table |
913 | entry->_next = table[index]; |
914 | table[index] = entry; |
915 | |
916 | return true; |
917 | } |
918 | |
919 | // Side-effects: populates the _local_interfaces field |
920 | void ClassFileParser::parse_interfaces(const ClassFileStream* const stream, |
921 | const int itfs_len, |
922 | ConstantPool* const cp, |
923 | bool* const has_nonstatic_concrete_methods, |
924 | TRAPS) { |
925 | assert(stream != NULL, "invariant" ); |
926 | assert(cp != NULL, "invariant" ); |
927 | assert(has_nonstatic_concrete_methods != NULL, "invariant" ); |
928 | |
929 | if (itfs_len == 0) { |
930 | _local_interfaces = Universe::the_empty_instance_klass_array(); |
931 | } else { |
932 | assert(itfs_len > 0, "only called for len>0" ); |
933 | _local_interfaces = MetadataFactory::new_array<InstanceKlass*>(_loader_data, itfs_len, NULL, CHECK); |
934 | |
935 | int index; |
936 | for (index = 0; index < itfs_len; index++) { |
937 | const u2 interface_index = stream->get_u2(CHECK); |
938 | Klass* interf; |
939 | check_property( |
940 | valid_klass_reference_at(interface_index), |
941 | "Interface name has bad constant pool index %u in class file %s" , |
942 | interface_index, CHECK); |
943 | if (cp->tag_at(interface_index).is_klass()) { |
944 | interf = cp->resolved_klass_at(interface_index); |
945 | } else { |
946 | Symbol* const unresolved_klass = cp->klass_name_at(interface_index); |
947 | |
948 | // Don't need to check legal name because it's checked when parsing constant pool. |
949 | // But need to make sure it's not an array type. |
950 | guarantee_property(unresolved_klass->char_at(0) != JVM_SIGNATURE_ARRAY, |
951 | "Bad interface name in class file %s" , CHECK); |
952 | |
953 | // Call resolve_super so classcircularity is checked |
954 | interf = SystemDictionary::resolve_super_or_fail( |
955 | _class_name, |
956 | unresolved_klass, |
957 | Handle(THREAD, _loader_data->class_loader()), |
958 | _protection_domain, |
959 | false, |
960 | CHECK); |
961 | } |
962 | |
963 | if (!interf->is_interface()) { |
964 | THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), |
965 | err_msg("class %s can not implement %s, because it is not an interface (%s)" , |
966 | _class_name->as_klass_external_name(), |
967 | interf->external_name(), |
968 | interf->class_in_module_of_loader())); |
969 | } |
970 | |
971 | if (InstanceKlass::cast(interf)->has_nonstatic_concrete_methods()) { |
972 | *has_nonstatic_concrete_methods = true; |
973 | } |
974 | _local_interfaces->at_put(index, InstanceKlass::cast(interf)); |
975 | } |
976 | |
977 | if (!_need_verify || itfs_len <= 1) { |
978 | return; |
979 | } |
980 | |
981 | // Check if there's any duplicates in interfaces |
982 | ResourceMark rm(THREAD); |
983 | NameSigHash** interface_names = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, |
984 | NameSigHash*, |
985 | HASH_ROW_SIZE); |
986 | initialize_hashtable(interface_names); |
987 | bool dup = false; |
988 | const Symbol* name = NULL; |
989 | { |
990 | debug_only(NoSafepointVerifier nsv;) |
991 | for (index = 0; index < itfs_len; index++) { |
992 | const InstanceKlass* const k = _local_interfaces->at(index); |
993 | name = k->name(); |
994 | // If no duplicates, add (name, NULL) in hashtable interface_names. |
995 | if (!put_after_lookup(name, NULL, interface_names)) { |
996 | dup = true; |
997 | break; |
998 | } |
999 | } |
1000 | } |
1001 | if (dup) { |
1002 | classfile_parse_error("Duplicate interface name \"%s\" in class file %s" , |
1003 | name->as_C_string(), CHECK); |
1004 | } |
1005 | } |
1006 | } |
1007 | |
1008 | void ClassFileParser::verify_constantvalue(const ConstantPool* const cp, |
1009 | int constantvalue_index, |
1010 | int signature_index, |
1011 | TRAPS) const { |
1012 | // Make sure the constant pool entry is of a type appropriate to this field |
1013 | guarantee_property( |
1014 | (constantvalue_index > 0 && |
1015 | constantvalue_index < cp->length()), |
1016 | "Bad initial value index %u in ConstantValue attribute in class file %s" , |
1017 | constantvalue_index, CHECK); |
1018 | |
1019 | const constantTag value_type = cp->tag_at(constantvalue_index); |
1020 | switch(cp->basic_type_for_signature_at(signature_index)) { |
1021 | case T_LONG: { |
1022 | guarantee_property(value_type.is_long(), |
1023 | "Inconsistent constant value type in class file %s" , |
1024 | CHECK); |
1025 | break; |
1026 | } |
1027 | case T_FLOAT: { |
1028 | guarantee_property(value_type.is_float(), |
1029 | "Inconsistent constant value type in class file %s" , |
1030 | CHECK); |
1031 | break; |
1032 | } |
1033 | case T_DOUBLE: { |
1034 | guarantee_property(value_type.is_double(), |
1035 | "Inconsistent constant value type in class file %s" , |
1036 | CHECK); |
1037 | break; |
1038 | } |
1039 | case T_BYTE: |
1040 | case T_CHAR: |
1041 | case T_SHORT: |
1042 | case T_BOOLEAN: |
1043 | case T_INT: { |
1044 | guarantee_property(value_type.is_int(), |
1045 | "Inconsistent constant value type in class file %s" , |
1046 | CHECK); |
1047 | break; |
1048 | } |
1049 | case T_OBJECT: { |
1050 | guarantee_property((cp->symbol_at(signature_index)->equals("Ljava/lang/String;" ) |
1051 | && value_type.is_string()), |
1052 | "Bad string initial value in class file %s" , |
1053 | CHECK); |
1054 | break; |
1055 | } |
1056 | default: { |
1057 | classfile_parse_error("Unable to set initial value %u in class file %s" , |
1058 | constantvalue_index, |
1059 | CHECK); |
1060 | } |
1061 | } |
1062 | } |
1063 | |
1064 | class AnnotationCollector : public ResourceObj{ |
1065 | public: |
1066 | enum Location { _in_field, _in_method, _in_class }; |
1067 | enum ID { |
1068 | _unknown = 0, |
1069 | _method_CallerSensitive, |
1070 | _method_ForceInline, |
1071 | _method_DontInline, |
1072 | _method_InjectedProfile, |
1073 | _method_LambdaForm_Compiled, |
1074 | _method_Hidden, |
1075 | _method_HotSpotIntrinsicCandidate, |
1076 | _jdk_internal_vm_annotation_Contended, |
1077 | _field_Stable, |
1078 | _jdk_internal_vm_annotation_ReservedStackAccess, |
1079 | _annotation_LIMIT |
1080 | }; |
1081 | const Location _location; |
1082 | int _annotations_present; |
1083 | u2 _contended_group; |
1084 | |
1085 | AnnotationCollector(Location location) |
1086 | : _location(location), _annotations_present(0) |
1087 | { |
1088 | assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, "" ); |
1089 | } |
1090 | // If this annotation name has an ID, report it (or _none). |
1091 | ID annotation_index(const ClassLoaderData* loader_data, const Symbol* name); |
1092 | // Set the annotation name: |
1093 | void set_annotation(ID id) { |
1094 | assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob" ); |
1095 | _annotations_present |= nth_bit((int)id); |
1096 | } |
1097 | |
1098 | void remove_annotation(ID id) { |
1099 | assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob" ); |
1100 | _annotations_present &= ~nth_bit((int)id); |
1101 | } |
1102 | |
1103 | // Report if the annotation is present. |
1104 | bool has_any_annotations() const { return _annotations_present != 0; } |
1105 | bool has_annotation(ID id) const { return (nth_bit((int)id) & _annotations_present) != 0; } |
1106 | |
1107 | void set_contended_group(u2 group) { _contended_group = group; } |
1108 | u2 contended_group() const { return _contended_group; } |
1109 | |
1110 | bool is_contended() const { return has_annotation(_jdk_internal_vm_annotation_Contended); } |
1111 | |
1112 | void set_stable(bool stable) { set_annotation(_field_Stable); } |
1113 | bool is_stable() const { return has_annotation(_field_Stable); } |
1114 | }; |
1115 | |
1116 | // This class also doubles as a holder for metadata cleanup. |
1117 | class ClassFileParser::FieldAnnotationCollector : public AnnotationCollector { |
1118 | private: |
1119 | ClassLoaderData* _loader_data; |
1120 | AnnotationArray* _field_annotations; |
1121 | AnnotationArray* _field_type_annotations; |
1122 | public: |
1123 | FieldAnnotationCollector(ClassLoaderData* loader_data) : |
1124 | AnnotationCollector(_in_field), |
1125 | _loader_data(loader_data), |
1126 | _field_annotations(NULL), |
1127 | _field_type_annotations(NULL) {} |
1128 | ~FieldAnnotationCollector(); |
1129 | void apply_to(FieldInfo* f); |
1130 | AnnotationArray* field_annotations() { return _field_annotations; } |
1131 | AnnotationArray* field_type_annotations() { return _field_type_annotations; } |
1132 | |
1133 | void set_field_annotations(AnnotationArray* a) { _field_annotations = a; } |
1134 | void set_field_type_annotations(AnnotationArray* a) { _field_type_annotations = a; } |
1135 | }; |
1136 | |
1137 | class MethodAnnotationCollector : public AnnotationCollector{ |
1138 | public: |
1139 | MethodAnnotationCollector() : AnnotationCollector(_in_method) { } |
1140 | void apply_to(const methodHandle& m); |
1141 | }; |
1142 | |
1143 | class ClassFileParser::ClassAnnotationCollector : public AnnotationCollector{ |
1144 | public: |
1145 | ClassAnnotationCollector() : AnnotationCollector(_in_class) { } |
1146 | void apply_to(InstanceKlass* ik); |
1147 | }; |
1148 | |
1149 | |
1150 | static int skip_annotation_value(const u1*, int, int); // fwd decl |
1151 | |
1152 | // Safely increment index by val if does not pass limit |
1153 | #define SAFE_ADD(index, limit, val) \ |
1154 | if (index >= limit - val) return limit; \ |
1155 | index += val; |
1156 | |
1157 | // Skip an annotation. Return >=limit if there is any problem. |
1158 | static int skip_annotation(const u1* buffer, int limit, int index) { |
1159 | assert(buffer != NULL, "invariant" ); |
1160 | // annotation := atype:u2 do(nmem:u2) {member:u2 value} |
1161 | // value := switch (tag:u1) { ... } |
1162 | SAFE_ADD(index, limit, 4); // skip atype and read nmem |
1163 | int nmem = Bytes::get_Java_u2((address)buffer + index - 2); |
1164 | while (--nmem >= 0 && index < limit) { |
1165 | SAFE_ADD(index, limit, 2); // skip member |
1166 | index = skip_annotation_value(buffer, limit, index); |
1167 | } |
1168 | return index; |
1169 | } |
1170 | |
1171 | // Skip an annotation value. Return >=limit if there is any problem. |
1172 | static int skip_annotation_value(const u1* buffer, int limit, int index) { |
1173 | assert(buffer != NULL, "invariant" ); |
1174 | |
1175 | // value := switch (tag:u1) { |
1176 | // case B, C, I, S, Z, D, F, J, c: con:u2; |
1177 | // case e: e_class:u2 e_name:u2; |
1178 | // case s: s_con:u2; |
1179 | // case [: do(nval:u2) {value}; |
1180 | // case @: annotation; |
1181 | // case s: s_con:u2; |
1182 | // } |
1183 | SAFE_ADD(index, limit, 1); // read tag |
1184 | const u1 tag = buffer[index - 1]; |
1185 | switch (tag) { |
1186 | case 'B': |
1187 | case 'C': |
1188 | case 'I': |
1189 | case 'S': |
1190 | case 'Z': |
1191 | case 'D': |
1192 | case 'F': |
1193 | case 'J': |
1194 | case 'c': |
1195 | case 's': |
1196 | SAFE_ADD(index, limit, 2); // skip con or s_con |
1197 | break; |
1198 | case 'e': |
1199 | SAFE_ADD(index, limit, 4); // skip e_class, e_name |
1200 | break; |
1201 | case '[': |
1202 | { |
1203 | SAFE_ADD(index, limit, 2); // read nval |
1204 | int nval = Bytes::get_Java_u2((address)buffer + index - 2); |
1205 | while (--nval >= 0 && index < limit) { |
1206 | index = skip_annotation_value(buffer, limit, index); |
1207 | } |
1208 | } |
1209 | break; |
1210 | case '@': |
1211 | index = skip_annotation(buffer, limit, index); |
1212 | break; |
1213 | default: |
1214 | return limit; // bad tag byte |
1215 | } |
1216 | return index; |
1217 | } |
1218 | |
1219 | // Sift through annotations, looking for those significant to the VM: |
1220 | static void parse_annotations(const ConstantPool* const cp, |
1221 | const u1* buffer, int limit, |
1222 | AnnotationCollector* coll, |
1223 | ClassLoaderData* loader_data, |
1224 | TRAPS) { |
1225 | |
1226 | assert(cp != NULL, "invariant" ); |
1227 | assert(buffer != NULL, "invariant" ); |
1228 | assert(coll != NULL, "invariant" ); |
1229 | assert(loader_data != NULL, "invariant" ); |
1230 | |
1231 | // annotations := do(nann:u2) {annotation} |
1232 | int index = 2; // read nann |
1233 | if (index >= limit) return; |
1234 | int nann = Bytes::get_Java_u2((address)buffer + index - 2); |
1235 | enum { // initial annotation layout |
1236 | atype_off = 0, // utf8 such as 'Ljava/lang/annotation/Retention;' |
1237 | count_off = 2, // u2 such as 1 (one value) |
1238 | member_off = 4, // utf8 such as 'value' |
1239 | tag_off = 6, // u1 such as 'c' (type) or 'e' (enum) |
1240 | e_tag_val = 'e', |
1241 | e_type_off = 7, // utf8 such as 'Ljava/lang/annotation/RetentionPolicy;' |
1242 | e_con_off = 9, // utf8 payload, such as 'SOURCE', 'CLASS', 'RUNTIME' |
1243 | e_size = 11, // end of 'e' annotation |
1244 | c_tag_val = 'c', // payload is type |
1245 | c_con_off = 7, // utf8 payload, such as 'I' |
1246 | c_size = 9, // end of 'c' annotation |
1247 | s_tag_val = 's', // payload is String |
1248 | s_con_off = 7, // utf8 payload, such as 'Ljava/lang/String;' |
1249 | s_size = 9, |
1250 | min_size = 6 // smallest possible size (zero members) |
1251 | }; |
1252 | // Cannot add min_size to index in case of overflow MAX_INT |
1253 | while ((--nann) >= 0 && (index - 2 <= limit - min_size)) { |
1254 | int index0 = index; |
1255 | index = skip_annotation(buffer, limit, index); |
1256 | const u1* const abase = buffer + index0; |
1257 | const int atype = Bytes::get_Java_u2((address)abase + atype_off); |
1258 | const int count = Bytes::get_Java_u2((address)abase + count_off); |
1259 | const Symbol* const aname = check_symbol_at(cp, atype); |
1260 | if (aname == NULL) break; // invalid annotation name |
1261 | const Symbol* member = NULL; |
1262 | if (count >= 1) { |
1263 | const int member_index = Bytes::get_Java_u2((address)abase + member_off); |
1264 | member = check_symbol_at(cp, member_index); |
1265 | if (member == NULL) break; // invalid member name |
1266 | } |
1267 | |
1268 | // Here is where parsing particular annotations will take place. |
1269 | AnnotationCollector::ID id = coll->annotation_index(loader_data, aname); |
1270 | if (AnnotationCollector::_unknown == id) continue; |
1271 | coll->set_annotation(id); |
1272 | |
1273 | if (AnnotationCollector::_jdk_internal_vm_annotation_Contended == id) { |
1274 | // @Contended can optionally specify the contention group. |
1275 | // |
1276 | // Contended group defines the equivalence class over the fields: |
1277 | // the fields within the same contended group are not treated distinct. |
1278 | // The only exception is default group, which does not incur the |
1279 | // equivalence. Naturally, contention group for classes is meaningless. |
1280 | // |
1281 | // While the contention group is specified as String, annotation |
1282 | // values are already interned, and we might as well use the constant |
1283 | // pool index as the group tag. |
1284 | // |
1285 | u2 group_index = 0; // default contended group |
1286 | if (count == 1 |
1287 | && s_size == (index - index0) // match size |
1288 | && s_tag_val == *(abase + tag_off) |
1289 | && member == vmSymbols::value_name()) { |
1290 | group_index = Bytes::get_Java_u2((address)abase + s_con_off); |
1291 | if (cp->symbol_at(group_index)->utf8_length() == 0) { |
1292 | group_index = 0; // default contended group |
1293 | } |
1294 | } |
1295 | coll->set_contended_group(group_index); |
1296 | } |
1297 | } |
1298 | } |
1299 | |
1300 | |
1301 | // Parse attributes for a field. |
1302 | void ClassFileParser::parse_field_attributes(const ClassFileStream* const cfs, |
1303 | u2 attributes_count, |
1304 | bool is_static, u2 signature_index, |
1305 | u2* const constantvalue_index_addr, |
1306 | bool* const is_synthetic_addr, |
1307 | u2* const generic_signature_index_addr, |
1308 | ClassFileParser::FieldAnnotationCollector* parsed_annotations, |
1309 | TRAPS) { |
1310 | assert(cfs != NULL, "invariant" ); |
1311 | assert(constantvalue_index_addr != NULL, "invariant" ); |
1312 | assert(is_synthetic_addr != NULL, "invariant" ); |
1313 | assert(generic_signature_index_addr != NULL, "invariant" ); |
1314 | assert(parsed_annotations != NULL, "invariant" ); |
1315 | assert(attributes_count > 0, "attributes_count should be greater than 0" ); |
1316 | |
1317 | u2 constantvalue_index = 0; |
1318 | u2 generic_signature_index = 0; |
1319 | bool is_synthetic = false; |
1320 | const u1* runtime_visible_annotations = NULL; |
1321 | int runtime_visible_annotations_length = 0; |
1322 | const u1* runtime_invisible_annotations = NULL; |
1323 | int runtime_invisible_annotations_length = 0; |
1324 | const u1* runtime_visible_type_annotations = NULL; |
1325 | int runtime_visible_type_annotations_length = 0; |
1326 | const u1* runtime_invisible_type_annotations = NULL; |
1327 | int runtime_invisible_type_annotations_length = 0; |
1328 | bool runtime_invisible_annotations_exists = false; |
1329 | bool runtime_invisible_type_annotations_exists = false; |
1330 | const ConstantPool* const cp = _cp; |
1331 | |
1332 | while (attributes_count--) { |
1333 | cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
1334 | const u2 attribute_name_index = cfs->get_u2_fast(); |
1335 | const u4 attribute_length = cfs->get_u4_fast(); |
1336 | check_property(valid_symbol_at(attribute_name_index), |
1337 | "Invalid field attribute index %u in class file %s" , |
1338 | attribute_name_index, |
1339 | CHECK); |
1340 | |
1341 | const Symbol* const attribute_name = cp->symbol_at(attribute_name_index); |
1342 | if (is_static && attribute_name == vmSymbols::tag_constant_value()) { |
1343 | // ignore if non-static |
1344 | if (constantvalue_index != 0) { |
1345 | classfile_parse_error("Duplicate ConstantValue attribute in class file %s" , CHECK); |
1346 | } |
1347 | check_property( |
1348 | attribute_length == 2, |
1349 | "Invalid ConstantValue field attribute length %u in class file %s" , |
1350 | attribute_length, CHECK); |
1351 | |
1352 | constantvalue_index = cfs->get_u2(CHECK); |
1353 | if (_need_verify) { |
1354 | verify_constantvalue(cp, constantvalue_index, signature_index, CHECK); |
1355 | } |
1356 | } else if (attribute_name == vmSymbols::tag_synthetic()) { |
1357 | if (attribute_length != 0) { |
1358 | classfile_parse_error( |
1359 | "Invalid Synthetic field attribute length %u in class file %s" , |
1360 | attribute_length, CHECK); |
1361 | } |
1362 | is_synthetic = true; |
1363 | } else if (attribute_name == vmSymbols::tag_deprecated()) { // 4276120 |
1364 | if (attribute_length != 0) { |
1365 | classfile_parse_error( |
1366 | "Invalid Deprecated field attribute length %u in class file %s" , |
1367 | attribute_length, CHECK); |
1368 | } |
1369 | } else if (_major_version >= JAVA_1_5_VERSION) { |
1370 | if (attribute_name == vmSymbols::tag_signature()) { |
1371 | if (generic_signature_index != 0) { |
1372 | classfile_parse_error( |
1373 | "Multiple Signature attributes for field in class file %s" , CHECK); |
1374 | } |
1375 | if (attribute_length != 2) { |
1376 | classfile_parse_error( |
1377 | "Wrong size %u for field's Signature attribute in class file %s" , |
1378 | attribute_length, CHECK); |
1379 | } |
1380 | generic_signature_index = parse_generic_signature_attribute(cfs, CHECK); |
1381 | } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
1382 | if (runtime_visible_annotations != NULL) { |
1383 | classfile_parse_error( |
1384 | "Multiple RuntimeVisibleAnnotations attributes for field in class file %s" , CHECK); |
1385 | } |
1386 | runtime_visible_annotations_length = attribute_length; |
1387 | runtime_visible_annotations = cfs->current(); |
1388 | assert(runtime_visible_annotations != NULL, "null visible annotations" ); |
1389 | cfs->guarantee_more(runtime_visible_annotations_length, CHECK); |
1390 | parse_annotations(cp, |
1391 | runtime_visible_annotations, |
1392 | runtime_visible_annotations_length, |
1393 | parsed_annotations, |
1394 | _loader_data, |
1395 | CHECK); |
1396 | cfs->skip_u1_fast(runtime_visible_annotations_length); |
1397 | } else if (attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
1398 | if (runtime_invisible_annotations_exists) { |
1399 | classfile_parse_error( |
1400 | "Multiple RuntimeInvisibleAnnotations attributes for field in class file %s" , CHECK); |
1401 | } |
1402 | runtime_invisible_annotations_exists = true; |
1403 | if (PreserveAllAnnotations) { |
1404 | runtime_invisible_annotations_length = attribute_length; |
1405 | runtime_invisible_annotations = cfs->current(); |
1406 | assert(runtime_invisible_annotations != NULL, "null invisible annotations" ); |
1407 | } |
1408 | cfs->skip_u1(attribute_length, CHECK); |
1409 | } else if (attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) { |
1410 | if (runtime_visible_type_annotations != NULL) { |
1411 | classfile_parse_error( |
1412 | "Multiple RuntimeVisibleTypeAnnotations attributes for field in class file %s" , CHECK); |
1413 | } |
1414 | runtime_visible_type_annotations_length = attribute_length; |
1415 | runtime_visible_type_annotations = cfs->current(); |
1416 | assert(runtime_visible_type_annotations != NULL, "null visible type annotations" ); |
1417 | cfs->skip_u1(runtime_visible_type_annotations_length, CHECK); |
1418 | } else if (attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) { |
1419 | if (runtime_invisible_type_annotations_exists) { |
1420 | classfile_parse_error( |
1421 | "Multiple RuntimeInvisibleTypeAnnotations attributes for field in class file %s" , CHECK); |
1422 | } else { |
1423 | runtime_invisible_type_annotations_exists = true; |
1424 | } |
1425 | if (PreserveAllAnnotations) { |
1426 | runtime_invisible_type_annotations_length = attribute_length; |
1427 | runtime_invisible_type_annotations = cfs->current(); |
1428 | assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations" ); |
1429 | } |
1430 | cfs->skip_u1(attribute_length, CHECK); |
1431 | } else { |
1432 | cfs->skip_u1(attribute_length, CHECK); // Skip unknown attributes |
1433 | } |
1434 | } else { |
1435 | cfs->skip_u1(attribute_length, CHECK); // Skip unknown attributes |
1436 | } |
1437 | } |
1438 | |
1439 | *constantvalue_index_addr = constantvalue_index; |
1440 | *is_synthetic_addr = is_synthetic; |
1441 | *generic_signature_index_addr = generic_signature_index; |
1442 | AnnotationArray* a = assemble_annotations(runtime_visible_annotations, |
1443 | runtime_visible_annotations_length, |
1444 | runtime_invisible_annotations, |
1445 | runtime_invisible_annotations_length, |
1446 | CHECK); |
1447 | parsed_annotations->set_field_annotations(a); |
1448 | a = assemble_annotations(runtime_visible_type_annotations, |
1449 | runtime_visible_type_annotations_length, |
1450 | runtime_invisible_type_annotations, |
1451 | runtime_invisible_type_annotations_length, |
1452 | CHECK); |
1453 | parsed_annotations->set_field_type_annotations(a); |
1454 | return; |
1455 | } |
1456 | |
1457 | |
1458 | // Field allocation types. Used for computing field offsets. |
1459 | |
1460 | enum FieldAllocationType { |
1461 | STATIC_OOP, // Oops |
1462 | STATIC_BYTE, // Boolean, Byte, char |
1463 | STATIC_SHORT, // shorts |
1464 | STATIC_WORD, // ints |
1465 | STATIC_DOUBLE, // aligned long or double |
1466 | NONSTATIC_OOP, |
1467 | NONSTATIC_BYTE, |
1468 | NONSTATIC_SHORT, |
1469 | NONSTATIC_WORD, |
1470 | NONSTATIC_DOUBLE, |
1471 | MAX_FIELD_ALLOCATION_TYPE, |
1472 | BAD_ALLOCATION_TYPE = -1 |
1473 | }; |
1474 | |
1475 | static FieldAllocationType _basic_type_to_atype[2 * (T_CONFLICT + 1)] = { |
1476 | BAD_ALLOCATION_TYPE, // 0 |
1477 | BAD_ALLOCATION_TYPE, // 1 |
1478 | BAD_ALLOCATION_TYPE, // 2 |
1479 | BAD_ALLOCATION_TYPE, // 3 |
1480 | NONSTATIC_BYTE , // T_BOOLEAN = 4, |
1481 | NONSTATIC_SHORT, // T_CHAR = 5, |
1482 | NONSTATIC_WORD, // T_FLOAT = 6, |
1483 | NONSTATIC_DOUBLE, // T_DOUBLE = 7, |
1484 | NONSTATIC_BYTE, // T_BYTE = 8, |
1485 | NONSTATIC_SHORT, // T_SHORT = 9, |
1486 | NONSTATIC_WORD, // T_INT = 10, |
1487 | NONSTATIC_DOUBLE, // T_LONG = 11, |
1488 | NONSTATIC_OOP, // T_OBJECT = 12, |
1489 | NONSTATIC_OOP, // T_ARRAY = 13, |
1490 | BAD_ALLOCATION_TYPE, // T_VOID = 14, |
1491 | BAD_ALLOCATION_TYPE, // T_ADDRESS = 15, |
1492 | BAD_ALLOCATION_TYPE, // T_NARROWOOP = 16, |
1493 | BAD_ALLOCATION_TYPE, // T_METADATA = 17, |
1494 | BAD_ALLOCATION_TYPE, // T_NARROWKLASS = 18, |
1495 | BAD_ALLOCATION_TYPE, // T_CONFLICT = 19, |
1496 | BAD_ALLOCATION_TYPE, // 0 |
1497 | BAD_ALLOCATION_TYPE, // 1 |
1498 | BAD_ALLOCATION_TYPE, // 2 |
1499 | BAD_ALLOCATION_TYPE, // 3 |
1500 | STATIC_BYTE , // T_BOOLEAN = 4, |
1501 | STATIC_SHORT, // T_CHAR = 5, |
1502 | STATIC_WORD, // T_FLOAT = 6, |
1503 | STATIC_DOUBLE, // T_DOUBLE = 7, |
1504 | STATIC_BYTE, // T_BYTE = 8, |
1505 | STATIC_SHORT, // T_SHORT = 9, |
1506 | STATIC_WORD, // T_INT = 10, |
1507 | STATIC_DOUBLE, // T_LONG = 11, |
1508 | STATIC_OOP, // T_OBJECT = 12, |
1509 | STATIC_OOP, // T_ARRAY = 13, |
1510 | BAD_ALLOCATION_TYPE, // T_VOID = 14, |
1511 | BAD_ALLOCATION_TYPE, // T_ADDRESS = 15, |
1512 | BAD_ALLOCATION_TYPE, // T_NARROWOOP = 16, |
1513 | BAD_ALLOCATION_TYPE, // T_METADATA = 17, |
1514 | BAD_ALLOCATION_TYPE, // T_NARROWKLASS = 18, |
1515 | BAD_ALLOCATION_TYPE, // T_CONFLICT = 19, |
1516 | }; |
1517 | |
1518 | static FieldAllocationType basic_type_to_atype(bool is_static, BasicType type) { |
1519 | assert(type >= T_BOOLEAN && type < T_VOID, "only allowable values" ); |
1520 | FieldAllocationType result = _basic_type_to_atype[type + (is_static ? (T_CONFLICT + 1) : 0)]; |
1521 | assert(result != BAD_ALLOCATION_TYPE, "bad type" ); |
1522 | return result; |
1523 | } |
1524 | |
1525 | class ClassFileParser::FieldAllocationCount : public ResourceObj { |
1526 | public: |
1527 | u2 count[MAX_FIELD_ALLOCATION_TYPE]; |
1528 | |
1529 | FieldAllocationCount() { |
1530 | for (int i = 0; i < MAX_FIELD_ALLOCATION_TYPE; i++) { |
1531 | count[i] = 0; |
1532 | } |
1533 | } |
1534 | |
1535 | FieldAllocationType update(bool is_static, BasicType type) { |
1536 | FieldAllocationType atype = basic_type_to_atype(is_static, type); |
1537 | if (atype != BAD_ALLOCATION_TYPE) { |
1538 | // Make sure there is no overflow with injected fields. |
1539 | assert(count[atype] < 0xFFFF, "More than 65535 fields" ); |
1540 | count[atype]++; |
1541 | } |
1542 | return atype; |
1543 | } |
1544 | }; |
1545 | |
1546 | // Side-effects: populates the _fields, _fields_annotations, |
1547 | // _fields_type_annotations fields |
1548 | void ClassFileParser::parse_fields(const ClassFileStream* const cfs, |
1549 | bool is_interface, |
1550 | FieldAllocationCount* const fac, |
1551 | ConstantPool* cp, |
1552 | const int cp_size, |
1553 | u2* const java_fields_count_ptr, |
1554 | TRAPS) { |
1555 | |
1556 | assert(cfs != NULL, "invariant" ); |
1557 | assert(fac != NULL, "invariant" ); |
1558 | assert(cp != NULL, "invariant" ); |
1559 | assert(java_fields_count_ptr != NULL, "invariant" ); |
1560 | |
1561 | assert(NULL == _fields, "invariant" ); |
1562 | assert(NULL == _fields_annotations, "invariant" ); |
1563 | assert(NULL == _fields_type_annotations, "invariant" ); |
1564 | |
1565 | cfs->guarantee_more(2, CHECK); // length |
1566 | const u2 length = cfs->get_u2_fast(); |
1567 | *java_fields_count_ptr = length; |
1568 | |
1569 | int num_injected = 0; |
1570 | const InjectedField* const injected = JavaClasses::get_injected(_class_name, |
1571 | &num_injected); |
1572 | const int total_fields = length + num_injected; |
1573 | |
1574 | // The field array starts with tuples of shorts |
1575 | // [access, name index, sig index, initial value index, byte offset]. |
1576 | // A generic signature slot only exists for field with generic |
1577 | // signature attribute. And the access flag is set with |
1578 | // JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE for that field. The generic |
1579 | // signature slots are at the end of the field array and after all |
1580 | // other fields data. |
1581 | // |
1582 | // f1: [access, name index, sig index, initial value index, low_offset, high_offset] |
1583 | // f2: [access, name index, sig index, initial value index, low_offset, high_offset] |
1584 | // ... |
1585 | // fn: [access, name index, sig index, initial value index, low_offset, high_offset] |
1586 | // [generic signature index] |
1587 | // [generic signature index] |
1588 | // ... |
1589 | // |
1590 | // Allocate a temporary resource array for field data. For each field, |
1591 | // a slot is reserved in the temporary array for the generic signature |
1592 | // index. After parsing all fields, the data are copied to a permanent |
1593 | // array and any unused slots will be discarded. |
1594 | ResourceMark rm(THREAD); |
1595 | u2* const fa = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, |
1596 | u2, |
1597 | total_fields * (FieldInfo::field_slots + 1)); |
1598 | |
1599 | // The generic signature slots start after all other fields' data. |
1600 | int generic_signature_slot = total_fields * FieldInfo::field_slots; |
1601 | int num_generic_signature = 0; |
1602 | for (int n = 0; n < length; n++) { |
1603 | // access_flags, name_index, descriptor_index, attributes_count |
1604 | cfs->guarantee_more(8, CHECK); |
1605 | |
1606 | AccessFlags access_flags; |
1607 | const jint flags = cfs->get_u2_fast() & JVM_RECOGNIZED_FIELD_MODIFIERS; |
1608 | verify_legal_field_modifiers(flags, is_interface, CHECK); |
1609 | access_flags.set_flags(flags); |
1610 | |
1611 | const u2 name_index = cfs->get_u2_fast(); |
1612 | check_property(valid_symbol_at(name_index), |
1613 | "Invalid constant pool index %u for field name in class file %s" , |
1614 | name_index, CHECK); |
1615 | const Symbol* const name = cp->symbol_at(name_index); |
1616 | verify_legal_field_name(name, CHECK); |
1617 | |
1618 | const u2 signature_index = cfs->get_u2_fast(); |
1619 | check_property(valid_symbol_at(signature_index), |
1620 | "Invalid constant pool index %u for field signature in class file %s" , |
1621 | signature_index, CHECK); |
1622 | const Symbol* const sig = cp->symbol_at(signature_index); |
1623 | verify_legal_field_signature(name, sig, CHECK); |
1624 | |
1625 | u2 constantvalue_index = 0; |
1626 | bool is_synthetic = false; |
1627 | u2 generic_signature_index = 0; |
1628 | const bool is_static = access_flags.is_static(); |
1629 | FieldAnnotationCollector parsed_annotations(_loader_data); |
1630 | |
1631 | const u2 attributes_count = cfs->get_u2_fast(); |
1632 | if (attributes_count > 0) { |
1633 | parse_field_attributes(cfs, |
1634 | attributes_count, |
1635 | is_static, |
1636 | signature_index, |
1637 | &constantvalue_index, |
1638 | &is_synthetic, |
1639 | &generic_signature_index, |
1640 | &parsed_annotations, |
1641 | CHECK); |
1642 | |
1643 | if (parsed_annotations.field_annotations() != NULL) { |
1644 | if (_fields_annotations == NULL) { |
1645 | _fields_annotations = MetadataFactory::new_array<AnnotationArray*>( |
1646 | _loader_data, length, NULL, |
1647 | CHECK); |
1648 | } |
1649 | _fields_annotations->at_put(n, parsed_annotations.field_annotations()); |
1650 | parsed_annotations.set_field_annotations(NULL); |
1651 | } |
1652 | if (parsed_annotations.field_type_annotations() != NULL) { |
1653 | if (_fields_type_annotations == NULL) { |
1654 | _fields_type_annotations = |
1655 | MetadataFactory::new_array<AnnotationArray*>(_loader_data, |
1656 | length, |
1657 | NULL, |
1658 | CHECK); |
1659 | } |
1660 | _fields_type_annotations->at_put(n, parsed_annotations.field_type_annotations()); |
1661 | parsed_annotations.set_field_type_annotations(NULL); |
1662 | } |
1663 | |
1664 | if (is_synthetic) { |
1665 | access_flags.set_is_synthetic(); |
1666 | } |
1667 | if (generic_signature_index != 0) { |
1668 | access_flags.set_field_has_generic_signature(); |
1669 | fa[generic_signature_slot] = generic_signature_index; |
1670 | generic_signature_slot ++; |
1671 | num_generic_signature ++; |
1672 | } |
1673 | } |
1674 | |
1675 | FieldInfo* const field = FieldInfo::from_field_array(fa, n); |
1676 | field->initialize(access_flags.as_short(), |
1677 | name_index, |
1678 | signature_index, |
1679 | constantvalue_index); |
1680 | const BasicType type = cp->basic_type_for_signature_at(signature_index); |
1681 | |
1682 | // Remember how many oops we encountered and compute allocation type |
1683 | const FieldAllocationType atype = fac->update(is_static, type); |
1684 | field->set_allocation_type(atype); |
1685 | |
1686 | // After field is initialized with type, we can augment it with aux info |
1687 | if (parsed_annotations.has_any_annotations()) |
1688 | parsed_annotations.apply_to(field); |
1689 | } |
1690 | |
1691 | int index = length; |
1692 | if (num_injected != 0) { |
1693 | for (int n = 0; n < num_injected; n++) { |
1694 | // Check for duplicates |
1695 | if (injected[n].may_be_java) { |
1696 | const Symbol* const name = injected[n].name(); |
1697 | const Symbol* const signature = injected[n].signature(); |
1698 | bool duplicate = false; |
1699 | for (int i = 0; i < length; i++) { |
1700 | const FieldInfo* const f = FieldInfo::from_field_array(fa, i); |
1701 | if (name == cp->symbol_at(f->name_index()) && |
1702 | signature == cp->symbol_at(f->signature_index())) { |
1703 | // Symbol is desclared in Java so skip this one |
1704 | duplicate = true; |
1705 | break; |
1706 | } |
1707 | } |
1708 | if (duplicate) { |
1709 | // These will be removed from the field array at the end |
1710 | continue; |
1711 | } |
1712 | } |
1713 | |
1714 | // Injected field |
1715 | FieldInfo* const field = FieldInfo::from_field_array(fa, index); |
1716 | field->initialize(JVM_ACC_FIELD_INTERNAL, |
1717 | injected[n].name_index, |
1718 | injected[n].signature_index, |
1719 | 0); |
1720 | |
1721 | const BasicType type = FieldType::basic_type(injected[n].signature()); |
1722 | |
1723 | // Remember how many oops we encountered and compute allocation type |
1724 | const FieldAllocationType atype = fac->update(false, type); |
1725 | field->set_allocation_type(atype); |
1726 | index++; |
1727 | } |
1728 | } |
1729 | |
1730 | assert(NULL == _fields, "invariant" ); |
1731 | |
1732 | _fields = |
1733 | MetadataFactory::new_array<u2>(_loader_data, |
1734 | index * FieldInfo::field_slots + num_generic_signature, |
1735 | CHECK); |
1736 | // Sometimes injected fields already exist in the Java source so |
1737 | // the fields array could be too long. In that case the |
1738 | // fields array is trimed. Also unused slots that were reserved |
1739 | // for generic signature indexes are discarded. |
1740 | { |
1741 | int i = 0; |
1742 | for (; i < index * FieldInfo::field_slots; i++) { |
1743 | _fields->at_put(i, fa[i]); |
1744 | } |
1745 | for (int j = total_fields * FieldInfo::field_slots; |
1746 | j < generic_signature_slot; j++) { |
1747 | _fields->at_put(i++, fa[j]); |
1748 | } |
1749 | assert(_fields->length() == i, "" ); |
1750 | } |
1751 | |
1752 | if (_need_verify && length > 1) { |
1753 | // Check duplicated fields |
1754 | ResourceMark rm(THREAD); |
1755 | NameSigHash** names_and_sigs = NEW_RESOURCE_ARRAY_IN_THREAD( |
1756 | THREAD, NameSigHash*, HASH_ROW_SIZE); |
1757 | initialize_hashtable(names_and_sigs); |
1758 | bool dup = false; |
1759 | const Symbol* name = NULL; |
1760 | const Symbol* sig = NULL; |
1761 | { |
1762 | debug_only(NoSafepointVerifier nsv;) |
1763 | for (AllFieldStream fs(_fields, cp); !fs.done(); fs.next()) { |
1764 | name = fs.name(); |
1765 | sig = fs.signature(); |
1766 | // If no duplicates, add name/signature in hashtable names_and_sigs. |
1767 | if (!put_after_lookup(name, sig, names_and_sigs)) { |
1768 | dup = true; |
1769 | break; |
1770 | } |
1771 | } |
1772 | } |
1773 | if (dup) { |
1774 | classfile_parse_error("Duplicate field name \"%s\" with signature \"%s\" in class file %s" , |
1775 | name->as_C_string(), sig->as_klass_external_name(), CHECK); |
1776 | } |
1777 | } |
1778 | } |
1779 | |
1780 | |
1781 | const ClassFileParser::unsafe_u2* ClassFileParser::parse_exception_table(const ClassFileStream* const cfs, |
1782 | u4 code_length, |
1783 | u4 exception_table_length, |
1784 | TRAPS) { |
1785 | assert(cfs != NULL, "invariant" ); |
1786 | |
1787 | const unsafe_u2* const exception_table_start = cfs->current(); |
1788 | assert(exception_table_start != NULL, "null exception table" ); |
1789 | |
1790 | cfs->guarantee_more(8 * exception_table_length, CHECK_NULL); // start_pc, |
1791 | // end_pc, |
1792 | // handler_pc, |
1793 | // catch_type_index |
1794 | |
1795 | // Will check legal target after parsing code array in verifier. |
1796 | if (_need_verify) { |
1797 | for (unsigned int i = 0; i < exception_table_length; i++) { |
1798 | const u2 start_pc = cfs->get_u2_fast(); |
1799 | const u2 end_pc = cfs->get_u2_fast(); |
1800 | const u2 handler_pc = cfs->get_u2_fast(); |
1801 | const u2 catch_type_index = cfs->get_u2_fast(); |
1802 | guarantee_property((start_pc < end_pc) && (end_pc <= code_length), |
1803 | "Illegal exception table range in class file %s" , |
1804 | CHECK_NULL); |
1805 | guarantee_property(handler_pc < code_length, |
1806 | "Illegal exception table handler in class file %s" , |
1807 | CHECK_NULL); |
1808 | if (catch_type_index != 0) { |
1809 | guarantee_property(valid_klass_reference_at(catch_type_index), |
1810 | "Catch type in exception table has bad constant type in class file %s" , CHECK_NULL); |
1811 | } |
1812 | } |
1813 | } else { |
1814 | cfs->skip_u2_fast(exception_table_length * 4); |
1815 | } |
1816 | return exception_table_start; |
1817 | } |
1818 | |
1819 | void ClassFileParser::parse_linenumber_table(u4 code_attribute_length, |
1820 | u4 code_length, |
1821 | CompressedLineNumberWriteStream**const write_stream, |
1822 | TRAPS) { |
1823 | |
1824 | const ClassFileStream* const cfs = _stream; |
1825 | unsigned int num_entries = cfs->get_u2(CHECK); |
1826 | |
1827 | // Each entry is a u2 start_pc, and a u2 line_number |
1828 | const unsigned int length_in_bytes = num_entries * (sizeof(u2) * 2); |
1829 | |
1830 | // Verify line number attribute and table length |
1831 | check_property( |
1832 | code_attribute_length == sizeof(u2) + length_in_bytes, |
1833 | "LineNumberTable attribute has wrong length in class file %s" , CHECK); |
1834 | |
1835 | cfs->guarantee_more(length_in_bytes, CHECK); |
1836 | |
1837 | if ((*write_stream) == NULL) { |
1838 | if (length_in_bytes > fixed_buffer_size) { |
1839 | (*write_stream) = new CompressedLineNumberWriteStream(length_in_bytes); |
1840 | } else { |
1841 | (*write_stream) = new CompressedLineNumberWriteStream( |
1842 | _linenumbertable_buffer, fixed_buffer_size); |
1843 | } |
1844 | } |
1845 | |
1846 | while (num_entries-- > 0) { |
1847 | const u2 bci = cfs->get_u2_fast(); // start_pc |
1848 | const u2 line = cfs->get_u2_fast(); // line_number |
1849 | guarantee_property(bci < code_length, |
1850 | "Invalid pc in LineNumberTable in class file %s" , CHECK); |
1851 | (*write_stream)->write_pair(bci, line); |
1852 | } |
1853 | } |
1854 | |
1855 | |
1856 | class LVT_Hash : public AllStatic { |
1857 | public: |
1858 | |
1859 | static bool equals(LocalVariableTableElement const& e0, LocalVariableTableElement const& e1) { |
1860 | /* |
1861 | * 3-tuple start_bci/length/slot has to be unique key, |
1862 | * so the following comparison seems to be redundant: |
1863 | * && elem->name_cp_index == entry->_elem->name_cp_index |
1864 | */ |
1865 | return (e0.start_bci == e1.start_bci && |
1866 | e0.length == e1.length && |
1867 | e0.name_cp_index == e1.name_cp_index && |
1868 | e0.slot == e1.slot); |
1869 | } |
1870 | |
1871 | static unsigned int hash(LocalVariableTableElement const& e0) { |
1872 | unsigned int raw_hash = e0.start_bci; |
1873 | |
1874 | raw_hash = e0.length + raw_hash * 37; |
1875 | raw_hash = e0.name_cp_index + raw_hash * 37; |
1876 | raw_hash = e0.slot + raw_hash * 37; |
1877 | |
1878 | return raw_hash; |
1879 | } |
1880 | }; |
1881 | |
1882 | |
1883 | // Class file LocalVariableTable elements. |
1884 | class Classfile_LVT_Element { |
1885 | public: |
1886 | u2 start_bci; |
1887 | u2 length; |
1888 | u2 name_cp_index; |
1889 | u2 descriptor_cp_index; |
1890 | u2 slot; |
1891 | }; |
1892 | |
1893 | static void copy_lvt_element(const Classfile_LVT_Element* const src, |
1894 | LocalVariableTableElement* const lvt) { |
1895 | lvt->start_bci = Bytes::get_Java_u2((u1*) &src->start_bci); |
1896 | lvt->length = Bytes::get_Java_u2((u1*) &src->length); |
1897 | lvt->name_cp_index = Bytes::get_Java_u2((u1*) &src->name_cp_index); |
1898 | lvt->descriptor_cp_index = Bytes::get_Java_u2((u1*) &src->descriptor_cp_index); |
1899 | lvt->signature_cp_index = 0; |
1900 | lvt->slot = Bytes::get_Java_u2((u1*) &src->slot); |
1901 | } |
1902 | |
1903 | // Function is used to parse both attributes: |
1904 | // LocalVariableTable (LVT) and LocalVariableTypeTable (LVTT) |
1905 | const ClassFileParser::unsafe_u2* ClassFileParser::parse_localvariable_table(const ClassFileStream* cfs, |
1906 | u4 code_length, |
1907 | u2 max_locals, |
1908 | u4 code_attribute_length, |
1909 | u2* const localvariable_table_length, |
1910 | bool isLVTT, |
1911 | TRAPS) { |
1912 | const char* const tbl_name = (isLVTT) ? "LocalVariableTypeTable" : "LocalVariableTable" ; |
1913 | *localvariable_table_length = cfs->get_u2(CHECK_NULL); |
1914 | const unsigned int size = |
1915 | (*localvariable_table_length) * sizeof(Classfile_LVT_Element) / sizeof(u2); |
1916 | |
1917 | const ConstantPool* const cp = _cp; |
1918 | |
1919 | // Verify local variable table attribute has right length |
1920 | if (_need_verify) { |
1921 | guarantee_property(code_attribute_length == (sizeof(*localvariable_table_length) + size * sizeof(u2)), |
1922 | "%s has wrong length in class file %s" , tbl_name, CHECK_NULL); |
1923 | } |
1924 | |
1925 | const unsafe_u2* const localvariable_table_start = cfs->current(); |
1926 | assert(localvariable_table_start != NULL, "null local variable table" ); |
1927 | if (!_need_verify) { |
1928 | cfs->skip_u2_fast(size); |
1929 | } else { |
1930 | cfs->guarantee_more(size * 2, CHECK_NULL); |
1931 | for(int i = 0; i < (*localvariable_table_length); i++) { |
1932 | const u2 start_pc = cfs->get_u2_fast(); |
1933 | const u2 length = cfs->get_u2_fast(); |
1934 | const u2 name_index = cfs->get_u2_fast(); |
1935 | const u2 descriptor_index = cfs->get_u2_fast(); |
1936 | const u2 index = cfs->get_u2_fast(); |
1937 | // Assign to a u4 to avoid overflow |
1938 | const u4 end_pc = (u4)start_pc + (u4)length; |
1939 | |
1940 | if (start_pc >= code_length) { |
1941 | classfile_parse_error( |
1942 | "Invalid start_pc %u in %s in class file %s" , |
1943 | start_pc, tbl_name, CHECK_NULL); |
1944 | } |
1945 | if (end_pc > code_length) { |
1946 | classfile_parse_error( |
1947 | "Invalid length %u in %s in class file %s" , |
1948 | length, tbl_name, CHECK_NULL); |
1949 | } |
1950 | const int cp_size = cp->length(); |
1951 | guarantee_property(valid_symbol_at(name_index), |
1952 | "Name index %u in %s has bad constant type in class file %s" , |
1953 | name_index, tbl_name, CHECK_NULL); |
1954 | guarantee_property(valid_symbol_at(descriptor_index), |
1955 | "Signature index %u in %s has bad constant type in class file %s" , |
1956 | descriptor_index, tbl_name, CHECK_NULL); |
1957 | |
1958 | const Symbol* const name = cp->symbol_at(name_index); |
1959 | const Symbol* const sig = cp->symbol_at(descriptor_index); |
1960 | verify_legal_field_name(name, CHECK_NULL); |
1961 | u2 = 0; |
1962 | if (!isLVTT) { |
1963 | verify_legal_field_signature(name, sig, CHECK_NULL); |
1964 | |
1965 | // 4894874: check special cases for double and long local variables |
1966 | if (sig == vmSymbols::type_signature(T_DOUBLE) || |
1967 | sig == vmSymbols::type_signature(T_LONG)) { |
1968 | extra_slot = 1; |
1969 | } |
1970 | } |
1971 | guarantee_property((index + extra_slot) < max_locals, |
1972 | "Invalid index %u in %s in class file %s" , |
1973 | index, tbl_name, CHECK_NULL); |
1974 | } |
1975 | } |
1976 | return localvariable_table_start; |
1977 | } |
1978 | |
1979 | static const u1* parse_stackmap_table(const ClassFileStream* const cfs, |
1980 | u4 code_attribute_length, |
1981 | bool need_verify, |
1982 | TRAPS) { |
1983 | assert(cfs != NULL, "invariant" ); |
1984 | |
1985 | if (0 == code_attribute_length) { |
1986 | return NULL; |
1987 | } |
1988 | |
1989 | const u1* const stackmap_table_start = cfs->current(); |
1990 | assert(stackmap_table_start != NULL, "null stackmap table" ); |
1991 | |
1992 | // check code_attribute_length first |
1993 | cfs->skip_u1(code_attribute_length, CHECK_NULL); |
1994 | |
1995 | if (!need_verify && !DumpSharedSpaces) { |
1996 | return NULL; |
1997 | } |
1998 | return stackmap_table_start; |
1999 | } |
2000 | |
2001 | const ClassFileParser::unsafe_u2* ClassFileParser::parse_checked_exceptions(const ClassFileStream* const cfs, |
2002 | u2* const checked_exceptions_length, |
2003 | u4 method_attribute_length, |
2004 | TRAPS) { |
2005 | assert(cfs != NULL, "invariant" ); |
2006 | assert(checked_exceptions_length != NULL, "invariant" ); |
2007 | |
2008 | cfs->guarantee_more(2, CHECK_NULL); // checked_exceptions_length |
2009 | *checked_exceptions_length = cfs->get_u2_fast(); |
2010 | const unsigned int size = |
2011 | (*checked_exceptions_length) * sizeof(CheckedExceptionElement) / sizeof(u2); |
2012 | const unsafe_u2* const checked_exceptions_start = cfs->current(); |
2013 | assert(checked_exceptions_start != NULL, "null checked exceptions" ); |
2014 | if (!_need_verify) { |
2015 | cfs->skip_u2_fast(size); |
2016 | } else { |
2017 | // Verify each value in the checked exception table |
2018 | u2 checked_exception; |
2019 | const u2 len = *checked_exceptions_length; |
2020 | cfs->guarantee_more(2 * len, CHECK_NULL); |
2021 | for (int i = 0; i < len; i++) { |
2022 | checked_exception = cfs->get_u2_fast(); |
2023 | check_property( |
2024 | valid_klass_reference_at(checked_exception), |
2025 | "Exception name has bad type at constant pool %u in class file %s" , |
2026 | checked_exception, CHECK_NULL); |
2027 | } |
2028 | } |
2029 | // check exceptions attribute length |
2030 | if (_need_verify) { |
2031 | guarantee_property(method_attribute_length == (sizeof(*checked_exceptions_length) + |
2032 | sizeof(u2) * size), |
2033 | "Exceptions attribute has wrong length in class file %s" , CHECK_NULL); |
2034 | } |
2035 | return checked_exceptions_start; |
2036 | } |
2037 | |
2038 | void ClassFileParser::throwIllegalSignature(const char* type, |
2039 | const Symbol* name, |
2040 | const Symbol* sig, |
2041 | TRAPS) const { |
2042 | assert(name != NULL, "invariant" ); |
2043 | assert(sig != NULL, "invariant" ); |
2044 | |
2045 | ResourceMark rm(THREAD); |
2046 | Exceptions::fthrow(THREAD_AND_LOCATION, |
2047 | vmSymbols::java_lang_ClassFormatError(), |
2048 | "%s \"%s\" in class %s has illegal signature \"%s\"" , type, |
2049 | name->as_C_string(), _class_name->as_C_string(), sig->as_C_string()); |
2050 | } |
2051 | |
2052 | AnnotationCollector::ID |
2053 | AnnotationCollector::annotation_index(const ClassLoaderData* loader_data, |
2054 | const Symbol* name) { |
2055 | const vmSymbols::SID sid = vmSymbols::find_sid(name); |
2056 | // Privileged code can use all annotations. Other code silently drops some. |
2057 | const bool privileged = loader_data->is_the_null_class_loader_data() || |
2058 | loader_data->is_platform_class_loader_data() || |
2059 | loader_data->is_unsafe_anonymous(); |
2060 | switch (sid) { |
2061 | case vmSymbols::VM_SYMBOL_ENUM_NAME(reflect_CallerSensitive_signature): { |
2062 | if (_location != _in_method) break; // only allow for methods |
2063 | if (!privileged) break; // only allow in privileged code |
2064 | return _method_CallerSensitive; |
2065 | } |
2066 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_ForceInline_signature): { |
2067 | if (_location != _in_method) break; // only allow for methods |
2068 | if (!privileged) break; // only allow in privileged code |
2069 | return _method_ForceInline; |
2070 | } |
2071 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_DontInline_signature): { |
2072 | if (_location != _in_method) break; // only allow for methods |
2073 | if (!privileged) break; // only allow in privileged code |
2074 | return _method_DontInline; |
2075 | } |
2076 | case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_InjectedProfile_signature): { |
2077 | if (_location != _in_method) break; // only allow for methods |
2078 | if (!privileged) break; // only allow in privileged code |
2079 | return _method_InjectedProfile; |
2080 | } |
2081 | case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature): { |
2082 | if (_location != _in_method) break; // only allow for methods |
2083 | if (!privileged) break; // only allow in privileged code |
2084 | return _method_LambdaForm_Compiled; |
2085 | } |
2086 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_Hidden_signature): { |
2087 | if (_location != _in_method) break; // only allow for methods |
2088 | if (!privileged) break; // only allow in privileged code |
2089 | return _method_Hidden; |
2090 | } |
2091 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_HotSpotIntrinsicCandidate_signature): { |
2092 | if (_location != _in_method) break; // only allow for methods |
2093 | if (!privileged) break; // only allow in privileged code |
2094 | return _method_HotSpotIntrinsicCandidate; |
2095 | } |
2096 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_Stable_signature): { |
2097 | if (_location != _in_field) break; // only allow for fields |
2098 | if (!privileged) break; // only allow in privileged code |
2099 | return _field_Stable; |
2100 | } |
2101 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_Contended_signature): { |
2102 | if (_location != _in_field && _location != _in_class) { |
2103 | break; // only allow for fields and classes |
2104 | } |
2105 | if (!EnableContended || (RestrictContended && !privileged)) { |
2106 | break; // honor privileges |
2107 | } |
2108 | return _jdk_internal_vm_annotation_Contended; |
2109 | } |
2110 | case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_ReservedStackAccess_signature): { |
2111 | if (_location != _in_method) break; // only allow for methods |
2112 | if (RestrictReservedStack && !privileged) break; // honor privileges |
2113 | return _jdk_internal_vm_annotation_ReservedStackAccess; |
2114 | } |
2115 | default: { |
2116 | break; |
2117 | } |
2118 | } |
2119 | return AnnotationCollector::_unknown; |
2120 | } |
2121 | |
2122 | void ClassFileParser::FieldAnnotationCollector::apply_to(FieldInfo* f) { |
2123 | if (is_contended()) |
2124 | f->set_contended_group(contended_group()); |
2125 | if (is_stable()) |
2126 | f->set_stable(true); |
2127 | } |
2128 | |
2129 | ClassFileParser::FieldAnnotationCollector::~FieldAnnotationCollector() { |
2130 | // If there's an error deallocate metadata for field annotations |
2131 | MetadataFactory::free_array<u1>(_loader_data, _field_annotations); |
2132 | MetadataFactory::free_array<u1>(_loader_data, _field_type_annotations); |
2133 | } |
2134 | |
2135 | void MethodAnnotationCollector::apply_to(const methodHandle& m) { |
2136 | if (has_annotation(_method_CallerSensitive)) |
2137 | m->set_caller_sensitive(true); |
2138 | if (has_annotation(_method_ForceInline)) |
2139 | m->set_force_inline(true); |
2140 | if (has_annotation(_method_DontInline)) |
2141 | m->set_dont_inline(true); |
2142 | if (has_annotation(_method_InjectedProfile)) |
2143 | m->set_has_injected_profile(true); |
2144 | if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none) |
2145 | m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm); |
2146 | if (has_annotation(_method_Hidden)) |
2147 | m->set_hidden(true); |
2148 | if (has_annotation(_method_HotSpotIntrinsicCandidate) && !m->is_synthetic()) |
2149 | m->set_intrinsic_candidate(true); |
2150 | if (has_annotation(_jdk_internal_vm_annotation_ReservedStackAccess)) |
2151 | m->set_has_reserved_stack_access(true); |
2152 | } |
2153 | |
2154 | void ClassFileParser::ClassAnnotationCollector::apply_to(InstanceKlass* ik) { |
2155 | assert(ik != NULL, "invariant" ); |
2156 | ik->set_is_contended(is_contended()); |
2157 | } |
2158 | |
2159 | #define MAX_ARGS_SIZE 255 |
2160 | #define MAX_CODE_SIZE 65535 |
2161 | #define INITIAL_MAX_LVT_NUMBER 256 |
2162 | |
2163 | /* Copy class file LVT's/LVTT's into the HotSpot internal LVT. |
2164 | * |
2165 | * Rules for LVT's and LVTT's are: |
2166 | * - There can be any number of LVT's and LVTT's. |
2167 | * - If there are n LVT's, it is the same as if there was just |
2168 | * one LVT containing all the entries from the n LVT's. |
2169 | * - There may be no more than one LVT entry per local variable. |
2170 | * Two LVT entries are 'equal' if these fields are the same: |
2171 | * start_pc, length, name, slot |
2172 | * - There may be no more than one LVTT entry per each LVT entry. |
2173 | * Each LVTT entry has to match some LVT entry. |
2174 | * - HotSpot internal LVT keeps natural ordering of class file LVT entries. |
2175 | */ |
2176 | void ClassFileParser::copy_localvariable_table(const ConstMethod* cm, |
2177 | int lvt_cnt, |
2178 | u2* const localvariable_table_length, |
2179 | const unsafe_u2** const localvariable_table_start, |
2180 | int lvtt_cnt, |
2181 | u2* const localvariable_type_table_length, |
2182 | const unsafe_u2** const localvariable_type_table_start, |
2183 | TRAPS) { |
2184 | |
2185 | ResourceMark rm(THREAD); |
2186 | |
2187 | typedef ResourceHashtable<LocalVariableTableElement, LocalVariableTableElement*, |
2188 | &LVT_Hash::hash, &LVT_Hash::equals> LVT_HashTable; |
2189 | |
2190 | LVT_HashTable* const table = new LVT_HashTable(); |
2191 | |
2192 | // To fill LocalVariableTable in |
2193 | const Classfile_LVT_Element* cf_lvt; |
2194 | LocalVariableTableElement* lvt = cm->localvariable_table_start(); |
2195 | |
2196 | for (int tbl_no = 0; tbl_no < lvt_cnt; tbl_no++) { |
2197 | cf_lvt = (Classfile_LVT_Element *) localvariable_table_start[tbl_no]; |
2198 | for (int idx = 0; idx < localvariable_table_length[tbl_no]; idx++, lvt++) { |
2199 | copy_lvt_element(&cf_lvt[idx], lvt); |
2200 | // If no duplicates, add LVT elem in hashtable. |
2201 | if (table->put(*lvt, lvt) == false |
2202 | && _need_verify |
2203 | && _major_version >= JAVA_1_5_VERSION) { |
2204 | classfile_parse_error("Duplicated LocalVariableTable attribute " |
2205 | "entry for '%s' in class file %s" , |
2206 | _cp->symbol_at(lvt->name_cp_index)->as_utf8(), |
2207 | CHECK); |
2208 | } |
2209 | } |
2210 | } |
2211 | |
2212 | // To merge LocalVariableTable and LocalVariableTypeTable |
2213 | const Classfile_LVT_Element* cf_lvtt; |
2214 | LocalVariableTableElement lvtt_elem; |
2215 | |
2216 | for (int tbl_no = 0; tbl_no < lvtt_cnt; tbl_no++) { |
2217 | cf_lvtt = (Classfile_LVT_Element *) localvariable_type_table_start[tbl_no]; |
2218 | for (int idx = 0; idx < localvariable_type_table_length[tbl_no]; idx++) { |
2219 | copy_lvt_element(&cf_lvtt[idx], &lvtt_elem); |
2220 | LocalVariableTableElement** entry = table->get(lvtt_elem); |
2221 | if (entry == NULL) { |
2222 | if (_need_verify) { |
2223 | classfile_parse_error("LVTT entry for '%s' in class file %s " |
2224 | "does not match any LVT entry" , |
2225 | _cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
2226 | CHECK); |
2227 | } |
2228 | } else if ((*entry)->signature_cp_index != 0 && _need_verify) { |
2229 | classfile_parse_error("Duplicated LocalVariableTypeTable attribute " |
2230 | "entry for '%s' in class file %s" , |
2231 | _cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(), |
2232 | CHECK); |
2233 | } else { |
2234 | // to add generic signatures into LocalVariableTable |
2235 | (*entry)->signature_cp_index = lvtt_elem.descriptor_cp_index; |
2236 | } |
2237 | } |
2238 | } |
2239 | } |
2240 | |
2241 | |
2242 | void ClassFileParser::copy_method_annotations(ConstMethod* cm, |
2243 | const u1* runtime_visible_annotations, |
2244 | int runtime_visible_annotations_length, |
2245 | const u1* runtime_invisible_annotations, |
2246 | int runtime_invisible_annotations_length, |
2247 | const u1* runtime_visible_parameter_annotations, |
2248 | int runtime_visible_parameter_annotations_length, |
2249 | const u1* runtime_invisible_parameter_annotations, |
2250 | int runtime_invisible_parameter_annotations_length, |
2251 | const u1* runtime_visible_type_annotations, |
2252 | int runtime_visible_type_annotations_length, |
2253 | const u1* runtime_invisible_type_annotations, |
2254 | int runtime_invisible_type_annotations_length, |
2255 | const u1* annotation_default, |
2256 | int annotation_default_length, |
2257 | TRAPS) { |
2258 | |
2259 | AnnotationArray* a; |
2260 | |
2261 | if (runtime_visible_annotations_length + |
2262 | runtime_invisible_annotations_length > 0) { |
2263 | a = assemble_annotations(runtime_visible_annotations, |
2264 | runtime_visible_annotations_length, |
2265 | runtime_invisible_annotations, |
2266 | runtime_invisible_annotations_length, |
2267 | CHECK); |
2268 | cm->set_method_annotations(a); |
2269 | } |
2270 | |
2271 | if (runtime_visible_parameter_annotations_length + |
2272 | runtime_invisible_parameter_annotations_length > 0) { |
2273 | a = assemble_annotations(runtime_visible_parameter_annotations, |
2274 | runtime_visible_parameter_annotations_length, |
2275 | runtime_invisible_parameter_annotations, |
2276 | runtime_invisible_parameter_annotations_length, |
2277 | CHECK); |
2278 | cm->set_parameter_annotations(a); |
2279 | } |
2280 | |
2281 | if (annotation_default_length > 0) { |
2282 | a = assemble_annotations(annotation_default, |
2283 | annotation_default_length, |
2284 | NULL, |
2285 | 0, |
2286 | CHECK); |
2287 | cm->set_default_annotations(a); |
2288 | } |
2289 | |
2290 | if (runtime_visible_type_annotations_length + |
2291 | runtime_invisible_type_annotations_length > 0) { |
2292 | a = assemble_annotations(runtime_visible_type_annotations, |
2293 | runtime_visible_type_annotations_length, |
2294 | runtime_invisible_type_annotations, |
2295 | runtime_invisible_type_annotations_length, |
2296 | CHECK); |
2297 | cm->set_type_annotations(a); |
2298 | } |
2299 | } |
2300 | |
2301 | |
2302 | // Note: the parse_method below is big and clunky because all parsing of the code and exceptions |
2303 | // attribute is inlined. This is cumbersome to avoid since we inline most of the parts in the |
2304 | // Method* to save footprint, so we only know the size of the resulting Method* when the |
2305 | // entire method attribute is parsed. |
2306 | // |
2307 | // The promoted_flags parameter is used to pass relevant access_flags |
2308 | // from the method back up to the containing klass. These flag values |
2309 | // are added to klass's access_flags. |
2310 | |
2311 | Method* ClassFileParser::parse_method(const ClassFileStream* const cfs, |
2312 | bool is_interface, |
2313 | const ConstantPool* cp, |
2314 | AccessFlags* const promoted_flags, |
2315 | TRAPS) { |
2316 | assert(cfs != NULL, "invariant" ); |
2317 | assert(cp != NULL, "invariant" ); |
2318 | assert(promoted_flags != NULL, "invariant" ); |
2319 | |
2320 | ResourceMark rm(THREAD); |
2321 | // Parse fixed parts: |
2322 | // access_flags, name_index, descriptor_index, attributes_count |
2323 | cfs->guarantee_more(8, CHECK_NULL); |
2324 | |
2325 | int flags = cfs->get_u2_fast(); |
2326 | const u2 name_index = cfs->get_u2_fast(); |
2327 | const int cp_size = cp->length(); |
2328 | check_property( |
2329 | valid_symbol_at(name_index), |
2330 | "Illegal constant pool index %u for method name in class file %s" , |
2331 | name_index, CHECK_NULL); |
2332 | const Symbol* const name = cp->symbol_at(name_index); |
2333 | verify_legal_method_name(name, CHECK_NULL); |
2334 | |
2335 | const u2 signature_index = cfs->get_u2_fast(); |
2336 | guarantee_property( |
2337 | valid_symbol_at(signature_index), |
2338 | "Illegal constant pool index %u for method signature in class file %s" , |
2339 | signature_index, CHECK_NULL); |
2340 | const Symbol* const signature = cp->symbol_at(signature_index); |
2341 | |
2342 | if (name == vmSymbols::class_initializer_name()) { |
2343 | // We ignore the other access flags for a valid class initializer. |
2344 | // (JVM Spec 2nd ed., chapter 4.6) |
2345 | if (_major_version < 51) { // backward compatibility |
2346 | flags = JVM_ACC_STATIC; |
2347 | } else if ((flags & JVM_ACC_STATIC) == JVM_ACC_STATIC) { |
2348 | flags &= JVM_ACC_STATIC | JVM_ACC_STRICT; |
2349 | } else { |
2350 | classfile_parse_error("Method <clinit> is not static in class file %s" , CHECK_NULL); |
2351 | } |
2352 | } else { |
2353 | verify_legal_method_modifiers(flags, is_interface, name, CHECK_NULL); |
2354 | } |
2355 | |
2356 | if (name == vmSymbols::object_initializer_name() && is_interface) { |
2357 | classfile_parse_error("Interface cannot have a method named <init>, class file %s" , CHECK_NULL); |
2358 | } |
2359 | |
2360 | int args_size = -1; // only used when _need_verify is true |
2361 | if (_need_verify) { |
2362 | args_size = ((flags & JVM_ACC_STATIC) ? 0 : 1) + |
2363 | verify_legal_method_signature(name, signature, CHECK_NULL); |
2364 | if (args_size > MAX_ARGS_SIZE) { |
2365 | classfile_parse_error("Too many arguments in method signature in class file %s" , CHECK_NULL); |
2366 | } |
2367 | } |
2368 | |
2369 | AccessFlags access_flags(flags & JVM_RECOGNIZED_METHOD_MODIFIERS); |
2370 | |
2371 | // Default values for code and exceptions attribute elements |
2372 | u2 max_stack = 0; |
2373 | u2 max_locals = 0; |
2374 | u4 code_length = 0; |
2375 | const u1* code_start = 0; |
2376 | u2 exception_table_length = 0; |
2377 | const unsafe_u2* exception_table_start = NULL; // (potentially unaligned) pointer to array of u2 elements |
2378 | Array<int>* exception_handlers = Universe::the_empty_int_array(); |
2379 | u2 checked_exceptions_length = 0; |
2380 | const unsafe_u2* checked_exceptions_start = NULL; // (potentially unaligned) pointer to array of u2 elements |
2381 | CompressedLineNumberWriteStream* linenumber_table = NULL; |
2382 | int linenumber_table_length = 0; |
2383 | int total_lvt_length = 0; |
2384 | u2 lvt_cnt = 0; |
2385 | u2 lvtt_cnt = 0; |
2386 | bool lvt_allocated = false; |
2387 | u2 max_lvt_cnt = INITIAL_MAX_LVT_NUMBER; |
2388 | u2 max_lvtt_cnt = INITIAL_MAX_LVT_NUMBER; |
2389 | u2* localvariable_table_length = NULL; |
2390 | const unsafe_u2** localvariable_table_start = NULL; // (potentially unaligned) pointer to array of LVT attributes |
2391 | u2* localvariable_type_table_length = NULL; |
2392 | const unsafe_u2** localvariable_type_table_start = NULL; // (potentially unaligned) pointer to LVTT attributes |
2393 | int method_parameters_length = -1; |
2394 | const u1* method_parameters_data = NULL; |
2395 | bool method_parameters_seen = false; |
2396 | bool parsed_code_attribute = false; |
2397 | bool parsed_checked_exceptions_attribute = false; |
2398 | bool parsed_stackmap_attribute = false; |
2399 | // stackmap attribute - JDK1.5 |
2400 | const u1* stackmap_data = NULL; |
2401 | int stackmap_data_length = 0; |
2402 | u2 generic_signature_index = 0; |
2403 | MethodAnnotationCollector parsed_annotations; |
2404 | const u1* runtime_visible_annotations = NULL; |
2405 | int runtime_visible_annotations_length = 0; |
2406 | const u1* runtime_invisible_annotations = NULL; |
2407 | int runtime_invisible_annotations_length = 0; |
2408 | const u1* runtime_visible_parameter_annotations = NULL; |
2409 | int runtime_visible_parameter_annotations_length = 0; |
2410 | const u1* runtime_invisible_parameter_annotations = NULL; |
2411 | int runtime_invisible_parameter_annotations_length = 0; |
2412 | const u1* runtime_visible_type_annotations = NULL; |
2413 | int runtime_visible_type_annotations_length = 0; |
2414 | const u1* runtime_invisible_type_annotations = NULL; |
2415 | int runtime_invisible_type_annotations_length = 0; |
2416 | bool runtime_invisible_annotations_exists = false; |
2417 | bool runtime_invisible_type_annotations_exists = false; |
2418 | bool runtime_invisible_parameter_annotations_exists = false; |
2419 | const u1* annotation_default = NULL; |
2420 | int annotation_default_length = 0; |
2421 | |
2422 | // Parse code and exceptions attribute |
2423 | u2 method_attributes_count = cfs->get_u2_fast(); |
2424 | while (method_attributes_count--) { |
2425 | cfs->guarantee_more(6, CHECK_NULL); // method_attribute_name_index, method_attribute_length |
2426 | const u2 method_attribute_name_index = cfs->get_u2_fast(); |
2427 | const u4 method_attribute_length = cfs->get_u4_fast(); |
2428 | check_property( |
2429 | valid_symbol_at(method_attribute_name_index), |
2430 | "Invalid method attribute name index %u in class file %s" , |
2431 | method_attribute_name_index, CHECK_NULL); |
2432 | |
2433 | const Symbol* const method_attribute_name = cp->symbol_at(method_attribute_name_index); |
2434 | if (method_attribute_name == vmSymbols::tag_code()) { |
2435 | // Parse Code attribute |
2436 | if (_need_verify) { |
2437 | guarantee_property( |
2438 | !access_flags.is_native() && !access_flags.is_abstract(), |
2439 | "Code attribute in native or abstract methods in class file %s" , |
2440 | CHECK_NULL); |
2441 | } |
2442 | if (parsed_code_attribute) { |
2443 | classfile_parse_error("Multiple Code attributes in class file %s" , |
2444 | CHECK_NULL); |
2445 | } |
2446 | parsed_code_attribute = true; |
2447 | |
2448 | // Stack size, locals size, and code size |
2449 | if (_major_version == 45 && _minor_version <= 2) { |
2450 | cfs->guarantee_more(4, CHECK_NULL); |
2451 | max_stack = cfs->get_u1_fast(); |
2452 | max_locals = cfs->get_u1_fast(); |
2453 | code_length = cfs->get_u2_fast(); |
2454 | } else { |
2455 | cfs->guarantee_more(8, CHECK_NULL); |
2456 | max_stack = cfs->get_u2_fast(); |
2457 | max_locals = cfs->get_u2_fast(); |
2458 | code_length = cfs->get_u4_fast(); |
2459 | } |
2460 | if (_need_verify) { |
2461 | guarantee_property(args_size <= max_locals, |
2462 | "Arguments can't fit into locals in class file %s" , |
2463 | CHECK_NULL); |
2464 | guarantee_property(code_length > 0 && code_length <= MAX_CODE_SIZE, |
2465 | "Invalid method Code length %u in class file %s" , |
2466 | code_length, CHECK_NULL); |
2467 | } |
2468 | // Code pointer |
2469 | code_start = cfs->current(); |
2470 | assert(code_start != NULL, "null code start" ); |
2471 | cfs->guarantee_more(code_length, CHECK_NULL); |
2472 | cfs->skip_u1_fast(code_length); |
2473 | |
2474 | // Exception handler table |
2475 | cfs->guarantee_more(2, CHECK_NULL); // exception_table_length |
2476 | exception_table_length = cfs->get_u2_fast(); |
2477 | if (exception_table_length > 0) { |
2478 | exception_table_start = parse_exception_table(cfs, |
2479 | code_length, |
2480 | exception_table_length, |
2481 | CHECK_NULL); |
2482 | } |
2483 | |
2484 | // Parse additional attributes in code attribute |
2485 | cfs->guarantee_more(2, CHECK_NULL); // code_attributes_count |
2486 | u2 code_attributes_count = cfs->get_u2_fast(); |
2487 | |
2488 | unsigned int calculated_attribute_length = 0; |
2489 | |
2490 | if (_major_version > 45 || (_major_version == 45 && _minor_version > 2)) { |
2491 | calculated_attribute_length = |
2492 | sizeof(max_stack) + sizeof(max_locals) + sizeof(code_length); |
2493 | } else { |
2494 | // max_stack, locals and length are smaller in pre-version 45.2 classes |
2495 | calculated_attribute_length = sizeof(u1) + sizeof(u1) + sizeof(u2); |
2496 | } |
2497 | calculated_attribute_length += |
2498 | code_length + |
2499 | sizeof(exception_table_length) + |
2500 | sizeof(code_attributes_count) + |
2501 | exception_table_length * |
2502 | ( sizeof(u2) + // start_pc |
2503 | sizeof(u2) + // end_pc |
2504 | sizeof(u2) + // handler_pc |
2505 | sizeof(u2) ); // catch_type_index |
2506 | |
2507 | while (code_attributes_count--) { |
2508 | cfs->guarantee_more(6, CHECK_NULL); // code_attribute_name_index, code_attribute_length |
2509 | const u2 code_attribute_name_index = cfs->get_u2_fast(); |
2510 | const u4 code_attribute_length = cfs->get_u4_fast(); |
2511 | calculated_attribute_length += code_attribute_length + |
2512 | sizeof(code_attribute_name_index) + |
2513 | sizeof(code_attribute_length); |
2514 | check_property(valid_symbol_at(code_attribute_name_index), |
2515 | "Invalid code attribute name index %u in class file %s" , |
2516 | code_attribute_name_index, |
2517 | CHECK_NULL); |
2518 | if (LoadLineNumberTables && |
2519 | cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_line_number_table()) { |
2520 | // Parse and compress line number table |
2521 | parse_linenumber_table(code_attribute_length, |
2522 | code_length, |
2523 | &linenumber_table, |
2524 | CHECK_NULL); |
2525 | |
2526 | } else if (LoadLocalVariableTables && |
2527 | cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_table()) { |
2528 | // Parse local variable table |
2529 | if (!lvt_allocated) { |
2530 | localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2531 | THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2532 | localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2533 | THREAD, const unsafe_u2*, INITIAL_MAX_LVT_NUMBER); |
2534 | localvariable_type_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2535 | THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2536 | localvariable_type_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2537 | THREAD, const unsafe_u2*, INITIAL_MAX_LVT_NUMBER); |
2538 | lvt_allocated = true; |
2539 | } |
2540 | if (lvt_cnt == max_lvt_cnt) { |
2541 | max_lvt_cnt <<= 1; |
2542 | localvariable_table_length = REALLOC_RESOURCE_ARRAY(u2, localvariable_table_length, lvt_cnt, max_lvt_cnt); |
2543 | localvariable_table_start = REALLOC_RESOURCE_ARRAY(const unsafe_u2*, localvariable_table_start, lvt_cnt, max_lvt_cnt); |
2544 | } |
2545 | localvariable_table_start[lvt_cnt] = |
2546 | parse_localvariable_table(cfs, |
2547 | code_length, |
2548 | max_locals, |
2549 | code_attribute_length, |
2550 | &localvariable_table_length[lvt_cnt], |
2551 | false, // is not LVTT |
2552 | CHECK_NULL); |
2553 | total_lvt_length += localvariable_table_length[lvt_cnt]; |
2554 | lvt_cnt++; |
2555 | } else if (LoadLocalVariableTypeTables && |
2556 | _major_version >= JAVA_1_5_VERSION && |
2557 | cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_type_table()) { |
2558 | if (!lvt_allocated) { |
2559 | localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2560 | THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2561 | localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2562 | THREAD, const unsafe_u2*, INITIAL_MAX_LVT_NUMBER); |
2563 | localvariable_type_table_length = NEW_RESOURCE_ARRAY_IN_THREAD( |
2564 | THREAD, u2, INITIAL_MAX_LVT_NUMBER); |
2565 | localvariable_type_table_start = NEW_RESOURCE_ARRAY_IN_THREAD( |
2566 | THREAD, const unsafe_u2*, INITIAL_MAX_LVT_NUMBER); |
2567 | lvt_allocated = true; |
2568 | } |
2569 | // Parse local variable type table |
2570 | if (lvtt_cnt == max_lvtt_cnt) { |
2571 | max_lvtt_cnt <<= 1; |
2572 | localvariable_type_table_length = REALLOC_RESOURCE_ARRAY(u2, localvariable_type_table_length, lvtt_cnt, max_lvtt_cnt); |
2573 | localvariable_type_table_start = REALLOC_RESOURCE_ARRAY(const unsafe_u2*, localvariable_type_table_start, lvtt_cnt, max_lvtt_cnt); |
2574 | } |
2575 | localvariable_type_table_start[lvtt_cnt] = |
2576 | parse_localvariable_table(cfs, |
2577 | code_length, |
2578 | max_locals, |
2579 | code_attribute_length, |
2580 | &localvariable_type_table_length[lvtt_cnt], |
2581 | true, // is LVTT |
2582 | CHECK_NULL); |
2583 | lvtt_cnt++; |
2584 | } else if (_major_version >= Verifier::STACKMAP_ATTRIBUTE_MAJOR_VERSION && |
2585 | cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_stack_map_table()) { |
2586 | // Stack map is only needed by the new verifier in JDK1.5. |
2587 | if (parsed_stackmap_attribute) { |
2588 | classfile_parse_error("Multiple StackMapTable attributes in class file %s" , CHECK_NULL); |
2589 | } |
2590 | stackmap_data = parse_stackmap_table(cfs, code_attribute_length, _need_verify, CHECK_NULL); |
2591 | stackmap_data_length = code_attribute_length; |
2592 | parsed_stackmap_attribute = true; |
2593 | } else { |
2594 | // Skip unknown attributes |
2595 | cfs->skip_u1(code_attribute_length, CHECK_NULL); |
2596 | } |
2597 | } |
2598 | // check method attribute length |
2599 | if (_need_verify) { |
2600 | guarantee_property(method_attribute_length == calculated_attribute_length, |
2601 | "Code segment has wrong length in class file %s" , |
2602 | CHECK_NULL); |
2603 | } |
2604 | } else if (method_attribute_name == vmSymbols::tag_exceptions()) { |
2605 | // Parse Exceptions attribute |
2606 | if (parsed_checked_exceptions_attribute) { |
2607 | classfile_parse_error("Multiple Exceptions attributes in class file %s" , |
2608 | CHECK_NULL); |
2609 | } |
2610 | parsed_checked_exceptions_attribute = true; |
2611 | checked_exceptions_start = |
2612 | parse_checked_exceptions(cfs, |
2613 | &checked_exceptions_length, |
2614 | method_attribute_length, |
2615 | CHECK_NULL); |
2616 | } else if (method_attribute_name == vmSymbols::tag_method_parameters()) { |
2617 | // reject multiple method parameters |
2618 | if (method_parameters_seen) { |
2619 | classfile_parse_error("Multiple MethodParameters attributes in class file %s" , |
2620 | CHECK_NULL); |
2621 | } |
2622 | method_parameters_seen = true; |
2623 | method_parameters_length = cfs->get_u1_fast(); |
2624 | const u2 real_length = (method_parameters_length * 4u) + 1u; |
2625 | if (method_attribute_length != real_length) { |
2626 | classfile_parse_error( |
2627 | "Invalid MethodParameters method attribute length %u in class file" , |
2628 | method_attribute_length, CHECK_NULL); |
2629 | } |
2630 | method_parameters_data = cfs->current(); |
2631 | cfs->skip_u2_fast(method_parameters_length); |
2632 | cfs->skip_u2_fast(method_parameters_length); |
2633 | // ignore this attribute if it cannot be reflected |
2634 | if (!SystemDictionary::Parameter_klass_loaded()) |
2635 | method_parameters_length = -1; |
2636 | } else if (method_attribute_name == vmSymbols::tag_synthetic()) { |
2637 | if (method_attribute_length != 0) { |
2638 | classfile_parse_error( |
2639 | "Invalid Synthetic method attribute length %u in class file %s" , |
2640 | method_attribute_length, CHECK_NULL); |
2641 | } |
2642 | // Should we check that there hasn't already been a synthetic attribute? |
2643 | access_flags.set_is_synthetic(); |
2644 | } else if (method_attribute_name == vmSymbols::tag_deprecated()) { // 4276120 |
2645 | if (method_attribute_length != 0) { |
2646 | classfile_parse_error( |
2647 | "Invalid Deprecated method attribute length %u in class file %s" , |
2648 | method_attribute_length, CHECK_NULL); |
2649 | } |
2650 | } else if (_major_version >= JAVA_1_5_VERSION) { |
2651 | if (method_attribute_name == vmSymbols::tag_signature()) { |
2652 | if (generic_signature_index != 0) { |
2653 | classfile_parse_error( |
2654 | "Multiple Signature attributes for method in class file %s" , |
2655 | CHECK_NULL); |
2656 | } |
2657 | if (method_attribute_length != 2) { |
2658 | classfile_parse_error( |
2659 | "Invalid Signature attribute length %u in class file %s" , |
2660 | method_attribute_length, CHECK_NULL); |
2661 | } |
2662 | generic_signature_index = parse_generic_signature_attribute(cfs, CHECK_NULL); |
2663 | } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) { |
2664 | if (runtime_visible_annotations != NULL) { |
2665 | classfile_parse_error( |
2666 | "Multiple RuntimeVisibleAnnotations attributes for method in class file %s" , |
2667 | CHECK_NULL); |
2668 | } |
2669 | runtime_visible_annotations_length = method_attribute_length; |
2670 | runtime_visible_annotations = cfs->current(); |
2671 | assert(runtime_visible_annotations != NULL, "null visible annotations" ); |
2672 | cfs->guarantee_more(runtime_visible_annotations_length, CHECK_NULL); |
2673 | parse_annotations(cp, |
2674 | runtime_visible_annotations, |
2675 | runtime_visible_annotations_length, |
2676 | &parsed_annotations, |
2677 | _loader_data, |
2678 | CHECK_NULL); |
2679 | cfs->skip_u1_fast(runtime_visible_annotations_length); |
2680 | } else if (method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { |
2681 | if (runtime_invisible_annotations_exists) { |
2682 | classfile_parse_error( |
2683 | "Multiple RuntimeInvisibleAnnotations attributes for method in class file %s" , |
2684 | CHECK_NULL); |
2685 | } |
2686 | runtime_invisible_annotations_exists = true; |
2687 | if (PreserveAllAnnotations) { |
2688 | runtime_invisible_annotations_length = method_attribute_length; |
2689 | runtime_invisible_annotations = cfs->current(); |
2690 | assert(runtime_invisible_annotations != NULL, "null invisible annotations" ); |
2691 | } |
2692 | cfs->skip_u1(method_attribute_length, CHECK_NULL); |
2693 | } else if (method_attribute_name == vmSymbols::tag_runtime_visible_parameter_annotations()) { |
2694 | if (runtime_visible_parameter_annotations != NULL) { |
2695 | classfile_parse_error( |
2696 | "Multiple RuntimeVisibleParameterAnnotations attributes for method in class file %s" , |
2697 | CHECK_NULL); |
2698 | } |
2699 | runtime_visible_parameter_annotations_length = method_attribute_length; |
2700 | runtime_visible_parameter_annotations = cfs->current(); |
2701 | assert(runtime_visible_parameter_annotations != NULL, "null visible parameter annotations" ); |
2702 | cfs->skip_u1(runtime_visible_parameter_annotations_length, CHECK_NULL); |
2703 | } else if (method_attribute_name == vmSymbols::tag_runtime_invisible_parameter_annotations()) { |
2704 | if (runtime_invisible_parameter_annotations_exists) { |
2705 | classfile_parse_error( |
2706 | "Multiple RuntimeInvisibleParameterAnnotations attributes for method in class file %s" , |
2707 | CHECK_NULL); |
2708 | } |
2709 | runtime_invisible_parameter_annotations_exists = true; |
2710 | if (PreserveAllAnnotations) { |
2711 | runtime_invisible_parameter_annotations_length = method_attribute_length; |
2712 | runtime_invisible_parameter_annotations = cfs->current(); |
2713 | assert(runtime_invisible_parameter_annotations != NULL, |
2714 | "null invisible parameter annotations" ); |
2715 | } |
2716 | cfs->skip_u1(method_attribute_length, CHECK_NULL); |
2717 | } else if (method_attribute_name == vmSymbols::tag_annotation_default()) { |
2718 | if (annotation_default != NULL) { |
2719 | classfile_parse_error( |
2720 | "Multiple AnnotationDefault attributes for method in class file %s" , |
2721 | CHECK_NULL); |
2722 | } |
2723 | annotation_default_length = method_attribute_length; |
2724 | annotation_default = cfs->current(); |
2725 | assert(annotation_default != NULL, "null annotation default" ); |
2726 | cfs->skip_u1(annotation_default_length, CHECK_NULL); |
2727 | } else if (method_attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) { |
2728 | if (runtime_visible_type_annotations != NULL) { |
2729 | classfile_parse_error( |
2730 | "Multiple RuntimeVisibleTypeAnnotations attributes for method in class file %s" , |
2731 | CHECK_NULL); |
2732 | } |
2733 | runtime_visible_type_annotations_length = method_attribute_length; |
2734 | runtime_visible_type_annotations = cfs->current(); |
2735 | assert(runtime_visible_type_annotations != NULL, "null visible type annotations" ); |
2736 | // No need for the VM to parse Type annotations |
2737 | cfs->skip_u1(runtime_visible_type_annotations_length, CHECK_NULL); |
2738 | } else if (method_attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) { |
2739 | if (runtime_invisible_type_annotations_exists) { |
2740 | classfile_parse_error( |
2741 | "Multiple RuntimeInvisibleTypeAnnotations attributes for method in class file %s" , |
2742 | CHECK_NULL); |
2743 | } else { |
2744 | runtime_invisible_type_annotations_exists = true; |
2745 | } |
2746 | if (PreserveAllAnnotations) { |
2747 | runtime_invisible_type_annotations_length = method_attribute_length; |
2748 | runtime_invisible_type_annotations = cfs->current(); |
2749 | assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations" ); |
2750 | } |
2751 | cfs->skip_u1(method_attribute_length, CHECK_NULL); |
2752 | } else { |
2753 | // Skip unknown attributes |
2754 | cfs->skip_u1(method_attribute_length, CHECK_NULL); |
2755 | } |
2756 | } else { |
2757 | // Skip unknown attributes |
2758 | cfs->skip_u1(method_attribute_length, CHECK_NULL); |
2759 | } |
2760 | } |
2761 | |
2762 | if (linenumber_table != NULL) { |
2763 | linenumber_table->write_terminator(); |
2764 | linenumber_table_length = linenumber_table->position(); |
2765 | } |
2766 | |
2767 | // Make sure there's at least one Code attribute in non-native/non-abstract method |
2768 | if (_need_verify) { |
2769 | guarantee_property(access_flags.is_native() || |
2770 | access_flags.is_abstract() || |
2771 | parsed_code_attribute, |
2772 | "Absent Code attribute in method that is not native or abstract in class file %s" , |
2773 | CHECK_NULL); |
2774 | } |
2775 | |
2776 | // All sizing information for a Method* is finally available, now create it |
2777 | InlineTableSizes sizes( |
2778 | total_lvt_length, |
2779 | linenumber_table_length, |
2780 | exception_table_length, |
2781 | checked_exceptions_length, |
2782 | method_parameters_length, |
2783 | generic_signature_index, |
2784 | runtime_visible_annotations_length + |
2785 | runtime_invisible_annotations_length, |
2786 | runtime_visible_parameter_annotations_length + |
2787 | runtime_invisible_parameter_annotations_length, |
2788 | runtime_visible_type_annotations_length + |
2789 | runtime_invisible_type_annotations_length, |
2790 | annotation_default_length, |
2791 | 0); |
2792 | |
2793 | Method* const m = Method::allocate(_loader_data, |
2794 | code_length, |
2795 | access_flags, |
2796 | &sizes, |
2797 | ConstMethod::NORMAL, |
2798 | CHECK_NULL); |
2799 | |
2800 | ClassLoadingService::add_class_method_size(m->size()*wordSize); |
2801 | |
2802 | // Fill in information from fixed part (access_flags already set) |
2803 | m->set_constants(_cp); |
2804 | m->set_name_index(name_index); |
2805 | m->set_signature_index(signature_index); |
2806 | |
2807 | ResultTypeFinder rtf(cp->symbol_at(signature_index)); |
2808 | m->constMethod()->set_result_type(rtf.type()); |
2809 | |
2810 | if (args_size >= 0) { |
2811 | m->set_size_of_parameters(args_size); |
2812 | } else { |
2813 | m->compute_size_of_parameters(THREAD); |
2814 | } |
2815 | #ifdef ASSERT |
2816 | if (args_size >= 0) { |
2817 | m->compute_size_of_parameters(THREAD); |
2818 | assert(args_size == m->size_of_parameters(), "" ); |
2819 | } |
2820 | #endif |
2821 | |
2822 | // Fill in code attribute information |
2823 | m->set_max_stack(max_stack); |
2824 | m->set_max_locals(max_locals); |
2825 | if (stackmap_data != NULL) { |
2826 | m->constMethod()->copy_stackmap_data(_loader_data, |
2827 | (u1*)stackmap_data, |
2828 | stackmap_data_length, |
2829 | CHECK_NULL); |
2830 | } |
2831 | |
2832 | // Copy byte codes |
2833 | m->set_code((u1*)code_start); |
2834 | |
2835 | // Copy line number table |
2836 | if (linenumber_table != NULL) { |
2837 | memcpy(m->compressed_linenumber_table(), |
2838 | linenumber_table->buffer(), |
2839 | linenumber_table_length); |
2840 | } |
2841 | |
2842 | // Copy exception table |
2843 | if (exception_table_length > 0) { |
2844 | Copy::conjoint_swap_if_needed<Endian::JAVA>(exception_table_start, |
2845 | m->exception_table_start(), |
2846 | exception_table_length * sizeof(ExceptionTableElement), |
2847 | sizeof(u2)); |
2848 | } |
2849 | |
2850 | // Copy method parameters |
2851 | if (method_parameters_length > 0) { |
2852 | MethodParametersElement* elem = m->constMethod()->method_parameters_start(); |
2853 | for (int i = 0; i < method_parameters_length; i++) { |
2854 | elem[i].name_cp_index = Bytes::get_Java_u2((address)method_parameters_data); |
2855 | method_parameters_data += 2; |
2856 | elem[i].flags = Bytes::get_Java_u2((address)method_parameters_data); |
2857 | method_parameters_data += 2; |
2858 | } |
2859 | } |
2860 | |
2861 | // Copy checked exceptions |
2862 | if (checked_exceptions_length > 0) { |
2863 | Copy::conjoint_swap_if_needed<Endian::JAVA>(checked_exceptions_start, |
2864 | m->checked_exceptions_start(), |
2865 | checked_exceptions_length * sizeof(CheckedExceptionElement), |
2866 | sizeof(u2)); |
2867 | } |
2868 | |
2869 | // Copy class file LVT's/LVTT's into the HotSpot internal LVT. |
2870 | if (total_lvt_length > 0) { |
2871 | promoted_flags->set_has_localvariable_table(); |
2872 | copy_localvariable_table(m->constMethod(), |
2873 | lvt_cnt, |
2874 | localvariable_table_length, |
2875 | localvariable_table_start, |
2876 | lvtt_cnt, |
2877 | localvariable_type_table_length, |
2878 | localvariable_type_table_start, |
2879 | CHECK_NULL); |
2880 | } |
2881 | |
2882 | if (parsed_annotations.has_any_annotations()) |
2883 | parsed_annotations.apply_to(m); |
2884 | |
2885 | // Copy annotations |
2886 | copy_method_annotations(m->constMethod(), |
2887 | runtime_visible_annotations, |
2888 | runtime_visible_annotations_length, |
2889 | runtime_invisible_annotations, |
2890 | runtime_invisible_annotations_length, |
2891 | runtime_visible_parameter_annotations, |
2892 | runtime_visible_parameter_annotations_length, |
2893 | runtime_invisible_parameter_annotations, |
2894 | runtime_invisible_parameter_annotations_length, |
2895 | runtime_visible_type_annotations, |
2896 | runtime_visible_type_annotations_length, |
2897 | runtime_invisible_type_annotations, |
2898 | runtime_invisible_type_annotations_length, |
2899 | annotation_default, |
2900 | annotation_default_length, |
2901 | CHECK_NULL); |
2902 | |
2903 | if (name == vmSymbols::finalize_method_name() && |
2904 | signature == vmSymbols::void_method_signature()) { |
2905 | if (m->is_empty_method()) { |
2906 | _has_empty_finalizer = true; |
2907 | } else { |
2908 | _has_finalizer = true; |
2909 | } |
2910 | } |
2911 | if (name == vmSymbols::object_initializer_name() && |
2912 | signature == vmSymbols::void_method_signature() && |
2913 | m->is_vanilla_constructor()) { |
2914 | _has_vanilla_constructor = true; |
2915 | } |
2916 | |
2917 | NOT_PRODUCT(m->verify()); |
2918 | return m; |
2919 | } |
2920 | |
2921 | |
2922 | // The promoted_flags parameter is used to pass relevant access_flags |
2923 | // from the methods back up to the containing klass. These flag values |
2924 | // are added to klass's access_flags. |
2925 | // Side-effects: populates the _methods field in the parser |
2926 | void ClassFileParser::parse_methods(const ClassFileStream* const cfs, |
2927 | bool is_interface, |
2928 | AccessFlags* promoted_flags, |
2929 | bool* has_final_method, |
2930 | bool* declares_nonstatic_concrete_methods, |
2931 | TRAPS) { |
2932 | assert(cfs != NULL, "invariant" ); |
2933 | assert(promoted_flags != NULL, "invariant" ); |
2934 | assert(has_final_method != NULL, "invariant" ); |
2935 | assert(declares_nonstatic_concrete_methods != NULL, "invariant" ); |
2936 | |
2937 | assert(NULL == _methods, "invariant" ); |
2938 | |
2939 | cfs->guarantee_more(2, CHECK); // length |
2940 | const u2 length = cfs->get_u2_fast(); |
2941 | if (length == 0) { |
2942 | _methods = Universe::the_empty_method_array(); |
2943 | } else { |
2944 | _methods = MetadataFactory::new_array<Method*>(_loader_data, |
2945 | length, |
2946 | NULL, |
2947 | CHECK); |
2948 | |
2949 | for (int index = 0; index < length; index++) { |
2950 | Method* method = parse_method(cfs, |
2951 | is_interface, |
2952 | _cp, |
2953 | promoted_flags, |
2954 | CHECK); |
2955 | |
2956 | if (method->is_final()) { |
2957 | *has_final_method = true; |
2958 | } |
2959 | // declares_nonstatic_concrete_methods: declares concrete instance methods, any access flags |
2960 | // used for interface initialization, and default method inheritance analysis |
2961 | if (is_interface && !(*declares_nonstatic_concrete_methods) |
2962 | && !method->is_abstract() && !method->is_static()) { |
2963 | *declares_nonstatic_concrete_methods = true; |
2964 | } |
2965 | _methods->at_put(index, method); |
2966 | } |
2967 | |
2968 | if (_need_verify && length > 1) { |
2969 | // Check duplicated methods |
2970 | ResourceMark rm(THREAD); |
2971 | NameSigHash** names_and_sigs = NEW_RESOURCE_ARRAY_IN_THREAD( |
2972 | THREAD, NameSigHash*, HASH_ROW_SIZE); |
2973 | initialize_hashtable(names_and_sigs); |
2974 | bool dup = false; |
2975 | const Symbol* name = NULL; |
2976 | const Symbol* sig = NULL; |
2977 | { |
2978 | debug_only(NoSafepointVerifier nsv;) |
2979 | for (int i = 0; i < length; i++) { |
2980 | const Method* const m = _methods->at(i); |
2981 | name = m->name(); |
2982 | sig = m->signature(); |
2983 | // If no duplicates, add name/signature in hashtable names_and_sigs. |
2984 | if (!put_after_lookup(name, sig, names_and_sigs)) { |
2985 | dup = true; |
2986 | break; |
2987 | } |
2988 | } |
2989 | } |
2990 | if (dup) { |
2991 | classfile_parse_error("Duplicate method name \"%s\" with signature \"%s\" in class file %s" , |
2992 | name->as_C_string(), sig->as_klass_external_name(), CHECK); |
2993 | } |
2994 | } |
2995 | } |
2996 | } |
2997 | |
2998 | static const intArray* sort_methods(Array<Method*>* methods) { |
2999 | const int length = methods->length(); |
3000 | // If JVMTI original method ordering or sharing is enabled we have to |
3001 | // remember the original class file ordering. |
3002 | // We temporarily use the vtable_index field in the Method* to store the |
3003 | // class file index, so we can read in after calling qsort. |
3004 | // Put the method ordering in the shared archive. |
3005 | if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) { |
3006 | for (int index = 0; index < length; index++) { |
3007 | Method* const m = methods->at(index); |
3008 | assert(!m->valid_vtable_index(), "vtable index should not be set" ); |
3009 | m->set_vtable_index(index); |
3010 | } |
3011 | } |
3012 | // Sort method array by ascending method name (for faster lookups & vtable construction) |
3013 | // Note that the ordering is not alphabetical, see Symbol::fast_compare |
3014 | Method::sort_methods(methods); |
3015 | |
3016 | intArray* method_ordering = NULL; |
3017 | // If JVMTI original method ordering or sharing is enabled construct int |
3018 | // array remembering the original ordering |
3019 | if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) { |
3020 | method_ordering = new intArray(length, length, -1); |
3021 | for (int index = 0; index < length; index++) { |
3022 | Method* const m = methods->at(index); |
3023 | const int old_index = m->vtable_index(); |
3024 | assert(old_index >= 0 && old_index < length, "invalid method index" ); |
3025 | method_ordering->at_put(index, old_index); |
3026 | m->set_vtable_index(Method::invalid_vtable_index); |
3027 | } |
3028 | } |
3029 | return method_ordering; |
3030 | } |
3031 | |
3032 | // Parse generic_signature attribute for methods and fields |
3033 | u2 ClassFileParser::parse_generic_signature_attribute(const ClassFileStream* const cfs, |
3034 | TRAPS) { |
3035 | assert(cfs != NULL, "invariant" ); |
3036 | |
3037 | cfs->guarantee_more(2, CHECK_0); // generic_signature_index |
3038 | const u2 generic_signature_index = cfs->get_u2_fast(); |
3039 | check_property( |
3040 | valid_symbol_at(generic_signature_index), |
3041 | "Invalid Signature attribute at constant pool index %u in class file %s" , |
3042 | generic_signature_index, CHECK_0); |
3043 | return generic_signature_index; |
3044 | } |
3045 | |
3046 | void ClassFileParser::parse_classfile_sourcefile_attribute(const ClassFileStream* const cfs, |
3047 | TRAPS) { |
3048 | |
3049 | assert(cfs != NULL, "invariant" ); |
3050 | |
3051 | cfs->guarantee_more(2, CHECK); // sourcefile_index |
3052 | const u2 sourcefile_index = cfs->get_u2_fast(); |
3053 | check_property( |
3054 | valid_symbol_at(sourcefile_index), |
3055 | "Invalid SourceFile attribute at constant pool index %u in class file %s" , |
3056 | sourcefile_index, CHECK); |
3057 | set_class_sourcefile_index(sourcefile_index); |
3058 | } |
3059 | |
3060 | void ClassFileParser::parse_classfile_source_debug_extension_attribute(const ClassFileStream* const cfs, |
3061 | int length, |
3062 | TRAPS) { |
3063 | assert(cfs != NULL, "invariant" ); |
3064 | |
3065 | const u1* const sde_buffer = cfs->current(); |
3066 | assert(sde_buffer != NULL, "null sde buffer" ); |
3067 | |
3068 | // Don't bother storing it if there is no way to retrieve it |
3069 | if (JvmtiExport::can_get_source_debug_extension()) { |
3070 | assert((length+1) > length, "Overflow checking" ); |
3071 | u1* const sde = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, u1, length+1); |
3072 | for (int i = 0; i < length; i++) { |
3073 | sde[i] = sde_buffer[i]; |
3074 | } |
3075 | sde[length] = '\0'; |
3076 | set_class_sde_buffer((const char*)sde, length); |
3077 | } |
3078 | // Got utf8 string, set stream position forward |
3079 | cfs->skip_u1(length, CHECK); |
3080 | } |
3081 | |
3082 | |
3083 | // Inner classes can be static, private or protected (classic VM does this) |
3084 | #define RECOGNIZED_INNER_CLASS_MODIFIERS ( JVM_RECOGNIZED_CLASS_MODIFIERS | \ |
3085 | JVM_ACC_PRIVATE | \ |
3086 | JVM_ACC_PROTECTED | \ |
3087 | JVM_ACC_STATIC \ |
3088 | ) |
3089 | |
3090 | // Return number of classes in the inner classes attribute table |
3091 | u2 ClassFileParser::parse_classfile_inner_classes_attribute(const ClassFileStream* const cfs, |
3092 | const u1* const inner_classes_attribute_start, |
3093 | bool parsed_enclosingmethod_attribute, |
3094 | u2 enclosing_method_class_index, |
3095 | u2 enclosing_method_method_index, |
3096 | TRAPS) { |
3097 | const u1* const current_mark = cfs->current(); |
3098 | u2 length = 0; |
3099 | if (inner_classes_attribute_start != NULL) { |
3100 | cfs->set_current(inner_classes_attribute_start); |
3101 | cfs->guarantee_more(2, CHECK_0); // length |
3102 | length = cfs->get_u2_fast(); |
3103 | } |
3104 | |
3105 | // 4-tuples of shorts of inner classes data and 2 shorts of enclosing |
3106 | // method data: |
3107 | // [inner_class_info_index, |
3108 | // outer_class_info_index, |
3109 | // inner_name_index, |
3110 | // inner_class_access_flags, |
3111 | // ... |
3112 | // enclosing_method_class_index, |
3113 | // enclosing_method_method_index] |
3114 | const int size = length * 4 + (parsed_enclosingmethod_attribute ? 2 : 0); |
3115 | Array<u2>* const inner_classes = MetadataFactory::new_array<u2>(_loader_data, size, CHECK_0); |
3116 | _inner_classes = inner_classes; |
3117 | |
3118 | int index = 0; |
3119 | cfs->guarantee_more(8 * length, CHECK_0); // 4-tuples of u2 |
3120 | for (int n = 0; n < length; n++) { |
3121 | // Inner class index |
3122 | const u2 inner_class_info_index = cfs->get_u2_fast(); |
3123 | check_property( |
3124 | valid_klass_reference_at(inner_class_info_index), |
3125 | "inner_class_info_index %u has bad constant type in class file %s" , |
3126 | inner_class_info_index, CHECK_0); |
3127 | // Outer class index |
3128 | const u2 outer_class_info_index = cfs->get_u2_fast(); |
3129 | check_property( |
3130 | outer_class_info_index == 0 || |
3131 | valid_klass_reference_at(outer_class_info_index), |
3132 | "outer_class_info_index %u has bad constant type in class file %s" , |
3133 | outer_class_info_index, CHECK_0); |
3134 | // Inner class name |
3135 | const u2 inner_name_index = cfs->get_u2_fast(); |
3136 | check_property( |
3137 | inner_name_index == 0 || valid_symbol_at(inner_name_index), |
3138 | "inner_name_index %u has bad constant type in class file %s" , |
3139 | inner_name_index, CHECK_0); |
3140 | if (_need_verify) { |
3141 | guarantee_property(inner_class_info_index != outer_class_info_index, |
3142 | "Class is both outer and inner class in class file %s" , CHECK_0); |
3143 | } |
3144 | // Access flags |
3145 | jint flags; |
3146 | // JVM_ACC_MODULE is defined in JDK-9 and later. |
3147 | if (_major_version >= JAVA_9_VERSION) { |
3148 | flags = cfs->get_u2_fast() & (RECOGNIZED_INNER_CLASS_MODIFIERS | JVM_ACC_MODULE); |
3149 | } else { |
3150 | flags = cfs->get_u2_fast() & RECOGNIZED_INNER_CLASS_MODIFIERS; |
3151 | } |
3152 | if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) { |
3153 | // Set abstract bit for old class files for backward compatibility |
3154 | flags |= JVM_ACC_ABSTRACT; |
3155 | } |
3156 | verify_legal_class_modifiers(flags, CHECK_0); |
3157 | AccessFlags inner_access_flags(flags); |
3158 | |
3159 | inner_classes->at_put(index++, inner_class_info_index); |
3160 | inner_classes->at_put(index++, outer_class_info_index); |
3161 | inner_classes->at_put(index++, inner_name_index); |
3162 | inner_classes->at_put(index++, inner_access_flags.as_short()); |
3163 | } |
3164 | |
3165 | // 4347400: make sure there's no duplicate entry in the classes array |
3166 | if (_need_verify && _major_version >= JAVA_1_5_VERSION) { |
3167 | for(int i = 0; i < length * 4; i += 4) { |
3168 | for(int j = i + 4; j < length * 4; j += 4) { |
3169 | guarantee_property((inner_classes->at(i) != inner_classes->at(j) || |
3170 | inner_classes->at(i+1) != inner_classes->at(j+1) || |
3171 | inner_classes->at(i+2) != inner_classes->at(j+2) || |
3172 | inner_classes->at(i+3) != inner_classes->at(j+3)), |
3173 | "Duplicate entry in InnerClasses in class file %s" , |
3174 | CHECK_0); |
3175 | } |
3176 | } |
3177 | } |
3178 | |
3179 | // Set EnclosingMethod class and method indexes. |
3180 | if (parsed_enclosingmethod_attribute) { |
3181 | inner_classes->at_put(index++, enclosing_method_class_index); |
3182 | inner_classes->at_put(index++, enclosing_method_method_index); |
3183 | } |
3184 | assert(index == size, "wrong size" ); |
3185 | |
3186 | // Restore buffer's current position. |
3187 | cfs->set_current(current_mark); |
3188 | |
3189 | return length; |
3190 | } |
3191 | |
3192 | u2 ClassFileParser::parse_classfile_nest_members_attribute(const ClassFileStream* const cfs, |
3193 | const u1* const nest_members_attribute_start, |
3194 | TRAPS) { |
3195 | const u1* const current_mark = cfs->current(); |
3196 | u2 length = 0; |
3197 | if (nest_members_attribute_start != NULL) { |
3198 | cfs->set_current(nest_members_attribute_start); |
3199 | cfs->guarantee_more(2, CHECK_0); // length |
3200 | length = cfs->get_u2_fast(); |
3201 | } |
3202 | const int size = length; |
3203 | Array<u2>* const nest_members = MetadataFactory::new_array<u2>(_loader_data, size, CHECK_0); |
3204 | _nest_members = nest_members; |
3205 | |
3206 | int index = 0; |
3207 | cfs->guarantee_more(2 * length, CHECK_0); |
3208 | for (int n = 0; n < length; n++) { |
3209 | const u2 class_info_index = cfs->get_u2_fast(); |
3210 | check_property( |
3211 | valid_klass_reference_at(class_info_index), |
3212 | "Nest member class_info_index %u has bad constant type in class file %s" , |
3213 | class_info_index, CHECK_0); |
3214 | nest_members->at_put(index++, class_info_index); |
3215 | } |
3216 | assert(index == size, "wrong size" ); |
3217 | |
3218 | // Restore buffer's current position. |
3219 | cfs->set_current(current_mark); |
3220 | |
3221 | return length; |
3222 | } |
3223 | |
3224 | void ClassFileParser::parse_classfile_synthetic_attribute(TRAPS) { |
3225 | set_class_synthetic_flag(true); |
3226 | } |
3227 | |
3228 | void ClassFileParser::parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS) { |
3229 | assert(cfs != NULL, "invariant" ); |
3230 | |
3231 | const u2 signature_index = cfs->get_u2(CHECK); |
3232 | check_property( |
3233 | valid_symbol_at(signature_index), |
3234 | "Invalid constant pool index %u in Signature attribute in class file %s" , |
3235 | signature_index, CHECK); |
3236 | set_class_generic_signature_index(signature_index); |
3237 | } |
3238 | |
3239 | void ClassFileParser::parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs, |
3240 | ConstantPool* cp, |
3241 | u4 attribute_byte_length, |
3242 | TRAPS) { |
3243 | assert(cfs != NULL, "invariant" ); |
3244 | assert(cp != NULL, "invariant" ); |
3245 | |
3246 | const u1* const current_start = cfs->current(); |
3247 | |
3248 | guarantee_property(attribute_byte_length >= sizeof(u2), |
3249 | "Invalid BootstrapMethods attribute length %u in class file %s" , |
3250 | attribute_byte_length, |
3251 | CHECK); |
3252 | |
3253 | cfs->guarantee_more(attribute_byte_length, CHECK); |
3254 | |
3255 | const int attribute_array_length = cfs->get_u2_fast(); |
3256 | |
3257 | guarantee_property(_max_bootstrap_specifier_index < attribute_array_length, |
3258 | "Short length on BootstrapMethods in class file %s" , |
3259 | CHECK); |
3260 | |
3261 | |
3262 | // The attribute contains a counted array of counted tuples of shorts, |
3263 | // represending bootstrap specifiers: |
3264 | // length*{bootstrap_method_index, argument_count*{argument_index}} |
3265 | const int operand_count = (attribute_byte_length - sizeof(u2)) / sizeof(u2); |
3266 | // operand_count = number of shorts in attr, except for leading length |
3267 | |
3268 | // The attribute is copied into a short[] array. |
3269 | // The array begins with a series of short[2] pairs, one for each tuple. |
3270 | const int index_size = (attribute_array_length * 2); |
3271 | |
3272 | Array<u2>* const operands = |
3273 | MetadataFactory::new_array<u2>(_loader_data, index_size + operand_count, CHECK); |
3274 | |
3275 | // Eagerly assign operands so they will be deallocated with the constant |
3276 | // pool if there is an error. |
3277 | cp->set_operands(operands); |
3278 | |
3279 | int operand_fill_index = index_size; |
3280 | const int cp_size = cp->length(); |
3281 | |
3282 | for (int n = 0; n < attribute_array_length; n++) { |
3283 | // Store a 32-bit offset into the header of the operand array. |
3284 | ConstantPool::operand_offset_at_put(operands, n, operand_fill_index); |
3285 | |
3286 | // Read a bootstrap specifier. |
3287 | cfs->guarantee_more(sizeof(u2) * 2, CHECK); // bsm, argc |
3288 | const u2 bootstrap_method_index = cfs->get_u2_fast(); |
3289 | const u2 argument_count = cfs->get_u2_fast(); |
3290 | check_property( |
3291 | valid_cp_range(bootstrap_method_index, cp_size) && |
3292 | cp->tag_at(bootstrap_method_index).is_method_handle(), |
3293 | "bootstrap_method_index %u has bad constant type in class file %s" , |
3294 | bootstrap_method_index, |
3295 | CHECK); |
3296 | |
3297 | guarantee_property((operand_fill_index + 1 + argument_count) < operands->length(), |
3298 | "Invalid BootstrapMethods num_bootstrap_methods or num_bootstrap_arguments value in class file %s" , |
3299 | CHECK); |
3300 | |
3301 | operands->at_put(operand_fill_index++, bootstrap_method_index); |
3302 | operands->at_put(operand_fill_index++, argument_count); |
3303 | |
3304 | cfs->guarantee_more(sizeof(u2) * argument_count, CHECK); // argv[argc] |
3305 | for (int j = 0; j < argument_count; j++) { |
3306 | const u2 argument_index = cfs->get_u2_fast(); |
3307 | check_property( |
3308 | valid_cp_range(argument_index, cp_size) && |
3309 | cp->tag_at(argument_index).is_loadable_constant(), |
3310 | "argument_index %u has bad constant type in class file %s" , |
3311 | argument_index, |
3312 | CHECK); |
3313 | operands->at_put(operand_fill_index++, argument_index); |
3314 | } |
3315 | } |
3316 | guarantee_property(current_start + attribute_byte_length == cfs->current(), |
3317 | "Bad length on BootstrapMethods in class file %s" , |
3318 | CHECK); |
3319 | } |
3320 | |
3321 | void ClassFileParser::parse_classfile_attributes(const ClassFileStream* const cfs, |
3322 | ConstantPool* cp, |
3323 | ClassFileParser::ClassAnnotationCollector* parsed_annotations, |
3324 | TRAPS) { |
3325 | assert(cfs != NULL, "invariant" ); |
3326 | assert(cp != NULL, "invariant" ); |
3327 | assert(parsed_annotations != NULL, "invariant" ); |
3328 | |
3329 | // Set inner classes attribute to default sentinel |
3330 | _inner_classes = Universe::the_empty_short_array(); |
3331 | // Set nest members attribute to default sentinel |
3332 | _nest_members = Universe::the_empty_short_array(); |
3333 | cfs->guarantee_more(2, CHECK); // attributes_count |
3334 | u2 attributes_count = cfs->get_u2_fast(); |
3335 | bool parsed_sourcefile_attribute = false; |
3336 | bool parsed_innerclasses_attribute = false; |
3337 | bool parsed_nest_members_attribute = false; |
3338 | bool parsed_nest_host_attribute = false; |
3339 | bool parsed_enclosingmethod_attribute = false; |
3340 | bool parsed_bootstrap_methods_attribute = false; |
3341 | const u1* runtime_visible_annotations = NULL; |
3342 | int runtime_visible_annotations_length = 0; |
3343 | const u1* runtime_invisible_annotations = NULL; |
3344 | int runtime_invisible_annotations_length = 0; |
3345 | const u1* runtime_visible_type_annotations = NULL; |
3346 | int runtime_visible_type_annotations_length = 0; |
3347 | const u1* runtime_invisible_type_annotations = NULL; |
3348 | int runtime_invisible_type_annotations_length = 0; |
3349 | bool runtime_invisible_type_annotations_exists = false; |
3350 | bool runtime_invisible_annotations_exists = false; |
3351 | bool parsed_source_debug_ext_annotations_exist = false; |
3352 | const u1* inner_classes_attribute_start = NULL; |
3353 | u4 inner_classes_attribute_length = 0; |
3354 | u2 enclosing_method_class_index = 0; |
3355 | u2 enclosing_method_method_index = 0; |
3356 | const u1* nest_members_attribute_start = NULL; |
3357 | u4 nest_members_attribute_length = 0; |
3358 | |
3359 | // Iterate over attributes |
3360 | while (attributes_count--) { |
3361 | cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length |
3362 | const u2 attribute_name_index = cfs->get_u2_fast(); |
3363 | const u4 attribute_length = cfs->get_u4_fast(); |
3364 | check_property( |
3365 | valid_symbol_at(attribute_name_index), |
3366 | "Attribute name has bad constant pool index %u in class file %s" , |
3367 | attribute_name_index, CHECK); |
3368 | const Symbol* const tag = cp->symbol_at(attribute_name_index); |
3369 | if (tag == vmSymbols::tag_source_file()) { |
3370 | // Check for SourceFile tag |
3371 | if (_need_verify) { |
3372 | guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s" , CHECK); |
3373 | } |
3374 | if (parsed_sourcefile_attribute) { |
3375 | classfile_parse_error("Multiple SourceFile attributes in class file %s" , CHECK); |
3376 | } else { |
3377 | parsed_sourcefile_attribute = true; |
3378 | } |
3379 | parse_classfile_sourcefile_attribute(cfs, CHECK); |
3380 | } else if (tag == vmSymbols::tag_source_debug_extension()) { |
3381 | // Check for SourceDebugExtension tag |
3382 | if (parsed_source_debug_ext_annotations_exist) { |
3383 | classfile_parse_error( |
3384 | "Multiple SourceDebugExtension attributes in class file %s" , CHECK); |
3385 | } |
3386 | parsed_source_debug_ext_annotations_exist = true; |
3387 | parse_classfile_source_debug_extension_attribute(cfs, (int)attribute_length, CHECK); |
3388 | } else if (tag == vmSymbols::tag_inner_classes()) { |
3389 | // Check for InnerClasses tag |
3390 | if (parsed_innerclasses_attribute) { |
3391 | classfile_parse_error("Multiple InnerClasses attributes in class file %s" , CHECK); |
3392 | } else { |
3393 | parsed_innerclasses_attribute = true; |
3394 | } |
3395 | inner_classes_attribute_start = cfs->current(); |
3396 | inner_classes_attribute_length = attribute_length; |
3397 | cfs->skip_u1(inner_classes_attribute_length, CHECK); |
3398 | } else if (tag == vmSymbols::tag_synthetic()) { |
3399 | // Check for Synthetic tag |
3400 | // Shouldn't we check that the synthetic flags wasn't already set? - not required in spec |
3401 | if (attribute_length != 0) { |
3402 | classfile_parse_error( |
3403 | "Invalid Synthetic classfile attribute length %u in class file %s" , |
3404 | attribute_length, CHECK); |
3405 | } |
3406 | parse_classfile_synthetic_attribute(CHECK); |
3407 | } else if (tag == vmSymbols::tag_deprecated()) { |
3408 | // Check for Deprecatd tag - 4276120 |
3409 | if (attribute_length != 0) { |
3410 | classfile_parse_error( |
3411 | "Invalid Deprecated classfile attribute length %u in class file %s" , |
3412 | attribute_length, CHECK); |
3413 | } |
3414 | } else if (_major_version >= JAVA_1_5_VERSION) { |
3415 | if (tag == vmSymbols::tag_signature()) { |
3416 | if (_generic_signature_index != 0) { |
3417 | classfile_parse_error( |
3418 | "Multiple Signature attributes in class file %s" , CHECK); |
3419 | } |
3420 | if (attribute_length != 2) { |
3421 | classfile_parse_error( |
3422 | "Wrong Signature attribute length %u in class file %s" , |
3423 | attribute_length, CHECK); |
3424 | } |
3425 | parse_classfile_signature_attribute(cfs, CHECK); |
3426 | } else if (tag == vmSymbols::tag_runtime_visible_annotations()) { |
3427 | if (runtime_visible_annotations != NULL) { |
3428 | classfile_parse_error( |
3429 | "Multiple RuntimeVisibleAnnotations attributes in class file %s" , CHECK); |
3430 | } |
3431 | runtime_visible_annotations_length = attribute_length; |
3432 | runtime_visible_annotations = cfs->current(); |
3433 | assert(runtime_visible_annotations != NULL, "null visible annotations" ); |
3434 | cfs->guarantee_more(runtime_visible_annotations_length, CHECK); |
3435 | parse_annotations(cp, |
3436 | runtime_visible_annotations, |
3437 | runtime_visible_annotations_length, |
3438 | parsed_annotations, |
3439 | _loader_data, |
3440 | CHECK); |
3441 | cfs->skip_u1_fast(runtime_visible_annotations_length); |
3442 | } else if (tag == vmSymbols::tag_runtime_invisible_annotations()) { |
3443 | if (runtime_invisible_annotations_exists) { |
3444 | classfile_parse_error( |
3445 | "Multiple RuntimeInvisibleAnnotations attributes in class file %s" , CHECK); |
3446 | } |
3447 | runtime_invisible_annotations_exists = true; |
3448 | if (PreserveAllAnnotations) { |
3449 | runtime_invisible_annotations_length = attribute_length; |
3450 | runtime_invisible_annotations = cfs->current(); |
3451 | assert(runtime_invisible_annotations != NULL, "null invisible annotations" ); |
3452 | } |
3453 | cfs->skip_u1(attribute_length, CHECK); |
3454 | } else if (tag == vmSymbols::tag_enclosing_method()) { |
3455 | if (parsed_enclosingmethod_attribute) { |
3456 | classfile_parse_error("Multiple EnclosingMethod attributes in class file %s" , CHECK); |
3457 | } else { |
3458 | parsed_enclosingmethod_attribute = true; |
3459 | } |
3460 | guarantee_property(attribute_length == 4, |
3461 | "Wrong EnclosingMethod attribute length %u in class file %s" , |
3462 | attribute_length, CHECK); |
3463 | cfs->guarantee_more(4, CHECK); // class_index, method_index |
3464 | enclosing_method_class_index = cfs->get_u2_fast(); |
3465 | enclosing_method_method_index = cfs->get_u2_fast(); |
3466 | if (enclosing_method_class_index == 0) { |
3467 | classfile_parse_error("Invalid class index in EnclosingMethod attribute in class file %s" , CHECK); |
3468 | } |
3469 | // Validate the constant pool indices and types |
3470 | check_property(valid_klass_reference_at(enclosing_method_class_index), |
3471 | "Invalid or out-of-bounds class index in EnclosingMethod attribute in class file %s" , CHECK); |
3472 | if (enclosing_method_method_index != 0 && |
3473 | (!cp->is_within_bounds(enclosing_method_method_index) || |
3474 | !cp->tag_at(enclosing_method_method_index).is_name_and_type())) { |
3475 | classfile_parse_error("Invalid or out-of-bounds method index in EnclosingMethod attribute in class file %s" , CHECK); |
3476 | } |
3477 | } else if (tag == vmSymbols::tag_bootstrap_methods() && |
3478 | _major_version >= Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { |
3479 | if (parsed_bootstrap_methods_attribute) { |
3480 | classfile_parse_error("Multiple BootstrapMethods attributes in class file %s" , CHECK); |
3481 | } |
3482 | parsed_bootstrap_methods_attribute = true; |
3483 | parse_classfile_bootstrap_methods_attribute(cfs, cp, attribute_length, CHECK); |
3484 | } else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) { |
3485 | if (runtime_visible_type_annotations != NULL) { |
3486 | classfile_parse_error( |
3487 | "Multiple RuntimeVisibleTypeAnnotations attributes in class file %s" , CHECK); |
3488 | } |
3489 | runtime_visible_type_annotations_length = attribute_length; |
3490 | runtime_visible_type_annotations = cfs->current(); |
3491 | assert(runtime_visible_type_annotations != NULL, "null visible type annotations" ); |
3492 | // No need for the VM to parse Type annotations |
3493 | cfs->skip_u1(runtime_visible_type_annotations_length, CHECK); |
3494 | } else if (tag == vmSymbols::tag_runtime_invisible_type_annotations()) { |
3495 | if (runtime_invisible_type_annotations_exists) { |
3496 | classfile_parse_error( |
3497 | "Multiple RuntimeInvisibleTypeAnnotations attributes in class file %s" , CHECK); |
3498 | } else { |
3499 | runtime_invisible_type_annotations_exists = true; |
3500 | } |
3501 | if (PreserveAllAnnotations) { |
3502 | runtime_invisible_type_annotations_length = attribute_length; |
3503 | runtime_invisible_type_annotations = cfs->current(); |
3504 | assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations" ); |
3505 | } |
3506 | cfs->skip_u1(attribute_length, CHECK); |
3507 | } else if (_major_version >= JAVA_11_VERSION) { |
3508 | if (tag == vmSymbols::tag_nest_members()) { |
3509 | // Check for NestMembers tag |
3510 | if (parsed_nest_members_attribute) { |
3511 | classfile_parse_error("Multiple NestMembers attributes in class file %s" , CHECK); |
3512 | } else { |
3513 | parsed_nest_members_attribute = true; |
3514 | } |
3515 | if (parsed_nest_host_attribute) { |
3516 | classfile_parse_error("Conflicting NestHost and NestMembers attributes in class file %s" , CHECK); |
3517 | } |
3518 | nest_members_attribute_start = cfs->current(); |
3519 | nest_members_attribute_length = attribute_length; |
3520 | cfs->skip_u1(nest_members_attribute_length, CHECK); |
3521 | } else if (tag == vmSymbols::tag_nest_host()) { |
3522 | if (parsed_nest_host_attribute) { |
3523 | classfile_parse_error("Multiple NestHost attributes in class file %s" , CHECK); |
3524 | } else { |
3525 | parsed_nest_host_attribute = true; |
3526 | } |
3527 | if (parsed_nest_members_attribute) { |
3528 | classfile_parse_error("Conflicting NestMembers and NestHost attributes in class file %s" , CHECK); |
3529 | } |
3530 | if (_need_verify) { |
3531 | guarantee_property(attribute_length == 2, "Wrong NestHost attribute length in class file %s" , CHECK); |
3532 | } |
3533 | cfs->guarantee_more(2, CHECK); |
3534 | u2 class_info_index = cfs->get_u2_fast(); |
3535 | check_property( |
3536 | valid_klass_reference_at(class_info_index), |
3537 | "Nest-host class_info_index %u has bad constant type in class file %s" , |
3538 | class_info_index, CHECK); |
3539 | _nest_host = class_info_index; |
3540 | } else { |
3541 | // Unknown attribute |
3542 | cfs->skip_u1(attribute_length, CHECK); |
3543 | } |
3544 | } else { |
3545 | // Unknown attribute |
3546 | cfs->skip_u1(attribute_length, CHECK); |
3547 | } |
3548 | } else { |
3549 | // Unknown attribute |
3550 | cfs->skip_u1(attribute_length, CHECK); |
3551 | } |
3552 | } |
3553 | _annotations = assemble_annotations(runtime_visible_annotations, |
3554 | runtime_visible_annotations_length, |
3555 | runtime_invisible_annotations, |
3556 | runtime_invisible_annotations_length, |
3557 | CHECK); |
3558 | _type_annotations = assemble_annotations(runtime_visible_type_annotations, |
3559 | runtime_visible_type_annotations_length, |
3560 | runtime_invisible_type_annotations, |
3561 | runtime_invisible_type_annotations_length, |
3562 | CHECK); |
3563 | |
3564 | if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) { |
3565 | const u2 num_of_classes = parse_classfile_inner_classes_attribute( |
3566 | cfs, |
3567 | inner_classes_attribute_start, |
3568 | parsed_innerclasses_attribute, |
3569 | enclosing_method_class_index, |
3570 | enclosing_method_method_index, |
3571 | CHECK); |
3572 | if (parsed_innerclasses_attribute && _need_verify && _major_version >= JAVA_1_5_VERSION) { |
3573 | guarantee_property( |
3574 | inner_classes_attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes, |
3575 | "Wrong InnerClasses attribute length in class file %s" , CHECK); |
3576 | } |
3577 | } |
3578 | |
3579 | if (parsed_nest_members_attribute) { |
3580 | const u2 num_of_classes = parse_classfile_nest_members_attribute( |
3581 | cfs, |
3582 | nest_members_attribute_start, |
3583 | CHECK); |
3584 | if (_need_verify) { |
3585 | guarantee_property( |
3586 | nest_members_attribute_length == sizeof(num_of_classes) + sizeof(u2) * num_of_classes, |
3587 | "Wrong NestMembers attribute length in class file %s" , CHECK); |
3588 | } |
3589 | } |
3590 | |
3591 | if (_max_bootstrap_specifier_index >= 0) { |
3592 | guarantee_property(parsed_bootstrap_methods_attribute, |
3593 | "Missing BootstrapMethods attribute in class file %s" , CHECK); |
3594 | } |
3595 | } |
3596 | |
3597 | void ClassFileParser::apply_parsed_class_attributes(InstanceKlass* k) { |
3598 | assert(k != NULL, "invariant" ); |
3599 | |
3600 | if (_synthetic_flag) |
3601 | k->set_is_synthetic(); |
3602 | if (_sourcefile_index != 0) { |
3603 | k->set_source_file_name_index(_sourcefile_index); |
3604 | } |
3605 | if (_generic_signature_index != 0) { |
3606 | k->set_generic_signature_index(_generic_signature_index); |
3607 | } |
3608 | if (_sde_buffer != NULL) { |
3609 | k->set_source_debug_extension(_sde_buffer, _sde_length); |
3610 | } |
3611 | } |
3612 | |
3613 | // Create the Annotations object that will |
3614 | // hold the annotations array for the Klass. |
3615 | void ClassFileParser::create_combined_annotations(TRAPS) { |
3616 | if (_annotations == NULL && |
3617 | _type_annotations == NULL && |
3618 | _fields_annotations == NULL && |
3619 | _fields_type_annotations == NULL) { |
3620 | // Don't create the Annotations object unnecessarily. |
3621 | return; |
3622 | } |
3623 | |
3624 | Annotations* const annotations = Annotations::allocate(_loader_data, CHECK); |
3625 | annotations->set_class_annotations(_annotations); |
3626 | annotations->set_class_type_annotations(_type_annotations); |
3627 | annotations->set_fields_annotations(_fields_annotations); |
3628 | annotations->set_fields_type_annotations(_fields_type_annotations); |
3629 | |
3630 | // This is the Annotations object that will be |
3631 | // assigned to InstanceKlass being constructed. |
3632 | _combined_annotations = annotations; |
3633 | |
3634 | // The annotations arrays below has been transfered the |
3635 | // _combined_annotations so these fields can now be cleared. |
3636 | _annotations = NULL; |
3637 | _type_annotations = NULL; |
3638 | _fields_annotations = NULL; |
3639 | _fields_type_annotations = NULL; |
3640 | } |
3641 | |
3642 | // Transfer ownership of metadata allocated to the InstanceKlass. |
3643 | void ClassFileParser::apply_parsed_class_metadata( |
3644 | InstanceKlass* this_klass, |
3645 | int java_fields_count, TRAPS) { |
3646 | assert(this_klass != NULL, "invariant" ); |
3647 | |
3648 | _cp->set_pool_holder(this_klass); |
3649 | this_klass->set_constants(_cp); |
3650 | this_klass->set_fields(_fields, java_fields_count); |
3651 | this_klass->set_methods(_methods); |
3652 | this_klass->set_inner_classes(_inner_classes); |
3653 | this_klass->set_nest_members(_nest_members); |
3654 | this_klass->set_nest_host_index(_nest_host); |
3655 | this_klass->set_local_interfaces(_local_interfaces); |
3656 | this_klass->set_annotations(_combined_annotations); |
3657 | // Delay the setting of _transitive_interfaces until after initialize_supers() in |
3658 | // fill_instance_klass(). It is because the _transitive_interfaces may be shared with |
3659 | // its _super. If an OOM occurs while loading the current klass, its _super field |
3660 | // may not have been set. When GC tries to free the klass, the _transitive_interfaces |
3661 | // may be deallocated mistakenly in InstanceKlass::deallocate_interfaces(). Subsequent |
3662 | // dereferences to the deallocated _transitive_interfaces will result in a crash. |
3663 | |
3664 | // Clear out these fields so they don't get deallocated by the destructor |
3665 | clear_class_metadata(); |
3666 | } |
3667 | |
3668 | AnnotationArray* ClassFileParser::assemble_annotations(const u1* const runtime_visible_annotations, |
3669 | int runtime_visible_annotations_length, |
3670 | const u1* const runtime_invisible_annotations, |
3671 | int runtime_invisible_annotations_length, |
3672 | TRAPS) { |
3673 | AnnotationArray* annotations = NULL; |
3674 | if (runtime_visible_annotations != NULL || |
3675 | runtime_invisible_annotations != NULL) { |
3676 | annotations = MetadataFactory::new_array<u1>(_loader_data, |
3677 | runtime_visible_annotations_length + |
3678 | runtime_invisible_annotations_length, |
3679 | CHECK_(annotations)); |
3680 | if (runtime_visible_annotations != NULL) { |
3681 | for (int i = 0; i < runtime_visible_annotations_length; i++) { |
3682 | annotations->at_put(i, runtime_visible_annotations[i]); |
3683 | } |
3684 | } |
3685 | if (runtime_invisible_annotations != NULL) { |
3686 | for (int i = 0; i < runtime_invisible_annotations_length; i++) { |
3687 | int append = runtime_visible_annotations_length+i; |
3688 | annotations->at_put(append, runtime_invisible_annotations[i]); |
3689 | } |
3690 | } |
3691 | } |
3692 | return annotations; |
3693 | } |
3694 | |
3695 | const InstanceKlass* ClassFileParser::parse_super_class(ConstantPool* const cp, |
3696 | const int super_class_index, |
3697 | const bool need_verify, |
3698 | TRAPS) { |
3699 | assert(cp != NULL, "invariant" ); |
3700 | const InstanceKlass* super_klass = NULL; |
3701 | |
3702 | if (super_class_index == 0) { |
3703 | check_property(_class_name == vmSymbols::java_lang_Object(), |
3704 | "Invalid superclass index %u in class file %s" , |
3705 | super_class_index, |
3706 | CHECK_NULL); |
3707 | } else { |
3708 | check_property(valid_klass_reference_at(super_class_index), |
3709 | "Invalid superclass index %u in class file %s" , |
3710 | super_class_index, |
3711 | CHECK_NULL); |
3712 | // The class name should be legal because it is checked when parsing constant pool. |
3713 | // However, make sure it is not an array type. |
3714 | bool is_array = false; |
3715 | if (cp->tag_at(super_class_index).is_klass()) { |
3716 | super_klass = InstanceKlass::cast(cp->resolved_klass_at(super_class_index)); |
3717 | if (need_verify) |
3718 | is_array = super_klass->is_array_klass(); |
3719 | } else if (need_verify) { |
3720 | is_array = (cp->klass_name_at(super_class_index)->char_at(0) == JVM_SIGNATURE_ARRAY); |
3721 | } |
3722 | if (need_verify) { |
3723 | guarantee_property(!is_array, |
3724 | "Bad superclass name in class file %s" , CHECK_NULL); |
3725 | } |
3726 | } |
3727 | return super_klass; |
3728 | } |
3729 | |
3730 | static unsigned int compute_oop_map_count(const InstanceKlass* super, |
3731 | unsigned int nonstatic_oop_map_count, |
3732 | int first_nonstatic_oop_offset) { |
3733 | |
3734 | unsigned int map_count = |
3735 | NULL == super ? 0 : super->nonstatic_oop_map_count(); |
3736 | if (nonstatic_oop_map_count > 0) { |
3737 | // We have oops to add to map |
3738 | if (map_count == 0) { |
3739 | map_count = nonstatic_oop_map_count; |
3740 | } |
3741 | else { |
3742 | // Check whether we should add a new map block or whether the last one can |
3743 | // be extended |
3744 | const OopMapBlock* const first_map = super->start_of_nonstatic_oop_maps(); |
3745 | const OopMapBlock* const last_map = first_map + map_count - 1; |
3746 | |
3747 | const int next_offset = last_map->offset() + last_map->count() * heapOopSize; |
3748 | if (next_offset == first_nonstatic_oop_offset) { |
3749 | // There is no gap bettwen superklass's last oop field and first |
3750 | // local oop field, merge maps. |
3751 | nonstatic_oop_map_count -= 1; |
3752 | } |
3753 | else { |
3754 | // Superklass didn't end with a oop field, add extra maps |
3755 | assert(next_offset < first_nonstatic_oop_offset, "just checking" ); |
3756 | } |
3757 | map_count += nonstatic_oop_map_count; |
3758 | } |
3759 | } |
3760 | return map_count; |
3761 | } |
3762 | |
3763 | #ifndef PRODUCT |
3764 | static void print_field_layout(const Symbol* name, |
3765 | Array<u2>* fields, |
3766 | const constantPoolHandle& cp, |
3767 | int instance_size, |
3768 | int instance_fields_start, |
3769 | int instance_fields_end, |
3770 | int static_fields_end) { |
3771 | |
3772 | assert(name != NULL, "invariant" ); |
3773 | |
3774 | tty->print("%s: field layout\n" , name->as_klass_external_name()); |
3775 | tty->print(" @%3d %s\n" , instance_fields_start, "--- instance fields start ---" ); |
3776 | for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
3777 | if (!fs.access_flags().is_static()) { |
3778 | tty->print(" @%3d \"%s\" %s\n" , |
3779 | fs.offset(), |
3780 | fs.name()->as_klass_external_name(), |
3781 | fs.signature()->as_klass_external_name()); |
3782 | } |
3783 | } |
3784 | tty->print(" @%3d %s\n" , instance_fields_end, "--- instance fields end ---" ); |
3785 | tty->print(" @%3d %s\n" , instance_size * wordSize, "--- instance ends ---" ); |
3786 | tty->print(" @%3d %s\n" , InstanceMirrorKlass::offset_of_static_fields(), "--- static fields start ---" ); |
3787 | for (AllFieldStream fs(fields, cp); !fs.done(); fs.next()) { |
3788 | if (fs.access_flags().is_static()) { |
3789 | tty->print(" @%3d \"%s\" %s\n" , |
3790 | fs.offset(), |
3791 | fs.name()->as_klass_external_name(), |
3792 | fs.signature()->as_klass_external_name()); |
3793 | } |
3794 | } |
3795 | tty->print(" @%3d %s\n" , static_fields_end, "--- static fields end ---" ); |
3796 | tty->print("\n" ); |
3797 | } |
3798 | #endif |
3799 | |
3800 | // Values needed for oopmap and InstanceKlass creation |
3801 | class ClassFileParser::FieldLayoutInfo : public ResourceObj { |
3802 | public: |
3803 | int* nonstatic_oop_offsets; |
3804 | unsigned int* nonstatic_oop_counts; |
3805 | unsigned int nonstatic_oop_map_count; |
3806 | unsigned int total_oop_map_count; |
3807 | int instance_size; |
3808 | int nonstatic_field_size; |
3809 | int static_field_size; |
3810 | bool has_nonstatic_fields; |
3811 | }; |
3812 | |
3813 | // Layout fields and fill in FieldLayoutInfo. Could use more refactoring! |
3814 | void ClassFileParser::layout_fields(ConstantPool* cp, |
3815 | const FieldAllocationCount* fac, |
3816 | const ClassAnnotationCollector* parsed_annotations, |
3817 | FieldLayoutInfo* info, |
3818 | TRAPS) { |
3819 | |
3820 | assert(cp != NULL, "invariant" ); |
3821 | |
3822 | // Field size and offset computation |
3823 | int nonstatic_field_size = _super_klass == NULL ? 0 : |
3824 | _super_klass->nonstatic_field_size(); |
3825 | |
3826 | // Count the contended fields by type. |
3827 | // |
3828 | // We ignore static fields, because @Contended is not supported for them. |
3829 | // The layout code below will also ignore the static fields. |
3830 | int nonstatic_contended_count = 0; |
3831 | FieldAllocationCount fac_contended; |
3832 | for (AllFieldStream fs(_fields, cp); !fs.done(); fs.next()) { |
3833 | FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
3834 | if (fs.is_contended()) { |
3835 | fac_contended.count[atype]++; |
3836 | if (!fs.access_flags().is_static()) { |
3837 | nonstatic_contended_count++; |
3838 | } |
3839 | } |
3840 | } |
3841 | |
3842 | |
3843 | // Calculate the starting byte offsets |
3844 | int next_static_oop_offset = InstanceMirrorKlass::offset_of_static_fields(); |
3845 | int next_static_double_offset = next_static_oop_offset + |
3846 | ((fac->count[STATIC_OOP]) * heapOopSize); |
3847 | if (fac->count[STATIC_DOUBLE]) { |
3848 | next_static_double_offset = align_up(next_static_double_offset, BytesPerLong); |
3849 | } |
3850 | |
3851 | int next_static_word_offset = next_static_double_offset + |
3852 | ((fac->count[STATIC_DOUBLE]) * BytesPerLong); |
3853 | int next_static_short_offset = next_static_word_offset + |
3854 | ((fac->count[STATIC_WORD]) * BytesPerInt); |
3855 | int next_static_byte_offset = next_static_short_offset + |
3856 | ((fac->count[STATIC_SHORT]) * BytesPerShort); |
3857 | |
3858 | int nonstatic_fields_start = instanceOopDesc::base_offset_in_bytes() + |
3859 | nonstatic_field_size * heapOopSize; |
3860 | |
3861 | int next_nonstatic_field_offset = nonstatic_fields_start; |
3862 | |
3863 | const bool is_contended_class = parsed_annotations->is_contended(); |
3864 | |
3865 | // Class is contended, pad before all the fields |
3866 | if (is_contended_class) { |
3867 | next_nonstatic_field_offset += ContendedPaddingWidth; |
3868 | } |
3869 | |
3870 | // Compute the non-contended fields count. |
3871 | // The packing code below relies on these counts to determine if some field |
3872 | // can be squeezed into the alignment gap. Contended fields are obviously |
3873 | // exempt from that. |
3874 | unsigned int nonstatic_double_count = fac->count[NONSTATIC_DOUBLE] - fac_contended.count[NONSTATIC_DOUBLE]; |
3875 | unsigned int nonstatic_word_count = fac->count[NONSTATIC_WORD] - fac_contended.count[NONSTATIC_WORD]; |
3876 | unsigned int nonstatic_short_count = fac->count[NONSTATIC_SHORT] - fac_contended.count[NONSTATIC_SHORT]; |
3877 | unsigned int nonstatic_byte_count = fac->count[NONSTATIC_BYTE] - fac_contended.count[NONSTATIC_BYTE]; |
3878 | unsigned int nonstatic_oop_count = fac->count[NONSTATIC_OOP] - fac_contended.count[NONSTATIC_OOP]; |
3879 | |
3880 | // Total non-static fields count, including every contended field |
3881 | unsigned int nonstatic_fields_count = fac->count[NONSTATIC_DOUBLE] + fac->count[NONSTATIC_WORD] + |
3882 | fac->count[NONSTATIC_SHORT] + fac->count[NONSTATIC_BYTE] + |
3883 | fac->count[NONSTATIC_OOP]; |
3884 | |
3885 | const bool super_has_nonstatic_fields = |
3886 | (_super_klass != NULL && _super_klass->has_nonstatic_fields()); |
3887 | const bool has_nonstatic_fields = |
3888 | super_has_nonstatic_fields || (nonstatic_fields_count != 0); |
3889 | |
3890 | |
3891 | // Prepare list of oops for oop map generation. |
3892 | // |
3893 | // "offset" and "count" lists are describing the set of contiguous oop |
3894 | // regions. offset[i] is the start of the i-th region, which then has |
3895 | // count[i] oops following. Before we know how many regions are required, |
3896 | // we pessimistically allocate the maps to fit all the oops into the |
3897 | // distinct regions. |
3898 | // |
3899 | // TODO: We add +1 to always allocate non-zero resource arrays; we need |
3900 | // to figure out if we still need to do this. |
3901 | unsigned int nonstatic_oop_map_count = 0; |
3902 | unsigned int max_nonstatic_oop_maps = fac->count[NONSTATIC_OOP] + 1; |
3903 | |
3904 | int* nonstatic_oop_offsets = NEW_RESOURCE_ARRAY_IN_THREAD( |
3905 | THREAD, int, max_nonstatic_oop_maps); |
3906 | unsigned int* const nonstatic_oop_counts = NEW_RESOURCE_ARRAY_IN_THREAD( |
3907 | THREAD, unsigned int, max_nonstatic_oop_maps); |
3908 | |
3909 | int first_nonstatic_oop_offset = 0; // will be set for first oop field |
3910 | |
3911 | bool compact_fields = CompactFields; |
3912 | int allocation_style = FieldsAllocationStyle; |
3913 | if( allocation_style < 0 || allocation_style > 2 ) { // Out of range? |
3914 | assert(false, "0 <= FieldsAllocationStyle <= 2" ); |
3915 | allocation_style = 1; // Optimistic |
3916 | } |
3917 | |
3918 | // The next classes have predefined hard-coded fields offsets |
3919 | // (see in JavaClasses::compute_hard_coded_offsets()). |
3920 | // Use default fields allocation order for them. |
3921 | if( (allocation_style != 0 || compact_fields ) && _loader_data->class_loader() == NULL && |
3922 | (_class_name == vmSymbols::java_lang_AssertionStatusDirectives() || |
3923 | _class_name == vmSymbols::java_lang_Class() || |
3924 | _class_name == vmSymbols::java_lang_ClassLoader() || |
3925 | _class_name == vmSymbols::java_lang_ref_Reference() || |
3926 | _class_name == vmSymbols::java_lang_ref_SoftReference() || |
3927 | _class_name == vmSymbols::java_lang_StackTraceElement() || |
3928 | _class_name == vmSymbols::java_lang_String() || |
3929 | _class_name == vmSymbols::java_lang_Throwable() || |
3930 | _class_name == vmSymbols::java_lang_Boolean() || |
3931 | _class_name == vmSymbols::java_lang_Character() || |
3932 | _class_name == vmSymbols::java_lang_Float() || |
3933 | _class_name == vmSymbols::java_lang_Double() || |
3934 | _class_name == vmSymbols::java_lang_Byte() || |
3935 | _class_name == vmSymbols::java_lang_Short() || |
3936 | _class_name == vmSymbols::java_lang_Integer() || |
3937 | _class_name == vmSymbols::java_lang_Long())) { |
3938 | allocation_style = 0; // Allocate oops first |
3939 | compact_fields = false; // Don't compact fields |
3940 | } |
3941 | |
3942 | int next_nonstatic_oop_offset = 0; |
3943 | int next_nonstatic_double_offset = 0; |
3944 | |
3945 | // Rearrange fields for a given allocation style |
3946 | if( allocation_style == 0 ) { |
3947 | // Fields order: oops, longs/doubles, ints, shorts/chars, bytes, padded fields |
3948 | next_nonstatic_oop_offset = next_nonstatic_field_offset; |
3949 | next_nonstatic_double_offset = next_nonstatic_oop_offset + |
3950 | (nonstatic_oop_count * heapOopSize); |
3951 | } else if( allocation_style == 1 ) { |
3952 | // Fields order: longs/doubles, ints, shorts/chars, bytes, oops, padded fields |
3953 | next_nonstatic_double_offset = next_nonstatic_field_offset; |
3954 | } else if( allocation_style == 2 ) { |
3955 | // Fields allocation: oops fields in super and sub classes are together. |
3956 | if( nonstatic_field_size > 0 && _super_klass != NULL && |
3957 | _super_klass->nonstatic_oop_map_size() > 0 ) { |
3958 | const unsigned int map_count = _super_klass->nonstatic_oop_map_count(); |
3959 | const OopMapBlock* const first_map = _super_klass->start_of_nonstatic_oop_maps(); |
3960 | const OopMapBlock* const last_map = first_map + map_count - 1; |
3961 | const int next_offset = last_map->offset() + (last_map->count() * heapOopSize); |
3962 | if (next_offset == next_nonstatic_field_offset) { |
3963 | allocation_style = 0; // allocate oops first |
3964 | next_nonstatic_oop_offset = next_nonstatic_field_offset; |
3965 | next_nonstatic_double_offset = next_nonstatic_oop_offset + |
3966 | (nonstatic_oop_count * heapOopSize); |
3967 | } |
3968 | } |
3969 | if( allocation_style == 2 ) { |
3970 | allocation_style = 1; // allocate oops last |
3971 | next_nonstatic_double_offset = next_nonstatic_field_offset; |
3972 | } |
3973 | } else { |
3974 | ShouldNotReachHere(); |
3975 | } |
3976 | |
3977 | int nonstatic_oop_space_count = 0; |
3978 | int nonstatic_word_space_count = 0; |
3979 | int nonstatic_short_space_count = 0; |
3980 | int nonstatic_byte_space_count = 0; |
3981 | int nonstatic_oop_space_offset = 0; |
3982 | int nonstatic_word_space_offset = 0; |
3983 | int nonstatic_short_space_offset = 0; |
3984 | int nonstatic_byte_space_offset = 0; |
3985 | |
3986 | // Try to squeeze some of the fields into the gaps due to |
3987 | // long/double alignment. |
3988 | if (nonstatic_double_count > 0) { |
3989 | int offset = next_nonstatic_double_offset; |
3990 | next_nonstatic_double_offset = align_up(offset, BytesPerLong); |
3991 | if (compact_fields && offset != next_nonstatic_double_offset) { |
3992 | // Allocate available fields into the gap before double field. |
3993 | int length = next_nonstatic_double_offset - offset; |
3994 | assert(length == BytesPerInt, "" ); |
3995 | nonstatic_word_space_offset = offset; |
3996 | if (nonstatic_word_count > 0) { |
3997 | nonstatic_word_count -= 1; |
3998 | nonstatic_word_space_count = 1; // Only one will fit |
3999 | length -= BytesPerInt; |
4000 | offset += BytesPerInt; |
4001 | } |
4002 | nonstatic_short_space_offset = offset; |
4003 | while (length >= BytesPerShort && nonstatic_short_count > 0) { |
4004 | nonstatic_short_count -= 1; |
4005 | nonstatic_short_space_count += 1; |
4006 | length -= BytesPerShort; |
4007 | offset += BytesPerShort; |
4008 | } |
4009 | nonstatic_byte_space_offset = offset; |
4010 | while (length > 0 && nonstatic_byte_count > 0) { |
4011 | nonstatic_byte_count -= 1; |
4012 | nonstatic_byte_space_count += 1; |
4013 | length -= 1; |
4014 | } |
4015 | // Allocate oop field in the gap if there are no other fields for that. |
4016 | nonstatic_oop_space_offset = offset; |
4017 | if (length >= heapOopSize && nonstatic_oop_count > 0 && |
4018 | allocation_style != 0) { // when oop fields not first |
4019 | nonstatic_oop_count -= 1; |
4020 | nonstatic_oop_space_count = 1; // Only one will fit |
4021 | length -= heapOopSize; |
4022 | offset += heapOopSize; |
4023 | } |
4024 | } |
4025 | } |
4026 | |
4027 | int next_nonstatic_word_offset = next_nonstatic_double_offset + |
4028 | (nonstatic_double_count * BytesPerLong); |
4029 | int next_nonstatic_short_offset = next_nonstatic_word_offset + |
4030 | (nonstatic_word_count * BytesPerInt); |
4031 | int next_nonstatic_byte_offset = next_nonstatic_short_offset + |
4032 | (nonstatic_short_count * BytesPerShort); |
4033 | int next_nonstatic_padded_offset = next_nonstatic_byte_offset + |
4034 | nonstatic_byte_count; |
4035 | |
4036 | // let oops jump before padding with this allocation style |
4037 | if( allocation_style == 1 ) { |
4038 | next_nonstatic_oop_offset = next_nonstatic_padded_offset; |
4039 | if( nonstatic_oop_count > 0 ) { |
4040 | next_nonstatic_oop_offset = align_up(next_nonstatic_oop_offset, heapOopSize); |
4041 | } |
4042 | next_nonstatic_padded_offset = next_nonstatic_oop_offset + (nonstatic_oop_count * heapOopSize); |
4043 | } |
4044 | |
4045 | // Iterate over fields again and compute correct offsets. |
4046 | // The field allocation type was temporarily stored in the offset slot. |
4047 | // oop fields are located before non-oop fields (static and non-static). |
4048 | for (AllFieldStream fs(_fields, cp); !fs.done(); fs.next()) { |
4049 | |
4050 | // skip already laid out fields |
4051 | if (fs.is_offset_set()) continue; |
4052 | |
4053 | // contended instance fields are handled below |
4054 | if (fs.is_contended() && !fs.access_flags().is_static()) continue; |
4055 | |
4056 | int real_offset = 0; |
4057 | const FieldAllocationType atype = (const FieldAllocationType) fs.allocation_type(); |
4058 | |
4059 | // pack the rest of the fields |
4060 | switch (atype) { |
4061 | case STATIC_OOP: |
4062 | real_offset = next_static_oop_offset; |
4063 | next_static_oop_offset += heapOopSize; |
4064 | break; |
4065 | case STATIC_BYTE: |
4066 | real_offset = next_static_byte_offset; |
4067 | next_static_byte_offset += 1; |
4068 | break; |
4069 | case STATIC_SHORT: |
4070 | real_offset = next_static_short_offset; |
4071 | next_static_short_offset += BytesPerShort; |
4072 | break; |
4073 | case STATIC_WORD: |
4074 | real_offset = next_static_word_offset; |
4075 | next_static_word_offset += BytesPerInt; |
4076 | break; |
4077 | case STATIC_DOUBLE: |
4078 | real_offset = next_static_double_offset; |
4079 | next_static_double_offset += BytesPerLong; |
4080 | break; |
4081 | case NONSTATIC_OOP: |
4082 | if( nonstatic_oop_space_count > 0 ) { |
4083 | real_offset = nonstatic_oop_space_offset; |
4084 | nonstatic_oop_space_offset += heapOopSize; |
4085 | nonstatic_oop_space_count -= 1; |
4086 | } else { |
4087 | real_offset = next_nonstatic_oop_offset; |
4088 | next_nonstatic_oop_offset += heapOopSize; |
4089 | } |
4090 | |
4091 | // Record this oop in the oop maps |
4092 | if( nonstatic_oop_map_count > 0 && |
4093 | nonstatic_oop_offsets[nonstatic_oop_map_count - 1] == |
4094 | real_offset - |
4095 | int(nonstatic_oop_counts[nonstatic_oop_map_count - 1]) * |
4096 | heapOopSize ) { |
4097 | // This oop is adjacent to the previous one, add to current oop map |
4098 | assert(nonstatic_oop_map_count - 1 < max_nonstatic_oop_maps, "range check" ); |
4099 | nonstatic_oop_counts[nonstatic_oop_map_count - 1] += 1; |
4100 | } else { |
4101 | // This oop is not adjacent to the previous one, create new oop map |
4102 | assert(nonstatic_oop_map_count < max_nonstatic_oop_maps, "range check" ); |
4103 | nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
4104 | nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
4105 | nonstatic_oop_map_count += 1; |
4106 | if( first_nonstatic_oop_offset == 0 ) { // Undefined |
4107 | first_nonstatic_oop_offset = real_offset; |
4108 | } |
4109 | } |
4110 | break; |
4111 | case NONSTATIC_BYTE: |
4112 | if( nonstatic_byte_space_count > 0 ) { |
4113 | real_offset = nonstatic_byte_space_offset; |
4114 | nonstatic_byte_space_offset += 1; |
4115 | nonstatic_byte_space_count -= 1; |
4116 | } else { |
4117 | real_offset = next_nonstatic_byte_offset; |
4118 | next_nonstatic_byte_offset += 1; |
4119 | } |
4120 | break; |
4121 | case NONSTATIC_SHORT: |
4122 | if( nonstatic_short_space_count > 0 ) { |
4123 | real_offset = nonstatic_short_space_offset; |
4124 | nonstatic_short_space_offset += BytesPerShort; |
4125 | nonstatic_short_space_count -= 1; |
4126 | } else { |
4127 | real_offset = next_nonstatic_short_offset; |
4128 | next_nonstatic_short_offset += BytesPerShort; |
4129 | } |
4130 | break; |
4131 | case NONSTATIC_WORD: |
4132 | if( nonstatic_word_space_count > 0 ) { |
4133 | real_offset = nonstatic_word_space_offset; |
4134 | nonstatic_word_space_offset += BytesPerInt; |
4135 | nonstatic_word_space_count -= 1; |
4136 | } else { |
4137 | real_offset = next_nonstatic_word_offset; |
4138 | next_nonstatic_word_offset += BytesPerInt; |
4139 | } |
4140 | break; |
4141 | case NONSTATIC_DOUBLE: |
4142 | real_offset = next_nonstatic_double_offset; |
4143 | next_nonstatic_double_offset += BytesPerLong; |
4144 | break; |
4145 | default: |
4146 | ShouldNotReachHere(); |
4147 | } |
4148 | fs.set_offset(real_offset); |
4149 | } |
4150 | |
4151 | |
4152 | // Handle the contended cases. |
4153 | // |
4154 | // Each contended field should not intersect the cache line with another contended field. |
4155 | // In the absence of alignment information, we end up with pessimistically separating |
4156 | // the fields with full-width padding. |
4157 | // |
4158 | // Additionally, this should not break alignment for the fields, so we round the alignment up |
4159 | // for each field. |
4160 | if (nonstatic_contended_count > 0) { |
4161 | |
4162 | // if there is at least one contended field, we need to have pre-padding for them |
4163 | next_nonstatic_padded_offset += ContendedPaddingWidth; |
4164 | |
4165 | // collect all contended groups |
4166 | ResourceBitMap bm(cp->size()); |
4167 | for (AllFieldStream fs(_fields, cp); !fs.done(); fs.next()) { |
4168 | // skip already laid out fields |
4169 | if (fs.is_offset_set()) continue; |
4170 | |
4171 | if (fs.is_contended()) { |
4172 | bm.set_bit(fs.contended_group()); |
4173 | } |
4174 | } |
4175 | |
4176 | int current_group = -1; |
4177 | while ((current_group = (int)bm.get_next_one_offset(current_group + 1)) != (int)bm.size()) { |
4178 | |
4179 | for (AllFieldStream fs(_fields, cp); !fs.done(); fs.next()) { |
4180 | |
4181 | // skip already laid out fields |
4182 | if (fs.is_offset_set()) continue; |
4183 | |
4184 | // skip non-contended fields and fields from different group |
4185 | if (!fs.is_contended() || (fs.contended_group() != current_group)) continue; |
4186 | |
4187 | // handle statics below |
4188 | if (fs.access_flags().is_static()) continue; |
4189 | |
4190 | int real_offset = 0; |
4191 | FieldAllocationType atype = (FieldAllocationType) fs.allocation_type(); |
4192 | |
4193 | switch (atype) { |
4194 | case NONSTATIC_BYTE: |
4195 | next_nonstatic_padded_offset = align_up(next_nonstatic_padded_offset, 1); |
4196 | real_offset = next_nonstatic_padded_offset; |
4197 | next_nonstatic_padded_offset += 1; |
4198 | break; |
4199 | |
4200 | case NONSTATIC_SHORT: |
4201 | next_nonstatic_padded_offset = align_up(next_nonstatic_padded_offset, BytesPerShort); |
4202 | real_offset = next_nonstatic_padded_offset; |
4203 | next_nonstatic_padded_offset += BytesPerShort; |
4204 | break; |
4205 | |
4206 | case NONSTATIC_WORD: |
4207 | next_nonstatic_padded_offset = align_up(next_nonstatic_padded_offset, BytesPerInt); |
4208 | real_offset = next_nonstatic_padded_offset; |
4209 | next_nonstatic_padded_offset += BytesPerInt; |
4210 | break; |
4211 | |
4212 | case NONSTATIC_DOUBLE: |
4213 | next_nonstatic_padded_offset = align_up(next_nonstatic_padded_offset, BytesPerLong); |
4214 | real_offset = next_nonstatic_padded_offset; |
4215 | next_nonstatic_padded_offset += BytesPerLong; |
4216 | break; |
4217 | |
4218 | case NONSTATIC_OOP: |
4219 | next_nonstatic_padded_offset = align_up(next_nonstatic_padded_offset, heapOopSize); |
4220 | real_offset = next_nonstatic_padded_offset; |
4221 | next_nonstatic_padded_offset += heapOopSize; |
4222 | |
4223 | // Record this oop in the oop maps |
4224 | if( nonstatic_oop_map_count > 0 && |
4225 | nonstatic_oop_offsets[nonstatic_oop_map_count - 1] == |
4226 | real_offset - |
4227 | int(nonstatic_oop_counts[nonstatic_oop_map_count - 1]) * |
4228 | heapOopSize ) { |
4229 | // This oop is adjacent to the previous one, add to current oop map |
4230 | assert(nonstatic_oop_map_count - 1 < max_nonstatic_oop_maps, "range check" ); |
4231 | nonstatic_oop_counts[nonstatic_oop_map_count - 1] += 1; |
4232 | } else { |
4233 | // This oop is not adjacent to the previous one, create new oop map |
4234 | assert(nonstatic_oop_map_count < max_nonstatic_oop_maps, "range check" ); |
4235 | nonstatic_oop_offsets[nonstatic_oop_map_count] = real_offset; |
4236 | nonstatic_oop_counts [nonstatic_oop_map_count] = 1; |
4237 | nonstatic_oop_map_count += 1; |
4238 | if( first_nonstatic_oop_offset == 0 ) { // Undefined |
4239 | first_nonstatic_oop_offset = real_offset; |
4240 | } |
4241 | } |
4242 | break; |
4243 | |
4244 | default: |
4245 | ShouldNotReachHere(); |
4246 | } |
4247 | |
4248 | if (fs.contended_group() == 0) { |
4249 | // Contended group defines the equivalence class over the fields: |
4250 | // the fields within the same contended group are not inter-padded. |
4251 | // The only exception is default group, which does not incur the |
4252 | // equivalence, and so requires intra-padding. |
4253 | next_nonstatic_padded_offset += ContendedPaddingWidth; |
4254 | } |
4255 | |
4256 | fs.set_offset(real_offset); |
4257 | } // for |
4258 | |
4259 | // Start laying out the next group. |
4260 | // Note that this will effectively pad the last group in the back; |
4261 | // this is expected to alleviate memory contention effects for |
4262 | // subclass fields and/or adjacent object. |
4263 | // If this was the default group, the padding is already in place. |
4264 | if (current_group != 0) { |
4265 | next_nonstatic_padded_offset += ContendedPaddingWidth; |
4266 | } |
4267 | } |
4268 | |
4269 | // handle static fields |
4270 | } |
4271 | |
4272 | // Entire class is contended, pad in the back. |
4273 | // This helps to alleviate memory contention effects for subclass fields |
4274 | // and/or adjacent object. |
4275 | if (is_contended_class) { |
4276 | next_nonstatic_padded_offset += ContendedPaddingWidth; |
4277 | } |
4278 | |
4279 | int notaligned_nonstatic_fields_end = next_nonstatic_padded_offset; |
4280 | |
4281 | int nonstatic_fields_end = align_up(notaligned_nonstatic_fields_end, heapOopSize); |
4282 | int instance_end = align_up(notaligned_nonstatic_fields_end, wordSize); |
4283 | int static_fields_end = align_up(next_static_byte_offset, wordSize); |
4284 | |
4285 | int static_field_size = (static_fields_end - |
4286 | InstanceMirrorKlass::offset_of_static_fields()) / wordSize; |
4287 | nonstatic_field_size = nonstatic_field_size + |
4288 | (nonstatic_fields_end - nonstatic_fields_start) / heapOopSize; |
4289 | |
4290 | int instance_size = align_object_size(instance_end / wordSize); |
4291 | |
4292 | assert(instance_size == align_object_size(align_up( |
4293 | (instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize), |
4294 | wordSize) / wordSize), "consistent layout helper value" ); |
4295 | |
4296 | // Invariant: nonstatic_field end/start should only change if there are |
4297 | // nonstatic fields in the class, or if the class is contended. We compare |
4298 | // against the non-aligned value, so that end alignment will not fail the |
4299 | // assert without actually having the fields. |
4300 | assert((notaligned_nonstatic_fields_end == nonstatic_fields_start) || |
4301 | is_contended_class || |
4302 | (nonstatic_fields_count > 0), "double-check nonstatic start/end" ); |
4303 | |
4304 | // Number of non-static oop map blocks allocated at end of klass. |
4305 | const unsigned int total_oop_map_count = |
4306 | compute_oop_map_count(_super_klass, nonstatic_oop_map_count, |
4307 | first_nonstatic_oop_offset); |
4308 | |
4309 | #ifndef PRODUCT |
4310 | if (PrintFieldLayout) { |
4311 | print_field_layout(_class_name, |
4312 | _fields, |
4313 | cp, |
4314 | instance_size, |
4315 | nonstatic_fields_start, |
4316 | nonstatic_fields_end, |
4317 | static_fields_end); |
4318 | } |
4319 | |
4320 | #endif |
4321 | // Pass back information needed for InstanceKlass creation |
4322 | info->nonstatic_oop_offsets = nonstatic_oop_offsets; |
4323 | info->nonstatic_oop_counts = nonstatic_oop_counts; |
4324 | info->nonstatic_oop_map_count = nonstatic_oop_map_count; |
4325 | info->total_oop_map_count = total_oop_map_count; |
4326 | info->instance_size = instance_size; |
4327 | info->static_field_size = static_field_size; |
4328 | info->nonstatic_field_size = nonstatic_field_size; |
4329 | info->has_nonstatic_fields = has_nonstatic_fields; |
4330 | } |
4331 | |
4332 | static void fill_oop_maps(const InstanceKlass* k, |
4333 | unsigned int nonstatic_oop_map_count, |
4334 | const int* nonstatic_oop_offsets, |
4335 | const unsigned int* nonstatic_oop_counts) { |
4336 | |
4337 | assert(k != NULL, "invariant" ); |
4338 | |
4339 | OopMapBlock* this_oop_map = k->start_of_nonstatic_oop_maps(); |
4340 | const InstanceKlass* const super = k->superklass(); |
4341 | const unsigned int super_count = super ? super->nonstatic_oop_map_count() : 0; |
4342 | if (super_count > 0) { |
4343 | // Copy maps from superklass |
4344 | OopMapBlock* super_oop_map = super->start_of_nonstatic_oop_maps(); |
4345 | for (unsigned int i = 0; i < super_count; ++i) { |
4346 | *this_oop_map++ = *super_oop_map++; |
4347 | } |
4348 | } |
4349 | |
4350 | if (nonstatic_oop_map_count > 0) { |
4351 | if (super_count + nonstatic_oop_map_count > k->nonstatic_oop_map_count()) { |
4352 | // The counts differ because there is no gap between superklass's last oop |
4353 | // field and the first local oop field. Extend the last oop map copied |
4354 | // from the superklass instead of creating new one. |
4355 | nonstatic_oop_map_count--; |
4356 | nonstatic_oop_offsets++; |
4357 | this_oop_map--; |
4358 | this_oop_map->set_count(this_oop_map->count() + *nonstatic_oop_counts++); |
4359 | this_oop_map++; |
4360 | } |
4361 | |
4362 | // Add new map blocks, fill them |
4363 | while (nonstatic_oop_map_count-- > 0) { |
4364 | this_oop_map->set_offset(*nonstatic_oop_offsets++); |
4365 | this_oop_map->set_count(*nonstatic_oop_counts++); |
4366 | this_oop_map++; |
4367 | } |
4368 | assert(k->start_of_nonstatic_oop_maps() + k->nonstatic_oop_map_count() == |
4369 | this_oop_map, "sanity" ); |
4370 | } |
4371 | } |
4372 | |
4373 | |
4374 | void ClassFileParser::set_precomputed_flags(InstanceKlass* ik) { |
4375 | assert(ik != NULL, "invariant" ); |
4376 | |
4377 | const Klass* const super = ik->super(); |
4378 | |
4379 | // Check if this klass has an empty finalize method (i.e. one with return bytecode only), |
4380 | // in which case we don't have to register objects as finalizable |
4381 | if (!_has_empty_finalizer) { |
4382 | if (_has_finalizer || |
4383 | (super != NULL && super->has_finalizer())) { |
4384 | ik->set_has_finalizer(); |
4385 | } |
4386 | } |
4387 | |
4388 | #ifdef ASSERT |
4389 | bool f = false; |
4390 | const Method* const m = ik->lookup_method(vmSymbols::finalize_method_name(), |
4391 | vmSymbols::void_method_signature()); |
4392 | if (m != NULL && !m->is_empty_method()) { |
4393 | f = true; |
4394 | } |
4395 | |
4396 | // Spec doesn't prevent agent from redefinition of empty finalizer. |
4397 | // Despite the fact that it's generally bad idea and redefined finalizer |
4398 | // will not work as expected we shouldn't abort vm in this case |
4399 | if (!ik->has_redefined_this_or_super()) { |
4400 | assert(ik->has_finalizer() == f, "inconsistent has_finalizer" ); |
4401 | } |
4402 | #endif |
4403 | |
4404 | // Check if this klass supports the java.lang.Cloneable interface |
4405 | if (SystemDictionary::Cloneable_klass_loaded()) { |
4406 | if (ik->is_subtype_of(SystemDictionary::Cloneable_klass())) { |
4407 | ik->set_is_cloneable(); |
4408 | } |
4409 | } |
4410 | |
4411 | // Check if this klass has a vanilla default constructor |
4412 | if (super == NULL) { |
4413 | // java.lang.Object has empty default constructor |
4414 | ik->set_has_vanilla_constructor(); |
4415 | } else { |
4416 | if (super->has_vanilla_constructor() && |
4417 | _has_vanilla_constructor) { |
4418 | ik->set_has_vanilla_constructor(); |
4419 | } |
4420 | #ifdef ASSERT |
4421 | bool v = false; |
4422 | if (super->has_vanilla_constructor()) { |
4423 | const Method* const constructor = |
4424 | ik->find_method(vmSymbols::object_initializer_name(), |
4425 | vmSymbols::void_method_signature()); |
4426 | if (constructor != NULL && constructor->is_vanilla_constructor()) { |
4427 | v = true; |
4428 | } |
4429 | } |
4430 | assert(v == ik->has_vanilla_constructor(), "inconsistent has_vanilla_constructor" ); |
4431 | #endif |
4432 | } |
4433 | |
4434 | // If it cannot be fast-path allocated, set a bit in the layout helper. |
4435 | // See documentation of InstanceKlass::can_be_fastpath_allocated(). |
4436 | assert(ik->size_helper() > 0, "layout_helper is initialized" ); |
4437 | if ((!RegisterFinalizersAtInit && ik->has_finalizer()) |
4438 | || ik->is_abstract() || ik->is_interface() |
4439 | || (ik->name() == vmSymbols::java_lang_Class() && ik->class_loader() == NULL) |
4440 | || ik->size_helper() >= FastAllocateSizeLimit) { |
4441 | // Forbid fast-path allocation. |
4442 | const jint lh = Klass::instance_layout_helper(ik->size_helper(), true); |
4443 | ik->set_layout_helper(lh); |
4444 | } |
4445 | } |
4446 | |
4447 | // utility methods for appending an array with check for duplicates |
4448 | |
4449 | static void append_interfaces(GrowableArray<InstanceKlass*>* result, |
4450 | const Array<InstanceKlass*>* const ifs) { |
4451 | // iterate over new interfaces |
4452 | for (int i = 0; i < ifs->length(); i++) { |
4453 | InstanceKlass* const e = ifs->at(i); |
4454 | assert(e->is_klass() && e->is_interface(), "just checking" ); |
4455 | // add new interface |
4456 | result->append_if_missing(e); |
4457 | } |
4458 | } |
4459 | |
4460 | static Array<InstanceKlass*>* compute_transitive_interfaces(const InstanceKlass* super, |
4461 | Array<InstanceKlass*>* local_ifs, |
4462 | ClassLoaderData* loader_data, |
4463 | TRAPS) { |
4464 | assert(local_ifs != NULL, "invariant" ); |
4465 | assert(loader_data != NULL, "invariant" ); |
4466 | |
4467 | // Compute maximum size for transitive interfaces |
4468 | int max_transitive_size = 0; |
4469 | int super_size = 0; |
4470 | // Add superclass transitive interfaces size |
4471 | if (super != NULL) { |
4472 | super_size = super->transitive_interfaces()->length(); |
4473 | max_transitive_size += super_size; |
4474 | } |
4475 | // Add local interfaces' super interfaces |
4476 | const int local_size = local_ifs->length(); |
4477 | for (int i = 0; i < local_size; i++) { |
4478 | InstanceKlass* const l = local_ifs->at(i); |
4479 | max_transitive_size += l->transitive_interfaces()->length(); |
4480 | } |
4481 | // Finally add local interfaces |
4482 | max_transitive_size += local_size; |
4483 | // Construct array |
4484 | if (max_transitive_size == 0) { |
4485 | // no interfaces, use canonicalized array |
4486 | return Universe::the_empty_instance_klass_array(); |
4487 | } else if (max_transitive_size == super_size) { |
4488 | // no new local interfaces added, share superklass' transitive interface array |
4489 | return super->transitive_interfaces(); |
4490 | } else if (max_transitive_size == local_size) { |
4491 | // only local interfaces added, share local interface array |
4492 | return local_ifs; |
4493 | } else { |
4494 | ResourceMark rm; |
4495 | GrowableArray<InstanceKlass*>* const result = new GrowableArray<InstanceKlass*>(max_transitive_size); |
4496 | |
4497 | // Copy down from superclass |
4498 | if (super != NULL) { |
4499 | append_interfaces(result, super->transitive_interfaces()); |
4500 | } |
4501 | |
4502 | // Copy down from local interfaces' superinterfaces |
4503 | for (int i = 0; i < local_size; i++) { |
4504 | InstanceKlass* const l = local_ifs->at(i); |
4505 | append_interfaces(result, l->transitive_interfaces()); |
4506 | } |
4507 | // Finally add local interfaces |
4508 | append_interfaces(result, local_ifs); |
4509 | |
4510 | // length will be less than the max_transitive_size if duplicates were removed |
4511 | const int length = result->length(); |
4512 | assert(length <= max_transitive_size, "just checking" ); |
4513 | Array<InstanceKlass*>* const new_result = |
4514 | MetadataFactory::new_array<InstanceKlass*>(loader_data, length, CHECK_NULL); |
4515 | for (int i = 0; i < length; i++) { |
4516 | InstanceKlass* const e = result->at(i); |
4517 | assert(e != NULL, "just checking" ); |
4518 | new_result->at_put(i, e); |
4519 | } |
4520 | return new_result; |
4521 | } |
4522 | } |
4523 | |
4524 | static void check_super_class_access(const InstanceKlass* this_klass, TRAPS) { |
4525 | assert(this_klass != NULL, "invariant" ); |
4526 | const Klass* const super = this_klass->super(); |
4527 | if (super != NULL) { |
4528 | |
4529 | // If the loader is not the boot loader then throw an exception if its |
4530 | // superclass is in package jdk.internal.reflect and its loader is not a |
4531 | // special reflection class loader |
4532 | if (!this_klass->class_loader_data()->is_the_null_class_loader_data()) { |
4533 | assert(super->is_instance_klass(), "super is not instance klass" ); |
4534 | PackageEntry* super_package = super->package(); |
4535 | if (super_package != NULL && |
4536 | super_package->name()->fast_compare(vmSymbols::jdk_internal_reflect()) == 0 && |
4537 | !java_lang_ClassLoader::is_reflection_class_loader(this_klass->class_loader())) { |
4538 | ResourceMark rm(THREAD); |
4539 | Exceptions::fthrow( |
4540 | THREAD_AND_LOCATION, |
4541 | vmSymbols::java_lang_IllegalAccessError(), |
4542 | "class %s loaded by %s cannot access jdk/internal/reflect superclass %s" , |
4543 | this_klass->external_name(), |
4544 | this_klass->class_loader_data()->loader_name_and_id(), |
4545 | super->external_name()); |
4546 | return; |
4547 | } |
4548 | } |
4549 | |
4550 | Reflection::VerifyClassAccessResults vca_result = |
4551 | Reflection::verify_class_access(this_klass, InstanceKlass::cast(super), false); |
4552 | if (vca_result != Reflection::ACCESS_OK) { |
4553 | ResourceMark rm(THREAD); |
4554 | char* msg = Reflection::verify_class_access_msg(this_klass, |
4555 | InstanceKlass::cast(super), |
4556 | vca_result); |
4557 | if (msg == NULL) { |
4558 | bool same_module = (this_klass->module() == super->module()); |
4559 | Exceptions::fthrow( |
4560 | THREAD_AND_LOCATION, |
4561 | vmSymbols::java_lang_IllegalAccessError(), |
4562 | "class %s cannot access its %ssuperclass %s (%s%s%s)" , |
4563 | this_klass->external_name(), |
4564 | super->is_abstract() ? "abstract " : "" , |
4565 | super->external_name(), |
4566 | (same_module) ? this_klass->joint_in_module_of_loader(super) : this_klass->class_in_module_of_loader(), |
4567 | (same_module) ? "" : "; " , |
4568 | (same_module) ? "" : super->class_in_module_of_loader()); |
4569 | } else { |
4570 | // Add additional message content. |
4571 | Exceptions::fthrow( |
4572 | THREAD_AND_LOCATION, |
4573 | vmSymbols::java_lang_IllegalAccessError(), |
4574 | "superclass access check failed: %s" , |
4575 | msg); |
4576 | } |
4577 | } |
4578 | } |
4579 | } |
4580 | |
4581 | |
4582 | static void check_super_interface_access(const InstanceKlass* this_klass, TRAPS) { |
4583 | assert(this_klass != NULL, "invariant" ); |
4584 | const Array<InstanceKlass*>* const local_interfaces = this_klass->local_interfaces(); |
4585 | const int lng = local_interfaces->length(); |
4586 | for (int i = lng - 1; i >= 0; i--) { |
4587 | InstanceKlass* const k = local_interfaces->at(i); |
4588 | assert (k != NULL && k->is_interface(), "invalid interface" ); |
4589 | Reflection::VerifyClassAccessResults vca_result = |
4590 | Reflection::verify_class_access(this_klass, k, false); |
4591 | if (vca_result != Reflection::ACCESS_OK) { |
4592 | ResourceMark rm(THREAD); |
4593 | char* msg = Reflection::verify_class_access_msg(this_klass, |
4594 | k, |
4595 | vca_result); |
4596 | if (msg == NULL) { |
4597 | bool same_module = (this_klass->module() == k->module()); |
4598 | Exceptions::fthrow( |
4599 | THREAD_AND_LOCATION, |
4600 | vmSymbols::java_lang_IllegalAccessError(), |
4601 | "class %s cannot access its superinterface %s (%s%s%s)" , |
4602 | this_klass->external_name(), |
4603 | k->external_name(), |
4604 | (same_module) ? this_klass->joint_in_module_of_loader(k) : this_klass->class_in_module_of_loader(), |
4605 | (same_module) ? "" : "; " , |
4606 | (same_module) ? "" : k->class_in_module_of_loader()); |
4607 | } else { |
4608 | // Add additional message content. |
4609 | Exceptions::fthrow( |
4610 | THREAD_AND_LOCATION, |
4611 | vmSymbols::java_lang_IllegalAccessError(), |
4612 | "superinterface check failed: %s" , |
4613 | msg); |
4614 | } |
4615 | } |
4616 | } |
4617 | } |
4618 | |
4619 | |
4620 | static void check_final_method_override(const InstanceKlass* this_klass, TRAPS) { |
4621 | assert(this_klass != NULL, "invariant" ); |
4622 | const Array<Method*>* const methods = this_klass->methods(); |
4623 | const int num_methods = methods->length(); |
4624 | |
4625 | // go thru each method and check if it overrides a final method |
4626 | for (int index = 0; index < num_methods; index++) { |
4627 | const Method* const m = methods->at(index); |
4628 | |
4629 | // skip private, static, and <init> methods |
4630 | if ((!m->is_private() && !m->is_static()) && |
4631 | (m->name() != vmSymbols::object_initializer_name())) { |
4632 | |
4633 | const Symbol* const name = m->name(); |
4634 | const Symbol* const signature = m->signature(); |
4635 | const Klass* k = this_klass->super(); |
4636 | const Method* super_m = NULL; |
4637 | while (k != NULL) { |
4638 | // skip supers that don't have final methods. |
4639 | if (k->has_final_method()) { |
4640 | // lookup a matching method in the super class hierarchy |
4641 | super_m = InstanceKlass::cast(k)->lookup_method(name, signature); |
4642 | if (super_m == NULL) { |
4643 | break; // didn't find any match; get out |
4644 | } |
4645 | |
4646 | if (super_m->is_final() && !super_m->is_static() && |
4647 | !super_m->access_flags().is_private()) { |
4648 | // matching method in super is final, and not static or private |
4649 | bool can_access = Reflection::verify_member_access(this_klass, |
4650 | super_m->method_holder(), |
4651 | super_m->method_holder(), |
4652 | super_m->access_flags(), |
4653 | false, false, CHECK); |
4654 | if (can_access) { |
4655 | // this class can access super final method and therefore override |
4656 | ResourceMark rm(THREAD); |
4657 | Exceptions::fthrow(THREAD_AND_LOCATION, |
4658 | vmSymbols::java_lang_VerifyError(), |
4659 | "class %s overrides final method %s.%s%s" , |
4660 | this_klass->external_name(), |
4661 | super_m->method_holder()->external_name(), |
4662 | name->as_C_string(), |
4663 | signature->as_C_string() |
4664 | ); |
4665 | return; |
4666 | } |
4667 | } |
4668 | |
4669 | // continue to look from super_m's holder's super. |
4670 | k = super_m->method_holder()->super(); |
4671 | continue; |
4672 | } |
4673 | |
4674 | k = k->super(); |
4675 | } |
4676 | } |
4677 | } |
4678 | } |
4679 | |
4680 | |
4681 | // assumes that this_klass is an interface |
4682 | static void check_illegal_static_method(const InstanceKlass* this_klass, TRAPS) { |
4683 | assert(this_klass != NULL, "invariant" ); |
4684 | assert(this_klass->is_interface(), "not an interface" ); |
4685 | const Array<Method*>* methods = this_klass->methods(); |
4686 | const int num_methods = methods->length(); |
4687 | |
4688 | for (int index = 0; index < num_methods; index++) { |
4689 | const Method* const m = methods->at(index); |
4690 | // if m is static and not the init method, throw a verify error |
4691 | if ((m->is_static()) && (m->name() != vmSymbols::class_initializer_name())) { |
4692 | ResourceMark rm(THREAD); |
4693 | Exceptions::fthrow( |
4694 | THREAD_AND_LOCATION, |
4695 | vmSymbols::java_lang_VerifyError(), |
4696 | "Illegal static method %s in interface %s" , |
4697 | m->name()->as_C_string(), |
4698 | this_klass->external_name() |
4699 | ); |
4700 | return; |
4701 | } |
4702 | } |
4703 | } |
4704 | |
4705 | // utility methods for format checking |
4706 | |
4707 | void ClassFileParser::verify_legal_class_modifiers(jint flags, TRAPS) const { |
4708 | const bool is_module = (flags & JVM_ACC_MODULE) != 0; |
4709 | assert(_major_version >= JAVA_9_VERSION || !is_module, "JVM_ACC_MODULE should not be set" ); |
4710 | if (is_module) { |
4711 | ResourceMark rm(THREAD); |
4712 | Exceptions::fthrow( |
4713 | THREAD_AND_LOCATION, |
4714 | vmSymbols::java_lang_NoClassDefFoundError(), |
4715 | "%s is not a class because access_flag ACC_MODULE is set" , |
4716 | _class_name->as_C_string()); |
4717 | return; |
4718 | } |
4719 | |
4720 | if (!_need_verify) { return; } |
4721 | |
4722 | const bool is_interface = (flags & JVM_ACC_INTERFACE) != 0; |
4723 | const bool is_abstract = (flags & JVM_ACC_ABSTRACT) != 0; |
4724 | const bool is_final = (flags & JVM_ACC_FINAL) != 0; |
4725 | const bool is_super = (flags & JVM_ACC_SUPER) != 0; |
4726 | const bool is_enum = (flags & JVM_ACC_ENUM) != 0; |
4727 | const bool is_annotation = (flags & JVM_ACC_ANNOTATION) != 0; |
4728 | const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; |
4729 | |
4730 | if ((is_abstract && is_final) || |
4731 | (is_interface && !is_abstract) || |
4732 | (is_interface && major_gte_15 && (is_super || is_enum)) || |
4733 | (!is_interface && major_gte_15 && is_annotation)) { |
4734 | ResourceMark rm(THREAD); |
4735 | Exceptions::fthrow( |
4736 | THREAD_AND_LOCATION, |
4737 | vmSymbols::java_lang_ClassFormatError(), |
4738 | "Illegal class modifiers in class %s: 0x%X" , |
4739 | _class_name->as_C_string(), flags |
4740 | ); |
4741 | return; |
4742 | } |
4743 | } |
4744 | |
4745 | static bool has_illegal_visibility(jint flags) { |
4746 | const bool is_public = (flags & JVM_ACC_PUBLIC) != 0; |
4747 | const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0; |
4748 | const bool is_private = (flags & JVM_ACC_PRIVATE) != 0; |
4749 | |
4750 | return ((is_public && is_protected) || |
4751 | (is_public && is_private) || |
4752 | (is_protected && is_private)); |
4753 | } |
4754 | |
4755 | // A legal major_version.minor_version must be one of the following: |
4756 | // |
4757 | // Major_version >= 45 and major_version < 56, any minor_version. |
4758 | // Major_version >= 56 and major_version <= JVM_CLASSFILE_MAJOR_VERSION and minor_version = 0. |
4759 | // Major_version = JVM_CLASSFILE_MAJOR_VERSION and minor_version = 65535 and --enable-preview is present. |
4760 | // |
4761 | static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){ |
4762 | ResourceMark rm(THREAD); |
4763 | const u2 max_version = JVM_CLASSFILE_MAJOR_VERSION; |
4764 | if (major < JAVA_MIN_SUPPORTED_VERSION) { |
4765 | Exceptions::fthrow( |
4766 | THREAD_AND_LOCATION, |
4767 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
4768 | "%s (class file version %u.%u) was compiled with an invalid major version" , |
4769 | class_name->as_C_string(), major, minor); |
4770 | return; |
4771 | } |
4772 | |
4773 | if (major > max_version) { |
4774 | Exceptions::fthrow( |
4775 | THREAD_AND_LOCATION, |
4776 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
4777 | "%s has been compiled by a more recent version of the Java Runtime (class file version %u.%u), " |
4778 | "this version of the Java Runtime only recognizes class file versions up to %u.0" , |
4779 | class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION); |
4780 | return; |
4781 | } |
4782 | |
4783 | if (major < JAVA_12_VERSION || minor == 0) { |
4784 | return; |
4785 | } |
4786 | |
4787 | if (minor == JAVA_PREVIEW_MINOR_VERSION) { |
4788 | if (major != max_version) { |
4789 | Exceptions::fthrow( |
4790 | THREAD_AND_LOCATION, |
4791 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
4792 | "%s (class file version %u.%u) was compiled with preview features that are unsupported. " |
4793 | "This version of the Java Runtime only recognizes preview features for class file version %u.%u" , |
4794 | class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION, JAVA_PREVIEW_MINOR_VERSION); |
4795 | return; |
4796 | } |
4797 | |
4798 | if (!Arguments::enable_preview()) { |
4799 | Exceptions::fthrow( |
4800 | THREAD_AND_LOCATION, |
4801 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
4802 | "Preview features are not enabled for %s (class file version %u.%u). Try running with '--enable-preview'" , |
4803 | class_name->as_C_string(), major, minor); |
4804 | return; |
4805 | } |
4806 | |
4807 | } else { // minor != JAVA_PREVIEW_MINOR_VERSION |
4808 | Exceptions::fthrow( |
4809 | THREAD_AND_LOCATION, |
4810 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
4811 | "%s (class file version %u.%u) was compiled with an invalid non-zero minor version" , |
4812 | class_name->as_C_string(), major, minor); |
4813 | } |
4814 | } |
4815 | |
4816 | void ClassFileParser::verify_legal_field_modifiers(jint flags, |
4817 | bool is_interface, |
4818 | TRAPS) const { |
4819 | if (!_need_verify) { return; } |
4820 | |
4821 | const bool is_public = (flags & JVM_ACC_PUBLIC) != 0; |
4822 | const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0; |
4823 | const bool is_private = (flags & JVM_ACC_PRIVATE) != 0; |
4824 | const bool is_static = (flags & JVM_ACC_STATIC) != 0; |
4825 | const bool is_final = (flags & JVM_ACC_FINAL) != 0; |
4826 | const bool is_volatile = (flags & JVM_ACC_VOLATILE) != 0; |
4827 | const bool is_transient = (flags & JVM_ACC_TRANSIENT) != 0; |
4828 | const bool is_enum = (flags & JVM_ACC_ENUM) != 0; |
4829 | const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; |
4830 | |
4831 | bool is_illegal = false; |
4832 | |
4833 | if (is_interface) { |
4834 | if (!is_public || !is_static || !is_final || is_private || |
4835 | is_protected || is_volatile || is_transient || |
4836 | (major_gte_15 && is_enum)) { |
4837 | is_illegal = true; |
4838 | } |
4839 | } else { // not interface |
4840 | if (has_illegal_visibility(flags) || (is_final && is_volatile)) { |
4841 | is_illegal = true; |
4842 | } |
4843 | } |
4844 | |
4845 | if (is_illegal) { |
4846 | ResourceMark rm(THREAD); |
4847 | Exceptions::fthrow( |
4848 | THREAD_AND_LOCATION, |
4849 | vmSymbols::java_lang_ClassFormatError(), |
4850 | "Illegal field modifiers in class %s: 0x%X" , |
4851 | _class_name->as_C_string(), flags); |
4852 | return; |
4853 | } |
4854 | } |
4855 | |
4856 | void ClassFileParser::verify_legal_method_modifiers(jint flags, |
4857 | bool is_interface, |
4858 | const Symbol* name, |
4859 | TRAPS) const { |
4860 | if (!_need_verify) { return; } |
4861 | |
4862 | const bool is_public = (flags & JVM_ACC_PUBLIC) != 0; |
4863 | const bool is_private = (flags & JVM_ACC_PRIVATE) != 0; |
4864 | const bool is_static = (flags & JVM_ACC_STATIC) != 0; |
4865 | const bool is_final = (flags & JVM_ACC_FINAL) != 0; |
4866 | const bool is_native = (flags & JVM_ACC_NATIVE) != 0; |
4867 | const bool is_abstract = (flags & JVM_ACC_ABSTRACT) != 0; |
4868 | const bool is_bridge = (flags & JVM_ACC_BRIDGE) != 0; |
4869 | const bool is_strict = (flags & JVM_ACC_STRICT) != 0; |
4870 | const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0; |
4871 | const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0; |
4872 | const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; |
4873 | const bool major_gte_8 = _major_version >= JAVA_8_VERSION; |
4874 | const bool is_initializer = (name == vmSymbols::object_initializer_name()); |
4875 | |
4876 | bool is_illegal = false; |
4877 | |
4878 | if (is_interface) { |
4879 | if (major_gte_8) { |
4880 | // Class file version is JAVA_8_VERSION or later Methods of |
4881 | // interfaces may set any of the flags except ACC_PROTECTED, |
4882 | // ACC_FINAL, ACC_NATIVE, and ACC_SYNCHRONIZED; they must |
4883 | // have exactly one of the ACC_PUBLIC or ACC_PRIVATE flags set. |
4884 | if ((is_public == is_private) || /* Only one of private and public should be true - XNOR */ |
4885 | (is_native || is_protected || is_final || is_synchronized) || |
4886 | // If a specific method of a class or interface has its |
4887 | // ACC_ABSTRACT flag set, it must not have any of its |
4888 | // ACC_FINAL, ACC_NATIVE, ACC_PRIVATE, ACC_STATIC, |
4889 | // ACC_STRICT, or ACC_SYNCHRONIZED flags set. No need to |
4890 | // check for ACC_FINAL, ACC_NATIVE or ACC_SYNCHRONIZED as |
4891 | // those flags are illegal irrespective of ACC_ABSTRACT being set or not. |
4892 | (is_abstract && (is_private || is_static || is_strict))) { |
4893 | is_illegal = true; |
4894 | } |
4895 | } else if (major_gte_15) { |
4896 | // Class file version in the interval [JAVA_1_5_VERSION, JAVA_8_VERSION) |
4897 | if (!is_public || is_private || is_protected || is_static || is_final || |
4898 | is_synchronized || is_native || !is_abstract || is_strict) { |
4899 | is_illegal = true; |
4900 | } |
4901 | } else { |
4902 | // Class file version is pre-JAVA_1_5_VERSION |
4903 | if (!is_public || is_static || is_final || is_native || !is_abstract) { |
4904 | is_illegal = true; |
4905 | } |
4906 | } |
4907 | } else { // not interface |
4908 | if (has_illegal_visibility(flags)) { |
4909 | is_illegal = true; |
4910 | } else { |
4911 | if (is_initializer) { |
4912 | if (is_static || is_final || is_synchronized || is_native || |
4913 | is_abstract || (major_gte_15 && is_bridge)) { |
4914 | is_illegal = true; |
4915 | } |
4916 | } else { // not initializer |
4917 | if (is_abstract) { |
4918 | if ((is_final || is_native || is_private || is_static || |
4919 | (major_gte_15 && (is_synchronized || is_strict)))) { |
4920 | is_illegal = true; |
4921 | } |
4922 | } |
4923 | } |
4924 | } |
4925 | } |
4926 | |
4927 | if (is_illegal) { |
4928 | ResourceMark rm(THREAD); |
4929 | Exceptions::fthrow( |
4930 | THREAD_AND_LOCATION, |
4931 | vmSymbols::java_lang_ClassFormatError(), |
4932 | "Method %s in class %s has illegal modifiers: 0x%X" , |
4933 | name->as_C_string(), _class_name->as_C_string(), flags); |
4934 | return; |
4935 | } |
4936 | } |
4937 | |
4938 | void ClassFileParser::verify_legal_utf8(const unsigned char* buffer, |
4939 | int length, |
4940 | TRAPS) const { |
4941 | assert(_need_verify, "only called when _need_verify is true" ); |
4942 | if (!UTF8::is_legal_utf8(buffer, length, _major_version <= 47)) { |
4943 | classfile_parse_error("Illegal UTF8 string in constant pool in class file %s" , CHECK); |
4944 | } |
4945 | } |
4946 | |
4947 | // Unqualified names may not contain the characters '.', ';', '[', or '/'. |
4948 | // In class names, '/' separates unqualified names. This is verified in this function also. |
4949 | // Method names also may not contain the characters '<' or '>', unless <init> |
4950 | // or <clinit>. Note that method names may not be <init> or <clinit> in this |
4951 | // method. Because these names have been checked as special cases before |
4952 | // calling this method in verify_legal_method_name. |
4953 | // |
4954 | // This method is also called from the modular system APIs in modules.cpp |
4955 | // to verify the validity of module and package names. |
4956 | bool ClassFileParser::verify_unqualified_name(const char* name, |
4957 | unsigned int length, |
4958 | int type) { |
4959 | if (length == 0) return false; // Must have at least one char. |
4960 | for (const char* p = name; p != name + length; p++) { |
4961 | switch(*p) { |
4962 | case '.': |
4963 | case ';': |
4964 | case '[': |
4965 | // do not permit '.', ';', or '[' |
4966 | return false; |
4967 | case '/': |
4968 | // check for '//' or leading or trailing '/' which are not legal |
4969 | // unqualified name must not be empty |
4970 | if (type == ClassFileParser::LegalClass) { |
4971 | if (p == name || p+1 >= name+length || *(p+1) == '/') { |
4972 | return false; |
4973 | } |
4974 | } else { |
4975 | return false; // do not permit '/' unless it's class name |
4976 | } |
4977 | break; |
4978 | case '<': |
4979 | case '>': |
4980 | // do not permit '<' or '>' in method names |
4981 | if (type == ClassFileParser::LegalMethod) { |
4982 | return false; |
4983 | } |
4984 | } |
4985 | } |
4986 | return true; |
4987 | } |
4988 | |
4989 | // Take pointer to a UTF8 byte string (not NUL-terminated). |
4990 | // Skip over the longest part of the string that could |
4991 | // be taken as a fieldname. Allow '/' if slash_ok is true. |
4992 | // Return a pointer to just past the fieldname. |
4993 | // Return NULL if no fieldname at all was found, or in the case of slash_ok |
4994 | // being true, we saw consecutive slashes (meaning we were looking for a |
4995 | // qualified path but found something that was badly-formed). |
4996 | static const char* skip_over_field_name(const char* const name, |
4997 | bool slash_ok, |
4998 | unsigned int length) { |
4999 | const char* p; |
5000 | jboolean last_is_slash = false; |
5001 | jboolean not_first_ch = false; |
5002 | |
5003 | for (p = name; p != name + length; not_first_ch = true) { |
5004 | const char* old_p = p; |
5005 | jchar ch = *p; |
5006 | if (ch < 128) { |
5007 | p++; |
5008 | // quick check for ascii |
5009 | if ((ch >= 'a' && ch <= 'z') || |
5010 | (ch >= 'A' && ch <= 'Z') || |
5011 | (ch == '_' || ch == '$') || |
5012 | (not_first_ch && ch >= '0' && ch <= '9')) { |
5013 | last_is_slash = false; |
5014 | continue; |
5015 | } |
5016 | if (slash_ok && ch == '/') { |
5017 | if (last_is_slash) { |
5018 | return NULL; // Don't permit consecutive slashes |
5019 | } |
5020 | last_is_slash = true; |
5021 | continue; |
5022 | } |
5023 | } |
5024 | else { |
5025 | jint unicode_ch; |
5026 | char* tmp_p = UTF8::next_character(p, &unicode_ch); |
5027 | p = tmp_p; |
5028 | last_is_slash = false; |
5029 | // Check if ch is Java identifier start or is Java identifier part |
5030 | // 4672820: call java.lang.Character methods directly without generating separate tables. |
5031 | EXCEPTION_MARK; |
5032 | // return value |
5033 | JavaValue result(T_BOOLEAN); |
5034 | // Set up the arguments to isJavaIdentifierStart or isJavaIdentifierPart |
5035 | JavaCallArguments args; |
5036 | args.push_int(unicode_ch); |
5037 | |
5038 | if (not_first_ch) { |
5039 | // public static boolean isJavaIdentifierPart(char ch); |
5040 | JavaCalls::call_static(&result, |
5041 | SystemDictionary::Character_klass(), |
5042 | vmSymbols::isJavaIdentifierPart_name(), |
5043 | vmSymbols::int_bool_signature(), |
5044 | &args, |
5045 | THREAD); |
5046 | } else { |
5047 | // public static boolean isJavaIdentifierStart(char ch); |
5048 | JavaCalls::call_static(&result, |
5049 | SystemDictionary::Character_klass(), |
5050 | vmSymbols::isJavaIdentifierStart_name(), |
5051 | vmSymbols::int_bool_signature(), |
5052 | &args, |
5053 | THREAD); |
5054 | } |
5055 | if (HAS_PENDING_EXCEPTION) { |
5056 | CLEAR_PENDING_EXCEPTION; |
5057 | return NULL; |
5058 | } |
5059 | if(result.get_jboolean()) { |
5060 | continue; |
5061 | } |
5062 | } |
5063 | return (not_first_ch) ? old_p : NULL; |
5064 | } |
5065 | return (not_first_ch) ? p : NULL; |
5066 | } |
5067 | |
5068 | // Take pointer to a UTF8 byte string (not NUL-terminated). |
5069 | // Skip over the longest part of the string that could |
5070 | // be taken as a field signature. Allow "void" if void_ok. |
5071 | // Return a pointer to just past the signature. |
5072 | // Return NULL if no legal signature is found. |
5073 | const char* ClassFileParser::skip_over_field_signature(const char* signature, |
5074 | bool void_ok, |
5075 | unsigned int length, |
5076 | TRAPS) const { |
5077 | unsigned int array_dim = 0; |
5078 | while (length > 0) { |
5079 | switch (signature[0]) { |
5080 | case JVM_SIGNATURE_VOID: if (!void_ok) { return NULL; } |
5081 | case JVM_SIGNATURE_BOOLEAN: |
5082 | case JVM_SIGNATURE_BYTE: |
5083 | case JVM_SIGNATURE_CHAR: |
5084 | case JVM_SIGNATURE_SHORT: |
5085 | case JVM_SIGNATURE_INT: |
5086 | case JVM_SIGNATURE_FLOAT: |
5087 | case JVM_SIGNATURE_LONG: |
5088 | case JVM_SIGNATURE_DOUBLE: |
5089 | return signature + 1; |
5090 | case JVM_SIGNATURE_CLASS: { |
5091 | if (_major_version < JAVA_1_5_VERSION) { |
5092 | // Skip over the class name if one is there |
5093 | const char* const p = skip_over_field_name(signature + 1, true, --length); |
5094 | |
5095 | // The next character better be a semicolon |
5096 | if (p && (p - signature) > 1 && p[0] == ';') { |
5097 | return p + 1; |
5098 | } |
5099 | } |
5100 | else { |
5101 | // Skip leading 'L' and ignore first appearance of ';' |
5102 | signature++; |
5103 | const char* c = (const char*) memchr(signature, ';', length - 1); |
5104 | // Format check signature |
5105 | if (c != NULL) { |
5106 | int newlen = c - (char*) signature; |
5107 | bool legal = verify_unqualified_name(signature, newlen, LegalClass); |
5108 | if (!legal) { |
5109 | classfile_parse_error("Class name is empty or contains illegal character " |
5110 | "in descriptor in class file %s" , |
5111 | CHECK_0); |
5112 | return NULL; |
5113 | } |
5114 | return signature + newlen + 1; |
5115 | } |
5116 | } |
5117 | return NULL; |
5118 | } |
5119 | case JVM_SIGNATURE_ARRAY: |
5120 | array_dim++; |
5121 | if (array_dim > 255) { |
5122 | // 4277370: array descriptor is valid only if it represents 255 or fewer dimensions. |
5123 | classfile_parse_error("Array type descriptor has more than 255 dimensions in class file %s" , CHECK_0); |
5124 | } |
5125 | // The rest of what's there better be a legal signature |
5126 | signature++; |
5127 | length--; |
5128 | void_ok = false; |
5129 | break; |
5130 | default: |
5131 | return NULL; |
5132 | } |
5133 | } |
5134 | return NULL; |
5135 | } |
5136 | |
5137 | // Checks if name is a legal class name. |
5138 | void ClassFileParser::verify_legal_class_name(const Symbol* name, TRAPS) const { |
5139 | if (!_need_verify || _relax_verify) { return; } |
5140 | |
5141 | assert(name->refcount() > 0, "symbol must be kept alive" ); |
5142 | char* bytes = (char*)name->bytes(); |
5143 | unsigned int length = name->utf8_length(); |
5144 | bool legal = false; |
5145 | |
5146 | if (length > 0) { |
5147 | const char* p; |
5148 | if (bytes[0] == JVM_SIGNATURE_ARRAY) { |
5149 | p = skip_over_field_signature(bytes, false, length, CHECK); |
5150 | legal = (p != NULL) && ((p - bytes) == (int)length); |
5151 | } else if (_major_version < JAVA_1_5_VERSION) { |
5152 | if (bytes[0] != '<') { |
5153 | p = skip_over_field_name(bytes, true, length); |
5154 | legal = (p != NULL) && ((p - bytes) == (int)length); |
5155 | } |
5156 | } else { |
5157 | // 4900761: relax the constraints based on JSR202 spec |
5158 | // Class names may be drawn from the entire Unicode character set. |
5159 | // Identifiers between '/' must be unqualified names. |
5160 | // The utf8 string has been verified when parsing cpool entries. |
5161 | legal = verify_unqualified_name(bytes, length, LegalClass); |
5162 | } |
5163 | } |
5164 | if (!legal) { |
5165 | ResourceMark rm(THREAD); |
5166 | assert(_class_name != NULL, "invariant" ); |
5167 | Exceptions::fthrow( |
5168 | THREAD_AND_LOCATION, |
5169 | vmSymbols::java_lang_ClassFormatError(), |
5170 | "Illegal class name \"%.*s\" in class file %s" , length, bytes, |
5171 | _class_name->as_C_string() |
5172 | ); |
5173 | return; |
5174 | } |
5175 | } |
5176 | |
5177 | // Checks if name is a legal field name. |
5178 | void ClassFileParser::verify_legal_field_name(const Symbol* name, TRAPS) const { |
5179 | if (!_need_verify || _relax_verify) { return; } |
5180 | |
5181 | char* bytes = (char*)name->bytes(); |
5182 | unsigned int length = name->utf8_length(); |
5183 | bool legal = false; |
5184 | |
5185 | if (length > 0) { |
5186 | if (_major_version < JAVA_1_5_VERSION) { |
5187 | if (bytes[0] != '<') { |
5188 | const char* p = skip_over_field_name(bytes, false, length); |
5189 | legal = (p != NULL) && ((p - bytes) == (int)length); |
5190 | } |
5191 | } else { |
5192 | // 4881221: relax the constraints based on JSR202 spec |
5193 | legal = verify_unqualified_name(bytes, length, LegalField); |
5194 | } |
5195 | } |
5196 | |
5197 | if (!legal) { |
5198 | ResourceMark rm(THREAD); |
5199 | assert(_class_name != NULL, "invariant" ); |
5200 | Exceptions::fthrow( |
5201 | THREAD_AND_LOCATION, |
5202 | vmSymbols::java_lang_ClassFormatError(), |
5203 | "Illegal field name \"%.*s\" in class %s" , length, bytes, |
5204 | _class_name->as_C_string() |
5205 | ); |
5206 | return; |
5207 | } |
5208 | } |
5209 | |
5210 | // Checks if name is a legal method name. |
5211 | void ClassFileParser::verify_legal_method_name(const Symbol* name, TRAPS) const { |
5212 | if (!_need_verify || _relax_verify) { return; } |
5213 | |
5214 | assert(name != NULL, "method name is null" ); |
5215 | char* bytes = (char*)name->bytes(); |
5216 | unsigned int length = name->utf8_length(); |
5217 | bool legal = false; |
5218 | |
5219 | if (length > 0) { |
5220 | if (bytes[0] == '<') { |
5221 | if (name == vmSymbols::object_initializer_name() || name == vmSymbols::class_initializer_name()) { |
5222 | legal = true; |
5223 | } |
5224 | } else if (_major_version < JAVA_1_5_VERSION) { |
5225 | const char* p; |
5226 | p = skip_over_field_name(bytes, false, length); |
5227 | legal = (p != NULL) && ((p - bytes) == (int)length); |
5228 | } else { |
5229 | // 4881221: relax the constraints based on JSR202 spec |
5230 | legal = verify_unqualified_name(bytes, length, LegalMethod); |
5231 | } |
5232 | } |
5233 | |
5234 | if (!legal) { |
5235 | ResourceMark rm(THREAD); |
5236 | assert(_class_name != NULL, "invariant" ); |
5237 | Exceptions::fthrow( |
5238 | THREAD_AND_LOCATION, |
5239 | vmSymbols::java_lang_ClassFormatError(), |
5240 | "Illegal method name \"%.*s\" in class %s" , length, bytes, |
5241 | _class_name->as_C_string() |
5242 | ); |
5243 | return; |
5244 | } |
5245 | } |
5246 | |
5247 | |
5248 | // Checks if signature is a legal field signature. |
5249 | void ClassFileParser::verify_legal_field_signature(const Symbol* name, |
5250 | const Symbol* signature, |
5251 | TRAPS) const { |
5252 | if (!_need_verify) { return; } |
5253 | |
5254 | const char* const bytes = (const char* const)signature->bytes(); |
5255 | const unsigned int length = signature->utf8_length(); |
5256 | const char* const p = skip_over_field_signature(bytes, false, length, CHECK); |
5257 | |
5258 | if (p == NULL || (p - bytes) != (int)length) { |
5259 | throwIllegalSignature("Field" , name, signature, CHECK); |
5260 | } |
5261 | } |
5262 | |
5263 | // Checks if signature is a legal method signature. |
5264 | // Returns number of parameters |
5265 | int ClassFileParser::verify_legal_method_signature(const Symbol* name, |
5266 | const Symbol* signature, |
5267 | TRAPS) const { |
5268 | if (!_need_verify) { |
5269 | // make sure caller's args_size will be less than 0 even for non-static |
5270 | // method so it will be recomputed in compute_size_of_parameters(). |
5271 | return -2; |
5272 | } |
5273 | |
5274 | // Class initializers cannot have args for class format version >= 51. |
5275 | if (name == vmSymbols::class_initializer_name() && |
5276 | signature != vmSymbols::void_method_signature() && |
5277 | _major_version >= JAVA_7_VERSION) { |
5278 | throwIllegalSignature("Method" , name, signature, CHECK_0); |
5279 | return 0; |
5280 | } |
5281 | |
5282 | unsigned int args_size = 0; |
5283 | const char* p = (const char*)signature->bytes(); |
5284 | unsigned int length = signature->utf8_length(); |
5285 | const char* nextp; |
5286 | |
5287 | // The first character must be a '(' |
5288 | if ((length > 0) && (*p++ == JVM_SIGNATURE_FUNC)) { |
5289 | length--; |
5290 | // Skip over legal field signatures |
5291 | nextp = skip_over_field_signature(p, false, length, CHECK_0); |
5292 | while ((length > 0) && (nextp != NULL)) { |
5293 | args_size++; |
5294 | if (p[0] == 'J' || p[0] == 'D') { |
5295 | args_size++; |
5296 | } |
5297 | length -= nextp - p; |
5298 | p = nextp; |
5299 | nextp = skip_over_field_signature(p, false, length, CHECK_0); |
5300 | } |
5301 | // The first non-signature thing better be a ')' |
5302 | if ((length > 0) && (*p++ == JVM_SIGNATURE_ENDFUNC)) { |
5303 | length--; |
5304 | if (name->utf8_length() > 0 && name->char_at(0) == '<') { |
5305 | // All internal methods must return void |
5306 | if ((length == 1) && (p[0] == JVM_SIGNATURE_VOID)) { |
5307 | return args_size; |
5308 | } |
5309 | } else { |
5310 | // Now we better just have a return value |
5311 | nextp = skip_over_field_signature(p, true, length, CHECK_0); |
5312 | if (nextp && ((int)length == (nextp - p))) { |
5313 | return args_size; |
5314 | } |
5315 | } |
5316 | } |
5317 | } |
5318 | // Report error |
5319 | throwIllegalSignature("Method" , name, signature, CHECK_0); |
5320 | return 0; |
5321 | } |
5322 | |
5323 | int ClassFileParser::static_field_size() const { |
5324 | assert(_field_info != NULL, "invariant" ); |
5325 | return _field_info->static_field_size; |
5326 | } |
5327 | |
5328 | int ClassFileParser::total_oop_map_count() const { |
5329 | assert(_field_info != NULL, "invariant" ); |
5330 | return _field_info->total_oop_map_count; |
5331 | } |
5332 | |
5333 | jint ClassFileParser::layout_size() const { |
5334 | assert(_field_info != NULL, "invariant" ); |
5335 | return _field_info->instance_size; |
5336 | } |
5337 | |
5338 | static void check_methods_for_intrinsics(const InstanceKlass* ik, |
5339 | const Array<Method*>* methods) { |
5340 | assert(ik != NULL, "invariant" ); |
5341 | assert(methods != NULL, "invariant" ); |
5342 | |
5343 | // Set up Method*::intrinsic_id as soon as we know the names of methods. |
5344 | // (We used to do this lazily, but now we query it in Rewriter, |
5345 | // which is eagerly done for every method, so we might as well do it now, |
5346 | // when everything is fresh in memory.) |
5347 | const vmSymbols::SID klass_id = Method::klass_id_for_intrinsics(ik); |
5348 | |
5349 | if (klass_id != vmSymbols::NO_SID) { |
5350 | for (int j = 0; j < methods->length(); ++j) { |
5351 | Method* method = methods->at(j); |
5352 | method->init_intrinsic_id(); |
5353 | |
5354 | if (CheckIntrinsics) { |
5355 | // Check if an intrinsic is defined for method 'method', |
5356 | // but the method is not annotated with @HotSpotIntrinsicCandidate. |
5357 | if (method->intrinsic_id() != vmIntrinsics::_none && |
5358 | !method->intrinsic_candidate()) { |
5359 | tty->print("Compiler intrinsic is defined for method [%s], " |
5360 | "but the method is not annotated with @HotSpotIntrinsicCandidate.%s" , |
5361 | method->name_and_sig_as_C_string(), |
5362 | NOT_DEBUG(" Method will not be inlined." ) DEBUG_ONLY(" Exiting." ) |
5363 | ); |
5364 | tty->cr(); |
5365 | DEBUG_ONLY(vm_exit(1)); |
5366 | } |
5367 | // Check is the method 'method' is annotated with @HotSpotIntrinsicCandidate, |
5368 | // but there is no intrinsic available for it. |
5369 | if (method->intrinsic_candidate() && |
5370 | method->intrinsic_id() == vmIntrinsics::_none) { |
5371 | tty->print("Method [%s] is annotated with @HotSpotIntrinsicCandidate, " |
5372 | "but no compiler intrinsic is defined for the method.%s" , |
5373 | method->name_and_sig_as_C_string(), |
5374 | NOT_DEBUG("" ) DEBUG_ONLY(" Exiting." ) |
5375 | ); |
5376 | tty->cr(); |
5377 | DEBUG_ONLY(vm_exit(1)); |
5378 | } |
5379 | } |
5380 | } // end for |
5381 | |
5382 | #ifdef ASSERT |
5383 | if (CheckIntrinsics) { |
5384 | // Check for orphan methods in the current class. A method m |
5385 | // of a class C is orphan if an intrinsic is defined for method m, |
5386 | // but class C does not declare m. |
5387 | // The check is potentially expensive, therefore it is available |
5388 | // only in debug builds. |
5389 | |
5390 | for (int id = vmIntrinsics::FIRST_ID; id < (int)vmIntrinsics::ID_LIMIT; ++id) { |
5391 | if (vmIntrinsics::_compiledLambdaForm == id) { |
5392 | // The _compiledLamdbdaForm intrinsic is a special marker for bytecode |
5393 | // generated for the JVM from a LambdaForm and therefore no method |
5394 | // is defined for it. |
5395 | continue; |
5396 | } |
5397 | |
5398 | if (vmIntrinsics::class_for(vmIntrinsics::ID_from(id)) == klass_id) { |
5399 | // Check if the current class contains a method with the same |
5400 | // name, flags, signature. |
5401 | bool match = false; |
5402 | for (int j = 0; j < methods->length(); ++j) { |
5403 | const Method* method = methods->at(j); |
5404 | if (method->intrinsic_id() == id) { |
5405 | match = true; |
5406 | break; |
5407 | } |
5408 | } |
5409 | |
5410 | if (!match) { |
5411 | char buf[1000]; |
5412 | tty->print("Compiler intrinsic is defined for method [%s], " |
5413 | "but the method is not available in class [%s].%s" , |
5414 | vmIntrinsics::short_name_as_C_string(vmIntrinsics::ID_from(id), |
5415 | buf, sizeof(buf)), |
5416 | ik->name()->as_C_string(), |
5417 | NOT_DEBUG("" ) DEBUG_ONLY(" Exiting." ) |
5418 | ); |
5419 | tty->cr(); |
5420 | DEBUG_ONLY(vm_exit(1)); |
5421 | } |
5422 | } |
5423 | } // end for |
5424 | } // CheckIntrinsics |
5425 | #endif // ASSERT |
5426 | } |
5427 | } |
5428 | |
5429 | InstanceKlass* ClassFileParser::create_instance_klass(bool changed_by_loadhook, TRAPS) { |
5430 | if (_klass != NULL) { |
5431 | return _klass; |
5432 | } |
5433 | |
5434 | InstanceKlass* const ik = |
5435 | InstanceKlass::allocate_instance_klass(*this, CHECK_NULL); |
5436 | |
5437 | fill_instance_klass(ik, changed_by_loadhook, CHECK_NULL); |
5438 | |
5439 | assert(_klass == ik, "invariant" ); |
5440 | |
5441 | |
5442 | if (ik->should_store_fingerprint()) { |
5443 | ik->store_fingerprint(_stream->compute_fingerprint()); |
5444 | } |
5445 | |
5446 | ik->set_has_passed_fingerprint_check(false); |
5447 | if (UseAOT && ik->supers_have_passed_fingerprint_checks()) { |
5448 | uint64_t aot_fp = AOTLoader::get_saved_fingerprint(ik); |
5449 | uint64_t fp = ik->has_stored_fingerprint() ? ik->get_stored_fingerprint() : _stream->compute_fingerprint(); |
5450 | if (aot_fp != 0 && aot_fp == fp) { |
5451 | // This class matches with a class saved in an AOT library |
5452 | ik->set_has_passed_fingerprint_check(true); |
5453 | } else { |
5454 | ResourceMark rm; |
5455 | log_info(class, fingerprint)("%s : expected = " PTR64_FORMAT " actual = " PTR64_FORMAT, |
5456 | ik->external_name(), aot_fp, _stream->compute_fingerprint()); |
5457 | } |
5458 | } |
5459 | |
5460 | return ik; |
5461 | } |
5462 | |
5463 | void ClassFileParser::fill_instance_klass(InstanceKlass* ik, bool changed_by_loadhook, TRAPS) { |
5464 | assert(ik != NULL, "invariant" ); |
5465 | |
5466 | // Set name and CLD before adding to CLD |
5467 | ik->set_class_loader_data(_loader_data); |
5468 | ik->set_name(_class_name); |
5469 | |
5470 | // Add all classes to our internal class loader list here, |
5471 | // including classes in the bootstrap (NULL) class loader. |
5472 | const bool publicize = !is_internal(); |
5473 | |
5474 | _loader_data->add_class(ik, publicize); |
5475 | |
5476 | set_klass_to_deallocate(ik); |
5477 | |
5478 | assert(_field_info != NULL, "invariant" ); |
5479 | assert(ik->static_field_size() == _field_info->static_field_size, "sanity" ); |
5480 | assert(ik->nonstatic_oop_map_count() == _field_info->total_oop_map_count, |
5481 | "sanity" ); |
5482 | |
5483 | assert(ik->is_instance_klass(), "sanity" ); |
5484 | assert(ik->size_helper() == _field_info->instance_size, "sanity" ); |
5485 | |
5486 | // Fill in information already parsed |
5487 | ik->set_should_verify_class(_need_verify); |
5488 | |
5489 | // Not yet: supers are done below to support the new subtype-checking fields |
5490 | ik->set_nonstatic_field_size(_field_info->nonstatic_field_size); |
5491 | ik->set_has_nonstatic_fields(_field_info->has_nonstatic_fields); |
5492 | assert(_fac != NULL, "invariant" ); |
5493 | ik->set_static_oop_field_count(_fac->count[STATIC_OOP]); |
5494 | |
5495 | // this transfers ownership of a lot of arrays from |
5496 | // the parser onto the InstanceKlass* |
5497 | apply_parsed_class_metadata(ik, _java_fields_count, CHECK); |
5498 | |
5499 | // note that is not safe to use the fields in the parser from this point on |
5500 | assert(NULL == _cp, "invariant" ); |
5501 | assert(NULL == _fields, "invariant" ); |
5502 | assert(NULL == _methods, "invariant" ); |
5503 | assert(NULL == _inner_classes, "invariant" ); |
5504 | assert(NULL == _nest_members, "invariant" ); |
5505 | assert(NULL == _local_interfaces, "invariant" ); |
5506 | assert(NULL == _combined_annotations, "invariant" ); |
5507 | |
5508 | if (_has_final_method) { |
5509 | ik->set_has_final_method(); |
5510 | } |
5511 | |
5512 | ik->copy_method_ordering(_method_ordering, CHECK); |
5513 | // The InstanceKlass::_methods_jmethod_ids cache |
5514 | // is managed on the assumption that the initial cache |
5515 | // size is equal to the number of methods in the class. If |
5516 | // that changes, then InstanceKlass::idnum_can_increment() |
5517 | // has to be changed accordingly. |
5518 | ik->set_initial_method_idnum(ik->methods()->length()); |
5519 | |
5520 | ik->set_this_class_index(_this_class_index); |
5521 | |
5522 | if (is_unsafe_anonymous()) { |
5523 | // _this_class_index is a CONSTANT_Class entry that refers to this |
5524 | // anonymous class itself. If this class needs to refer to its own methods or |
5525 | // fields, it would use a CONSTANT_MethodRef, etc, which would reference |
5526 | // _this_class_index. However, because this class is anonymous (it's |
5527 | // not stored in SystemDictionary), _this_class_index cannot be resolved |
5528 | // with ConstantPool::klass_at_impl, which does a SystemDictionary lookup. |
5529 | // Therefore, we must eagerly resolve _this_class_index now. |
5530 | ik->constants()->klass_at_put(_this_class_index, ik); |
5531 | } |
5532 | |
5533 | ik->set_minor_version(_minor_version); |
5534 | ik->set_major_version(_major_version); |
5535 | ik->set_has_nonstatic_concrete_methods(_has_nonstatic_concrete_methods); |
5536 | ik->set_declares_nonstatic_concrete_methods(_declares_nonstatic_concrete_methods); |
5537 | |
5538 | if (_unsafe_anonymous_host != NULL) { |
5539 | assert (ik->is_unsafe_anonymous(), "should be the same" ); |
5540 | ik->set_unsafe_anonymous_host(_unsafe_anonymous_host); |
5541 | } |
5542 | |
5543 | // Set PackageEntry for this_klass |
5544 | oop cl = ik->class_loader(); |
5545 | Handle clh = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(cl)); |
5546 | ClassLoaderData* cld = ClassLoaderData::class_loader_data_or_null(clh()); |
5547 | ik->set_package(cld, CHECK); |
5548 | |
5549 | const Array<Method*>* const methods = ik->methods(); |
5550 | assert(methods != NULL, "invariant" ); |
5551 | const int methods_len = methods->length(); |
5552 | |
5553 | check_methods_for_intrinsics(ik, methods); |
5554 | |
5555 | // Fill in field values obtained by parse_classfile_attributes |
5556 | if (_parsed_annotations->has_any_annotations()) { |
5557 | _parsed_annotations->apply_to(ik); |
5558 | } |
5559 | |
5560 | apply_parsed_class_attributes(ik); |
5561 | |
5562 | // Miranda methods |
5563 | if ((_num_miranda_methods > 0) || |
5564 | // if this class introduced new miranda methods or |
5565 | (_super_klass != NULL && _super_klass->has_miranda_methods()) |
5566 | // super class exists and this class inherited miranda methods |
5567 | ) { |
5568 | ik->set_has_miranda_methods(); // then set a flag |
5569 | } |
5570 | |
5571 | // Fill in information needed to compute superclasses. |
5572 | ik->initialize_supers(const_cast<InstanceKlass*>(_super_klass), _transitive_interfaces, CHECK); |
5573 | ik->set_transitive_interfaces(_transitive_interfaces); |
5574 | _transitive_interfaces = NULL; |
5575 | |
5576 | // Initialize itable offset tables |
5577 | klassItable::setup_itable_offset_table(ik); |
5578 | |
5579 | // Compute transitive closure of interfaces this class implements |
5580 | // Do final class setup |
5581 | fill_oop_maps(ik, |
5582 | _field_info->nonstatic_oop_map_count, |
5583 | _field_info->nonstatic_oop_offsets, |
5584 | _field_info->nonstatic_oop_counts); |
5585 | |
5586 | // Fill in has_finalizer, has_vanilla_constructor, and layout_helper |
5587 | set_precomputed_flags(ik); |
5588 | |
5589 | // check if this class can access its super class |
5590 | check_super_class_access(ik, CHECK); |
5591 | |
5592 | // check if this class can access its superinterfaces |
5593 | check_super_interface_access(ik, CHECK); |
5594 | |
5595 | // check if this class overrides any final method |
5596 | check_final_method_override(ik, CHECK); |
5597 | |
5598 | // reject static interface methods prior to Java 8 |
5599 | if (ik->is_interface() && _major_version < JAVA_8_VERSION) { |
5600 | check_illegal_static_method(ik, CHECK); |
5601 | } |
5602 | |
5603 | // Obtain this_klass' module entry |
5604 | ModuleEntry* module_entry = ik->module(); |
5605 | assert(module_entry != NULL, "module_entry should always be set" ); |
5606 | |
5607 | // Obtain java.lang.Module |
5608 | Handle module_handle(THREAD, module_entry->module()); |
5609 | |
5610 | // Allocate mirror and initialize static fields |
5611 | // The create_mirror() call will also call compute_modifiers() |
5612 | java_lang_Class::create_mirror(ik, |
5613 | Handle(THREAD, _loader_data->class_loader()), |
5614 | module_handle, |
5615 | _protection_domain, |
5616 | CHECK); |
5617 | |
5618 | assert(_all_mirandas != NULL, "invariant" ); |
5619 | |
5620 | // Generate any default methods - default methods are public interface methods |
5621 | // that have a default implementation. This is new with Java 8. |
5622 | if (_has_nonstatic_concrete_methods) { |
5623 | DefaultMethods::generate_default_methods(ik, |
5624 | _all_mirandas, |
5625 | CHECK); |
5626 | } |
5627 | |
5628 | // Add read edges to the unnamed modules of the bootstrap and app class loaders. |
5629 | if (changed_by_loadhook && !module_handle.is_null() && module_entry->is_named() && |
5630 | !module_entry->has_default_read_edges()) { |
5631 | if (!module_entry->set_has_default_read_edges()) { |
5632 | // We won a potential race |
5633 | JvmtiExport::add_default_read_edges(module_handle, THREAD); |
5634 | } |
5635 | } |
5636 | |
5637 | ClassLoadingService::notify_class_loaded(ik, false /* not shared class */); |
5638 | |
5639 | if (!is_internal()) { |
5640 | if (log_is_enabled(Info, class, load)) { |
5641 | ResourceMark rm; |
5642 | const char* module_name = (module_entry->name() == NULL) ? UNNAMED_MODULE : module_entry->name()->as_C_string(); |
5643 | ik->print_class_load_logging(_loader_data, module_name, _stream); |
5644 | } |
5645 | |
5646 | if (ik->minor_version() == JAVA_PREVIEW_MINOR_VERSION && |
5647 | ik->major_version() == JVM_CLASSFILE_MAJOR_VERSION && |
5648 | log_is_enabled(Info, class, preview)) { |
5649 | ResourceMark rm; |
5650 | log_info(class, preview)("Loading class %s that depends on preview features (class file version %d.65535)" , |
5651 | ik->external_name(), JVM_CLASSFILE_MAJOR_VERSION); |
5652 | } |
5653 | |
5654 | if (log_is_enabled(Debug, class, resolve)) { |
5655 | ResourceMark rm; |
5656 | // print out the superclass. |
5657 | const char * from = ik->external_name(); |
5658 | if (ik->java_super() != NULL) { |
5659 | log_debug(class, resolve)("%s %s (super)" , |
5660 | from, |
5661 | ik->java_super()->external_name()); |
5662 | } |
5663 | // print out each of the interface classes referred to by this class. |
5664 | const Array<InstanceKlass*>* const local_interfaces = ik->local_interfaces(); |
5665 | if (local_interfaces != NULL) { |
5666 | const int length = local_interfaces->length(); |
5667 | for (int i = 0; i < length; i++) { |
5668 | const InstanceKlass* const k = local_interfaces->at(i); |
5669 | const char * to = k->external_name(); |
5670 | log_debug(class, resolve)("%s %s (interface)" , from, to); |
5671 | } |
5672 | } |
5673 | } |
5674 | } |
5675 | |
5676 | JFR_ONLY(INIT_ID(ik);) |
5677 | |
5678 | // If we reach here, all is well. |
5679 | // Now remove the InstanceKlass* from the _klass_to_deallocate field |
5680 | // in order for it to not be destroyed in the ClassFileParser destructor. |
5681 | set_klass_to_deallocate(NULL); |
5682 | |
5683 | // it's official |
5684 | set_klass(ik); |
5685 | |
5686 | debug_only(ik->verify();) |
5687 | } |
5688 | |
5689 | void ClassFileParser::update_class_name(Symbol* new_class_name) { |
5690 | // Decrement the refcount in the old name, since we're clobbering it. |
5691 | _class_name->decrement_refcount(); |
5692 | |
5693 | _class_name = new_class_name; |
5694 | // Increment the refcount of the new name. |
5695 | // Now the ClassFileParser owns this name and will decrement in |
5696 | // the destructor. |
5697 | _class_name->increment_refcount(); |
5698 | } |
5699 | |
5700 | |
5701 | // For an unsafe anonymous class that is in the unnamed package, move it to its host class's |
5702 | // package by prepending its host class's package name to its class name and setting |
5703 | // its _class_name field. |
5704 | void ClassFileParser::prepend_host_package_name(const InstanceKlass* unsafe_anonymous_host, TRAPS) { |
5705 | ResourceMark rm(THREAD); |
5706 | assert(strrchr(_class_name->as_C_string(), '/') == NULL, |
5707 | "Unsafe anonymous class should not be in a package" ); |
5708 | const char* host_pkg_name = |
5709 | ClassLoader::package_from_name(unsafe_anonymous_host->name()->as_C_string(), NULL); |
5710 | |
5711 | if (host_pkg_name != NULL) { |
5712 | int host_pkg_len = (int)strlen(host_pkg_name); |
5713 | int class_name_len = _class_name->utf8_length(); |
5714 | int symbol_len = host_pkg_len + 1 + class_name_len; |
5715 | char* new_anon_name = NEW_RESOURCE_ARRAY(char, symbol_len + 1); |
5716 | int n = os::snprintf(new_anon_name, symbol_len + 1, "%s/%.*s" , |
5717 | host_pkg_name, class_name_len, _class_name->base()); |
5718 | assert(n == symbol_len, "Unexpected number of characters in string" ); |
5719 | |
5720 | // Decrement old _class_name to avoid leaking. |
5721 | _class_name->decrement_refcount(); |
5722 | |
5723 | // Create a symbol and update the anonymous class name. |
5724 | // The new class name is created with a refcount of one. When installed into the InstanceKlass, |
5725 | // it'll be two and when the ClassFileParser destructor runs, it'll go back to one and get deleted |
5726 | // when the class is unloaded. |
5727 | _class_name = SymbolTable::new_symbol(new_anon_name, symbol_len); |
5728 | } |
5729 | } |
5730 | |
5731 | // If the host class and the anonymous class are in the same package then do |
5732 | // nothing. If the anonymous class is in the unnamed package then move it to its |
5733 | // host's package. If the classes are in different packages then throw an IAE |
5734 | // exception. |
5735 | void ClassFileParser::fix_unsafe_anonymous_class_name(TRAPS) { |
5736 | assert(_unsafe_anonymous_host != NULL, "Expected an unsafe anonymous class" ); |
5737 | |
5738 | const jbyte* anon_last_slash = UTF8::strrchr((const jbyte*)_class_name->base(), |
5739 | _class_name->utf8_length(), '/'); |
5740 | if (anon_last_slash == NULL) { // Unnamed package |
5741 | prepend_host_package_name(_unsafe_anonymous_host, CHECK); |
5742 | } else { |
5743 | if (!_unsafe_anonymous_host->is_same_class_package(_unsafe_anonymous_host->class_loader(), _class_name)) { |
5744 | ResourceMark rm(THREAD); |
5745 | THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), |
5746 | err_msg("Host class %s and anonymous class %s are in different packages" , |
5747 | _unsafe_anonymous_host->name()->as_C_string(), _class_name->as_C_string())); |
5748 | } |
5749 | } |
5750 | } |
5751 | |
5752 | static bool relax_format_check_for(ClassLoaderData* loader_data) { |
5753 | bool trusted = (loader_data->is_the_null_class_loader_data() || |
5754 | SystemDictionary::is_platform_class_loader(loader_data->class_loader())); |
5755 | bool need_verify = |
5756 | // verifyAll |
5757 | (BytecodeVerificationLocal && BytecodeVerificationRemote) || |
5758 | // verifyRemote |
5759 | (!BytecodeVerificationLocal && BytecodeVerificationRemote && !trusted); |
5760 | return !need_verify; |
5761 | } |
5762 | |
5763 | ClassFileParser::ClassFileParser(ClassFileStream* stream, |
5764 | Symbol* name, |
5765 | ClassLoaderData* loader_data, |
5766 | Handle protection_domain, |
5767 | const InstanceKlass* unsafe_anonymous_host, |
5768 | GrowableArray<Handle>* cp_patches, |
5769 | Publicity pub_level, |
5770 | TRAPS) : |
5771 | _stream(stream), |
5772 | _requested_name(name), |
5773 | _class_name(NULL), |
5774 | _loader_data(loader_data), |
5775 | _unsafe_anonymous_host(unsafe_anonymous_host), |
5776 | _cp_patches(cp_patches), |
5777 | _num_patched_klasses(0), |
5778 | _max_num_patched_klasses(0), |
5779 | _orig_cp_size(0), |
5780 | _first_patched_klass_resolved_index(0), |
5781 | _super_klass(), |
5782 | _cp(NULL), |
5783 | _fields(NULL), |
5784 | _methods(NULL), |
5785 | _inner_classes(NULL), |
5786 | _nest_members(NULL), |
5787 | _nest_host(0), |
5788 | _local_interfaces(NULL), |
5789 | _transitive_interfaces(NULL), |
5790 | _combined_annotations(NULL), |
5791 | _annotations(NULL), |
5792 | _type_annotations(NULL), |
5793 | _fields_annotations(NULL), |
5794 | _fields_type_annotations(NULL), |
5795 | _klass(NULL), |
5796 | _klass_to_deallocate(NULL), |
5797 | _parsed_annotations(NULL), |
5798 | _fac(NULL), |
5799 | _field_info(NULL), |
5800 | _method_ordering(NULL), |
5801 | _all_mirandas(NULL), |
5802 | _vtable_size(0), |
5803 | _itable_size(0), |
5804 | _num_miranda_methods(0), |
5805 | _rt(REF_NONE), |
5806 | _protection_domain(protection_domain), |
5807 | _access_flags(), |
5808 | _pub_level(pub_level), |
5809 | _bad_constant_seen(0), |
5810 | _synthetic_flag(false), |
5811 | _sde_length(false), |
5812 | _sde_buffer(NULL), |
5813 | _sourcefile_index(0), |
5814 | _generic_signature_index(0), |
5815 | _major_version(0), |
5816 | _minor_version(0), |
5817 | _this_class_index(0), |
5818 | _super_class_index(0), |
5819 | _itfs_len(0), |
5820 | _java_fields_count(0), |
5821 | _need_verify(false), |
5822 | _relax_verify(false), |
5823 | _has_nonstatic_concrete_methods(false), |
5824 | _declares_nonstatic_concrete_methods(false), |
5825 | _has_final_method(false), |
5826 | _has_finalizer(false), |
5827 | _has_empty_finalizer(false), |
5828 | _has_vanilla_constructor(false), |
5829 | _max_bootstrap_specifier_index(-1) { |
5830 | |
5831 | _class_name = name != NULL ? name : vmSymbols::unknown_class_name(); |
5832 | _class_name->increment_refcount(); |
5833 | |
5834 | assert(THREAD->is_Java_thread(), "invariant" ); |
5835 | assert(_loader_data != NULL, "invariant" ); |
5836 | assert(stream != NULL, "invariant" ); |
5837 | assert(_stream != NULL, "invariant" ); |
5838 | assert(_stream->buffer() == _stream->current(), "invariant" ); |
5839 | assert(_class_name != NULL, "invariant" ); |
5840 | assert(0 == _access_flags.as_int(), "invariant" ); |
5841 | |
5842 | // Figure out whether we can skip format checking (matching classic VM behavior) |
5843 | if (DumpSharedSpaces) { |
5844 | // verify == true means it's a 'remote' class (i.e., non-boot class) |
5845 | // Verification decision is based on BytecodeVerificationRemote flag |
5846 | // for those classes. |
5847 | _need_verify = (stream->need_verify()) ? BytecodeVerificationRemote : |
5848 | BytecodeVerificationLocal; |
5849 | } |
5850 | else { |
5851 | _need_verify = Verifier::should_verify_for(_loader_data->class_loader(), |
5852 | stream->need_verify()); |
5853 | } |
5854 | if (_cp_patches != NULL) { |
5855 | int len = _cp_patches->length(); |
5856 | for (int i=0; i<len; i++) { |
5857 | if (has_cp_patch_at(i)) { |
5858 | Handle patch = cp_patch_at(i); |
5859 | if (java_lang_String::is_instance(patch()) || java_lang_Class::is_instance(patch())) { |
5860 | // We need to append the names of the patched classes to the end of the constant pool, |
5861 | // because a patched class may have a Utf8 name that's not already included in the |
5862 | // original constant pool. These class names are used when patch_constant_pool() |
5863 | // calls patch_class(). |
5864 | // |
5865 | // Note that a String in cp_patch_at(i) may be used to patch a Utf8, a String, or a Class. |
5866 | // At this point, we don't know the tag for index i yet, because we haven't parsed the |
5867 | // constant pool. So we can only assume the worst -- every String is used to patch a Class. |
5868 | _max_num_patched_klasses++; |
5869 | } |
5870 | } |
5871 | } |
5872 | } |
5873 | |
5874 | // synch back verification state to stream |
5875 | stream->set_verify(_need_verify); |
5876 | |
5877 | // Check if verification needs to be relaxed for this class file |
5878 | // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376) |
5879 | _relax_verify = relax_format_check_for(_loader_data); |
5880 | |
5881 | parse_stream(stream, CHECK); |
5882 | |
5883 | post_process_parsed_stream(stream, _cp, CHECK); |
5884 | } |
5885 | |
5886 | void ClassFileParser::clear_class_metadata() { |
5887 | // metadata created before the instance klass is created. Must be |
5888 | // deallocated if classfile parsing returns an error. |
5889 | _cp = NULL; |
5890 | _fields = NULL; |
5891 | _methods = NULL; |
5892 | _inner_classes = NULL; |
5893 | _nest_members = NULL; |
5894 | _local_interfaces = NULL; |
5895 | _combined_annotations = NULL; |
5896 | _annotations = _type_annotations = NULL; |
5897 | _fields_annotations = _fields_type_annotations = NULL; |
5898 | } |
5899 | |
5900 | // Destructor to clean up |
5901 | ClassFileParser::~ClassFileParser() { |
5902 | _class_name->decrement_refcount(); |
5903 | |
5904 | if (_cp != NULL) { |
5905 | MetadataFactory::free_metadata(_loader_data, _cp); |
5906 | } |
5907 | if (_fields != NULL) { |
5908 | MetadataFactory::free_array<u2>(_loader_data, _fields); |
5909 | } |
5910 | |
5911 | if (_methods != NULL) { |
5912 | // Free methods |
5913 | InstanceKlass::deallocate_methods(_loader_data, _methods); |
5914 | } |
5915 | |
5916 | // beware of the Universe::empty_blah_array!! |
5917 | if (_inner_classes != NULL && _inner_classes != Universe::the_empty_short_array()) { |
5918 | MetadataFactory::free_array<u2>(_loader_data, _inner_classes); |
5919 | } |
5920 | |
5921 | if (_nest_members != NULL && _nest_members != Universe::the_empty_short_array()) { |
5922 | MetadataFactory::free_array<u2>(_loader_data, _nest_members); |
5923 | } |
5924 | |
5925 | // Free interfaces |
5926 | InstanceKlass::deallocate_interfaces(_loader_data, _super_klass, |
5927 | _local_interfaces, _transitive_interfaces); |
5928 | |
5929 | if (_combined_annotations != NULL) { |
5930 | // After all annotations arrays have been created, they are installed into the |
5931 | // Annotations object that will be assigned to the InstanceKlass being created. |
5932 | |
5933 | // Deallocate the Annotations object and the installed annotations arrays. |
5934 | _combined_annotations->deallocate_contents(_loader_data); |
5935 | |
5936 | // If the _combined_annotations pointer is non-NULL, |
5937 | // then the other annotations fields should have been cleared. |
5938 | assert(_annotations == NULL, "Should have been cleared" ); |
5939 | assert(_type_annotations == NULL, "Should have been cleared" ); |
5940 | assert(_fields_annotations == NULL, "Should have been cleared" ); |
5941 | assert(_fields_type_annotations == NULL, "Should have been cleared" ); |
5942 | } else { |
5943 | // If the annotations arrays were not installed into the Annotations object, |
5944 | // then they have to be deallocated explicitly. |
5945 | MetadataFactory::free_array<u1>(_loader_data, _annotations); |
5946 | MetadataFactory::free_array<u1>(_loader_data, _type_annotations); |
5947 | Annotations::free_contents(_loader_data, _fields_annotations); |
5948 | Annotations::free_contents(_loader_data, _fields_type_annotations); |
5949 | } |
5950 | |
5951 | clear_class_metadata(); |
5952 | _transitive_interfaces = NULL; |
5953 | |
5954 | // deallocate the klass if already created. Don't directly deallocate, but add |
5955 | // to the deallocate list so that the klass is removed from the CLD::_klasses list |
5956 | // at a safepoint. |
5957 | if (_klass_to_deallocate != NULL) { |
5958 | _loader_data->add_to_deallocate_list(_klass_to_deallocate); |
5959 | } |
5960 | } |
5961 | |
5962 | void ClassFileParser::parse_stream(const ClassFileStream* const stream, |
5963 | TRAPS) { |
5964 | |
5965 | assert(stream != NULL, "invariant" ); |
5966 | assert(_class_name != NULL, "invariant" ); |
5967 | |
5968 | // BEGIN STREAM PARSING |
5969 | stream->guarantee_more(8, CHECK); // magic, major, minor |
5970 | // Magic value |
5971 | const u4 magic = stream->get_u4_fast(); |
5972 | guarantee_property(magic == JAVA_CLASSFILE_MAGIC, |
5973 | "Incompatible magic value %u in class file %s" , |
5974 | magic, CHECK); |
5975 | |
5976 | // Version numbers |
5977 | _minor_version = stream->get_u2_fast(); |
5978 | _major_version = stream->get_u2_fast(); |
5979 | |
5980 | if (DumpSharedSpaces && _major_version < JAVA_6_VERSION) { |
5981 | ResourceMark rm; |
5982 | warning("Pre JDK 6 class not supported by CDS: %u.%u %s" , |
5983 | _major_version, _minor_version, _class_name->as_C_string()); |
5984 | Exceptions::fthrow( |
5985 | THREAD_AND_LOCATION, |
5986 | vmSymbols::java_lang_UnsupportedClassVersionError(), |
5987 | "Unsupported major.minor version for dump time %u.%u" , |
5988 | _major_version, |
5989 | _minor_version); |
5990 | } |
5991 | |
5992 | // Check version numbers - we check this even with verifier off |
5993 | verify_class_version(_major_version, _minor_version, _class_name, CHECK); |
5994 | |
5995 | stream->guarantee_more(3, CHECK); // length, first cp tag |
5996 | u2 cp_size = stream->get_u2_fast(); |
5997 | |
5998 | guarantee_property( |
5999 | cp_size >= 1, "Illegal constant pool size %u in class file %s" , |
6000 | cp_size, CHECK); |
6001 | |
6002 | _orig_cp_size = cp_size; |
6003 | if (int(cp_size) + _max_num_patched_klasses > 0xffff) { |
6004 | THROW_MSG(vmSymbols::java_lang_InternalError(), "not enough space for patched classes" ); |
6005 | } |
6006 | cp_size += _max_num_patched_klasses; |
6007 | |
6008 | _cp = ConstantPool::allocate(_loader_data, |
6009 | cp_size, |
6010 | CHECK); |
6011 | |
6012 | ConstantPool* const cp = _cp; |
6013 | |
6014 | parse_constant_pool(stream, cp, _orig_cp_size, CHECK); |
6015 | |
6016 | assert(cp_size == (const u2)cp->length(), "invariant" ); |
6017 | |
6018 | // ACCESS FLAGS |
6019 | stream->guarantee_more(8, CHECK); // flags, this_class, super_class, infs_len |
6020 | |
6021 | // Access flags |
6022 | jint flags; |
6023 | // JVM_ACC_MODULE is defined in JDK-9 and later. |
6024 | if (_major_version >= JAVA_9_VERSION) { |
6025 | flags = stream->get_u2_fast() & (JVM_RECOGNIZED_CLASS_MODIFIERS | JVM_ACC_MODULE); |
6026 | } else { |
6027 | flags = stream->get_u2_fast() & JVM_RECOGNIZED_CLASS_MODIFIERS; |
6028 | } |
6029 | |
6030 | if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) { |
6031 | // Set abstract bit for old class files for backward compatibility |
6032 | flags |= JVM_ACC_ABSTRACT; |
6033 | } |
6034 | |
6035 | verify_legal_class_modifiers(flags, CHECK); |
6036 | |
6037 | short bad_constant = class_bad_constant_seen(); |
6038 | if (bad_constant != 0) { |
6039 | // Do not throw CFE until after the access_flags are checked because if |
6040 | // ACC_MODULE is set in the access flags, then NCDFE must be thrown, not CFE. |
6041 | classfile_parse_error("Unknown constant tag %u in class file %s" , bad_constant, CHECK); |
6042 | } |
6043 | |
6044 | _access_flags.set_flags(flags); |
6045 | |
6046 | // This class and superclass |
6047 | _this_class_index = stream->get_u2_fast(); |
6048 | check_property( |
6049 | valid_cp_range(_this_class_index, cp_size) && |
6050 | cp->tag_at(_this_class_index).is_unresolved_klass(), |
6051 | "Invalid this class index %u in constant pool in class file %s" , |
6052 | _this_class_index, CHECK); |
6053 | |
6054 | Symbol* const class_name_in_cp = cp->klass_name_at(_this_class_index); |
6055 | assert(class_name_in_cp != NULL, "class_name can't be null" ); |
6056 | |
6057 | // Update _class_name to reflect the name in the constant pool |
6058 | update_class_name(class_name_in_cp); |
6059 | |
6060 | // Don't need to check whether this class name is legal or not. |
6061 | // It has been checked when constant pool is parsed. |
6062 | // However, make sure it is not an array type. |
6063 | if (_need_verify) { |
6064 | guarantee_property(_class_name->char_at(0) != JVM_SIGNATURE_ARRAY, |
6065 | "Bad class name in class file %s" , |
6066 | CHECK); |
6067 | } |
6068 | |
6069 | // Checks if name in class file matches requested name |
6070 | if (_requested_name != NULL && _requested_name != _class_name) { |
6071 | ResourceMark rm(THREAD); |
6072 | Exceptions::fthrow( |
6073 | THREAD_AND_LOCATION, |
6074 | vmSymbols::java_lang_NoClassDefFoundError(), |
6075 | "%s (wrong name: %s)" , |
6076 | _class_name->as_C_string(), |
6077 | _requested_name != NULL ? _requested_name->as_C_string() : "NoName" |
6078 | ); |
6079 | return; |
6080 | } |
6081 | |
6082 | // if this is an anonymous class fix up its name if it's in the unnamed |
6083 | // package. Otherwise, throw IAE if it is in a different package than |
6084 | // its host class. |
6085 | if (_unsafe_anonymous_host != NULL) { |
6086 | fix_unsafe_anonymous_class_name(CHECK); |
6087 | } |
6088 | |
6089 | // Verification prevents us from creating names with dots in them, this |
6090 | // asserts that that's the case. |
6091 | assert(is_internal_format(_class_name), "external class name format used internally" ); |
6092 | |
6093 | if (!is_internal()) { |
6094 | LogTarget(Debug, class, preorder) lt; |
6095 | if (lt.is_enabled()){ |
6096 | ResourceMark rm(THREAD); |
6097 | LogStream ls(lt); |
6098 | ls.print("%s" , _class_name->as_klass_external_name()); |
6099 | if (stream->source() != NULL) { |
6100 | ls.print(" source: %s" , stream->source()); |
6101 | } |
6102 | ls.cr(); |
6103 | } |
6104 | |
6105 | #if INCLUDE_CDS |
6106 | if (DumpLoadedClassList != NULL && stream->source() != NULL && classlist_file->is_open()) { |
6107 | if (!ClassLoader::has_jrt_entry()) { |
6108 | warning("DumpLoadedClassList and CDS are not supported in exploded build" ); |
6109 | DumpLoadedClassList = NULL; |
6110 | } else if (SystemDictionaryShared::is_sharing_possible(_loader_data) && |
6111 | _unsafe_anonymous_host == NULL) { |
6112 | // Only dump the classes that can be stored into CDS archive. |
6113 | // Unsafe anonymous classes such as generated LambdaForm classes are also not included. |
6114 | oop class_loader = _loader_data->class_loader(); |
6115 | ResourceMark rm(THREAD); |
6116 | bool skip = false; |
6117 | if (class_loader == NULL || SystemDictionary::is_platform_class_loader(class_loader)) { |
6118 | // For the boot and platform class loaders, skip classes that are not found in the |
6119 | // java runtime image, such as those found in the --patch-module entries. |
6120 | // These classes can't be loaded from the archive during runtime. |
6121 | if (!stream->from_boot_loader_modules_image() && strncmp(stream->source(), "jrt:" , 4) != 0) { |
6122 | skip = true; |
6123 | } |
6124 | |
6125 | if (class_loader == NULL && ClassLoader::contains_append_entry(stream->source())) { |
6126 | // .. but don't skip the boot classes that are loaded from -Xbootclasspath/a |
6127 | // as they can be loaded from the archive during runtime. |
6128 | skip = false; |
6129 | } |
6130 | } |
6131 | if (skip) { |
6132 | tty->print_cr("skip writing class %s from source %s to classlist file" , |
6133 | _class_name->as_C_string(), stream->source()); |
6134 | } else { |
6135 | classlist_file->print_cr("%s" , _class_name->as_C_string()); |
6136 | classlist_file->flush(); |
6137 | } |
6138 | } |
6139 | } |
6140 | #endif |
6141 | } |
6142 | |
6143 | // SUPERKLASS |
6144 | _super_class_index = stream->get_u2_fast(); |
6145 | _super_klass = parse_super_class(cp, |
6146 | _super_class_index, |
6147 | _need_verify, |
6148 | CHECK); |
6149 | |
6150 | // Interfaces |
6151 | _itfs_len = stream->get_u2_fast(); |
6152 | parse_interfaces(stream, |
6153 | _itfs_len, |
6154 | cp, |
6155 | &_has_nonstatic_concrete_methods, |
6156 | CHECK); |
6157 | |
6158 | assert(_local_interfaces != NULL, "invariant" ); |
6159 | |
6160 | // Fields (offsets are filled in later) |
6161 | _fac = new FieldAllocationCount(); |
6162 | parse_fields(stream, |
6163 | _access_flags.is_interface(), |
6164 | _fac, |
6165 | cp, |
6166 | cp_size, |
6167 | &_java_fields_count, |
6168 | CHECK); |
6169 | |
6170 | assert(_fields != NULL, "invariant" ); |
6171 | |
6172 | // Methods |
6173 | AccessFlags promoted_flags; |
6174 | parse_methods(stream, |
6175 | _access_flags.is_interface(), |
6176 | &promoted_flags, |
6177 | &_has_final_method, |
6178 | &_declares_nonstatic_concrete_methods, |
6179 | CHECK); |
6180 | |
6181 | assert(_methods != NULL, "invariant" ); |
6182 | |
6183 | // promote flags from parse_methods() to the klass' flags |
6184 | _access_flags.add_promoted_flags(promoted_flags.as_int()); |
6185 | |
6186 | if (_declares_nonstatic_concrete_methods) { |
6187 | _has_nonstatic_concrete_methods = true; |
6188 | } |
6189 | |
6190 | // Additional attributes/annotations |
6191 | _parsed_annotations = new ClassAnnotationCollector(); |
6192 | parse_classfile_attributes(stream, cp, _parsed_annotations, CHECK); |
6193 | |
6194 | assert(_inner_classes != NULL, "invariant" ); |
6195 | |
6196 | // Finalize the Annotations metadata object, |
6197 | // now that all annotation arrays have been created. |
6198 | create_combined_annotations(CHECK); |
6199 | |
6200 | // Make sure this is the end of class file stream |
6201 | guarantee_property(stream->at_eos(), |
6202 | "Extra bytes at the end of class file %s" , |
6203 | CHECK); |
6204 | |
6205 | // all bytes in stream read and parsed |
6206 | } |
6207 | |
6208 | void ClassFileParser::post_process_parsed_stream(const ClassFileStream* const stream, |
6209 | ConstantPool* cp, |
6210 | TRAPS) { |
6211 | assert(stream != NULL, "invariant" ); |
6212 | assert(stream->at_eos(), "invariant" ); |
6213 | assert(cp != NULL, "invariant" ); |
6214 | assert(_loader_data != NULL, "invariant" ); |
6215 | |
6216 | if (_class_name == vmSymbols::java_lang_Object()) { |
6217 | check_property(_local_interfaces == Universe::the_empty_instance_klass_array(), |
6218 | "java.lang.Object cannot implement an interface in class file %s" , |
6219 | CHECK); |
6220 | } |
6221 | // We check super class after class file is parsed and format is checked |
6222 | if (_super_class_index > 0 && NULL ==_super_klass) { |
6223 | Symbol* const super_class_name = cp->klass_name_at(_super_class_index); |
6224 | if (_access_flags.is_interface()) { |
6225 | // Before attempting to resolve the superclass, check for class format |
6226 | // errors not checked yet. |
6227 | guarantee_property(super_class_name == vmSymbols::java_lang_Object(), |
6228 | "Interfaces must have java.lang.Object as superclass in class file %s" , |
6229 | CHECK); |
6230 | } |
6231 | Handle loader(THREAD, _loader_data->class_loader()); |
6232 | _super_klass = (const InstanceKlass*) |
6233 | SystemDictionary::resolve_super_or_fail(_class_name, |
6234 | super_class_name, |
6235 | loader, |
6236 | _protection_domain, |
6237 | true, |
6238 | CHECK); |
6239 | } |
6240 | |
6241 | if (_super_klass != NULL) { |
6242 | if (_super_klass->has_nonstatic_concrete_methods()) { |
6243 | _has_nonstatic_concrete_methods = true; |
6244 | } |
6245 | |
6246 | if (_super_klass->is_interface()) { |
6247 | ResourceMark rm(THREAD); |
6248 | Exceptions::fthrow( |
6249 | THREAD_AND_LOCATION, |
6250 | vmSymbols::java_lang_IncompatibleClassChangeError(), |
6251 | "class %s has interface %s as super class" , |
6252 | _class_name->as_klass_external_name(), |
6253 | _super_klass->external_name() |
6254 | ); |
6255 | return; |
6256 | } |
6257 | // Make sure super class is not final |
6258 | if (_super_klass->is_final()) { |
6259 | THROW_MSG(vmSymbols::java_lang_VerifyError(), "Cannot inherit from final class" ); |
6260 | } |
6261 | } |
6262 | |
6263 | // Compute the transitive list of all unique interfaces implemented by this class |
6264 | _transitive_interfaces = |
6265 | compute_transitive_interfaces(_super_klass, |
6266 | _local_interfaces, |
6267 | _loader_data, |
6268 | CHECK); |
6269 | |
6270 | assert(_transitive_interfaces != NULL, "invariant" ); |
6271 | |
6272 | // sort methods |
6273 | _method_ordering = sort_methods(_methods); |
6274 | |
6275 | _all_mirandas = new GrowableArray<Method*>(20); |
6276 | |
6277 | Handle loader(THREAD, _loader_data->class_loader()); |
6278 | klassVtable::compute_vtable_size_and_num_mirandas(&_vtable_size, |
6279 | &_num_miranda_methods, |
6280 | _all_mirandas, |
6281 | _super_klass, |
6282 | _methods, |
6283 | _access_flags, |
6284 | _major_version, |
6285 | loader, |
6286 | _class_name, |
6287 | _local_interfaces, |
6288 | CHECK); |
6289 | |
6290 | // Size of Java itable (in words) |
6291 | _itable_size = _access_flags.is_interface() ? 0 : |
6292 | klassItable::compute_itable_size(_transitive_interfaces); |
6293 | |
6294 | assert(_fac != NULL, "invariant" ); |
6295 | assert(_parsed_annotations != NULL, "invariant" ); |
6296 | |
6297 | _field_info = new FieldLayoutInfo(); |
6298 | layout_fields(cp, _fac, _parsed_annotations, _field_info, CHECK); |
6299 | |
6300 | // Compute reference typ |
6301 | _rt = (NULL ==_super_klass) ? REF_NONE : _super_klass->reference_type(); |
6302 | |
6303 | } |
6304 | |
6305 | void ClassFileParser::set_klass(InstanceKlass* klass) { |
6306 | |
6307 | #ifdef ASSERT |
6308 | if (klass != NULL) { |
6309 | assert(NULL == _klass, "leaking?" ); |
6310 | } |
6311 | #endif |
6312 | |
6313 | _klass = klass; |
6314 | } |
6315 | |
6316 | void ClassFileParser::set_klass_to_deallocate(InstanceKlass* klass) { |
6317 | |
6318 | #ifdef ASSERT |
6319 | if (klass != NULL) { |
6320 | assert(NULL == _klass_to_deallocate, "leaking?" ); |
6321 | } |
6322 | #endif |
6323 | |
6324 | _klass_to_deallocate = klass; |
6325 | } |
6326 | |
6327 | // Caller responsible for ResourceMark |
6328 | // clone stream with rewound position |
6329 | const ClassFileStream* ClassFileParser::clone_stream() const { |
6330 | assert(_stream != NULL, "invariant" ); |
6331 | |
6332 | return _stream->clone(); |
6333 | } |
6334 | // ---------------------------------------------------------------------------- |
6335 | // debugging |
6336 | |
6337 | #ifdef ASSERT |
6338 | |
6339 | // return true if class_name contains no '.' (internal format is '/') |
6340 | bool ClassFileParser::is_internal_format(Symbol* class_name) { |
6341 | if (class_name != NULL) { |
6342 | ResourceMark rm; |
6343 | char* name = class_name->as_C_string(); |
6344 | return strchr(name, '.') == NULL; |
6345 | } else { |
6346 | return true; |
6347 | } |
6348 | } |
6349 | |
6350 | #endif |
6351 | |