39 #include "oops/instanceKlass.hpp" |
39 #include "oops/instanceKlass.hpp" |
40 #include "oops/klass.inline.hpp" |
40 #include "oops/klass.inline.hpp" |
41 #include "oops/klassOop.hpp" |
41 #include "oops/klassOop.hpp" |
42 #include "oops/klassVtable.hpp" |
42 #include "oops/klassVtable.hpp" |
43 #include "oops/methodOop.hpp" |
43 #include "oops/methodOop.hpp" |
44 #include "oops/symbolOop.hpp" |
44 #include "oops/symbol.hpp" |
45 #include "prims/jvmtiExport.hpp" |
45 #include "prims/jvmtiExport.hpp" |
46 #include "runtime/javaCalls.hpp" |
46 #include "runtime/javaCalls.hpp" |
47 #include "runtime/perfData.hpp" |
47 #include "runtime/perfData.hpp" |
48 #include "runtime/reflection.hpp" |
48 #include "runtime/reflection.hpp" |
49 #include "runtime/signature.hpp" |
49 #include "runtime/signature.hpp" |
265 utf8_buffer = (u1*) str; |
265 utf8_buffer = (u1*) str; |
266 utf8_length = (int) strlen(str); |
266 utf8_length = (int) strlen(str); |
267 } |
267 } |
268 |
268 |
269 unsigned int hash; |
269 unsigned int hash; |
270 symbolOop result = SymbolTable::lookup_only((char*)utf8_buffer, utf8_length, hash); |
270 Symbol* result = SymbolTable::lookup_only((char*)utf8_buffer, utf8_length, hash); |
271 if (result == NULL) { |
271 if (result == NULL) { |
272 names[names_count] = (char*)utf8_buffer; |
272 names[names_count] = (char*)utf8_buffer; |
273 lengths[names_count] = utf8_length; |
273 lengths[names_count] = utf8_length; |
274 indices[names_count] = index; |
274 indices[names_count] = index; |
275 hashValues[names_count++] = hash; |
275 hashValues[names_count++] = hash; |
276 if (names_count == SymbolTable::symbol_alloc_batch_size) { |
276 if (names_count == SymbolTable::symbol_alloc_batch_size) { |
277 oopFactory::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK); |
277 SymbolTable::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK); |
278 names_count = 0; |
278 names_count = 0; |
279 } |
279 } |
280 } else { |
280 } else { |
281 cp->symbol_at_put(index, result); |
281 cp->symbol_at_put(index, result); |
282 } |
282 } |
289 } |
289 } |
290 } |
290 } |
291 |
291 |
292 // Allocate the remaining symbols |
292 // Allocate the remaining symbols |
293 if (names_count > 0) { |
293 if (names_count > 0) { |
294 oopFactory::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK); |
294 SymbolTable::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK); |
295 } |
295 } |
296 |
296 |
297 // Copy _current pointer of local copy back to stream(). |
297 // Copy _current pointer of local copy back to stream(). |
298 #ifdef ASSERT |
298 #ifdef ASSERT |
299 assert(cfs0->current() == old_current, "non-exclusive use of stream()"); |
299 assert(cfs0->current() == old_current, "non-exclusive use of stream()"); |
300 #endif |
300 #endif |
301 cfs0->set_current(cfs1.current()); |
301 cfs0->set_current(cfs1.current()); |
302 } |
302 } |
|
303 |
|
304 // This class unreferences constant pool symbols if an error has occurred |
|
305 // while parsing the class before it is assigned into the class. |
|
306 // If it gets an error after that it is unloaded and the constant pool will |
|
307 // be cleaned up then. |
|
308 class ConstantPoolCleaner : public StackObj { |
|
309 constantPoolHandle _cphandle; |
|
310 bool _in_error; |
|
311 public: |
|
312 ConstantPoolCleaner(constantPoolHandle cp) : _cphandle(cp), _in_error(true) {} |
|
313 ~ConstantPoolCleaner() { |
|
314 if (_in_error && _cphandle.not_null()) { |
|
315 _cphandle->unreference_symbols(); |
|
316 } |
|
317 } |
|
318 void set_in_error(bool clean) { _in_error = clean; } |
|
319 }; |
303 |
320 |
304 bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); } |
321 bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); } |
305 |
322 |
306 constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { |
323 constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { |
307 ClassFileStream* cfs = stream(); |
324 ClassFileStream* cfs = stream(); |
317 methodOopDesc::IsSafeConc, |
334 methodOopDesc::IsSafeConc, |
318 CHECK_(nullHandle)); |
335 CHECK_(nullHandle)); |
319 constantPoolHandle cp (THREAD, constant_pool); |
336 constantPoolHandle cp (THREAD, constant_pool); |
320 |
337 |
321 cp->set_partially_loaded(); // Enables heap verify to work on partial constantPoolOops |
338 cp->set_partially_loaded(); // Enables heap verify to work on partial constantPoolOops |
|
339 ConstantPoolCleaner cp_in_error(cp); // set constant pool to be cleaned up. |
322 |
340 |
323 // parsing constant pool entries |
341 // parsing constant pool entries |
324 parse_constant_pool_entries(cp, length, CHECK_(nullHandle)); |
342 parse_constant_pool_entries(cp, length, CHECK_(nullHandle)); |
325 |
343 |
326 int index = 1; // declared outside of loops for portability |
344 int index = 1; // declared outside of loops for portability |
409 check_property( |
427 check_property( |
410 valid_cp_range(string_index, length) && |
428 valid_cp_range(string_index, length) && |
411 cp->tag_at(string_index).is_utf8(), |
429 cp->tag_at(string_index).is_utf8(), |
412 "Invalid constant pool index %u in class file %s", |
430 "Invalid constant pool index %u in class file %s", |
413 string_index, CHECK_(nullHandle)); |
431 string_index, CHECK_(nullHandle)); |
414 symbolOop sym = cp->symbol_at(string_index); |
432 Symbol* sym = cp->symbol_at(string_index); |
415 cp->unresolved_string_at_put(index, sym); |
433 cp->unresolved_string_at_put(index, sym); |
416 } |
434 } |
417 break; |
435 break; |
418 case JVM_CONSTANT_MethodHandle : |
436 case JVM_CONSTANT_MethodHandle : |
419 { |
437 { |
524 index, CHECK_(nullHandle)); |
542 index, CHECK_(nullHandle)); |
525 } |
543 } |
526 } |
544 } |
527 |
545 |
528 if (!_need_verify) { |
546 if (!_need_verify) { |
|
547 cp_in_error.set_in_error(false); |
529 return cp; |
548 return cp; |
530 } |
549 } |
531 |
550 |
532 // second verification pass - checks the strings are of the right format. |
551 // second verification pass - checks the strings are of the right format. |
533 // but not yet to the other entries |
552 // but not yet to the other entries |
534 for (index = 1; index < length; index++) { |
553 for (index = 1; index < length; index++) { |
535 jbyte tag = cp->tag_at(index).value(); |
554 jbyte tag = cp->tag_at(index).value(); |
536 switch (tag) { |
555 switch (tag) { |
537 case JVM_CONSTANT_UnresolvedClass: { |
556 case JVM_CONSTANT_UnresolvedClass: { |
538 symbolHandle class_name(THREAD, cp->unresolved_klass_at(index)); |
557 Symbol* class_name = cp->unresolved_klass_at(index); |
539 // check the name, even if _cp_patches will overwrite it |
558 // check the name, even if _cp_patches will overwrite it |
540 verify_legal_class_name(class_name, CHECK_(nullHandle)); |
559 verify_legal_class_name(class_name, CHECK_(nullHandle)); |
541 break; |
560 break; |
542 } |
561 } |
543 case JVM_CONSTANT_NameAndType: { |
562 case JVM_CONSTANT_NameAndType: { |
544 if (_need_verify && _major_version >= JAVA_7_VERSION) { |
563 if (_need_verify && _major_version >= JAVA_7_VERSION) { |
545 int sig_index = cp->signature_ref_index_at(index); |
564 int sig_index = cp->signature_ref_index_at(index); |
546 int name_index = cp->name_ref_index_at(index); |
565 int name_index = cp->name_ref_index_at(index); |
547 symbolHandle name(THREAD, cp->symbol_at(name_index)); |
566 Symbol* name = cp->symbol_at(name_index); |
548 symbolHandle sig(THREAD, cp->symbol_at(sig_index)); |
567 Symbol* sig = cp->symbol_at(sig_index); |
549 if (sig->byte_at(0) == JVM_SIGNATURE_FUNC) { |
568 if (sig->byte_at(0) == JVM_SIGNATURE_FUNC) { |
550 verify_legal_method_signature(name, sig, CHECK_(nullHandle)); |
569 verify_legal_method_signature(name, sig, CHECK_(nullHandle)); |
551 } else { |
570 } else { |
552 verify_legal_field_signature(name, sig, CHECK_(nullHandle)); |
571 verify_legal_field_signature(name, sig, CHECK_(nullHandle)); |
553 } |
572 } |
560 int name_and_type_ref_index = cp->name_and_type_ref_index_at(index); |
579 int name_and_type_ref_index = cp->name_and_type_ref_index_at(index); |
561 // already verified to be utf8 |
580 // already verified to be utf8 |
562 int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index); |
581 int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index); |
563 // already verified to be utf8 |
582 // already verified to be utf8 |
564 int signature_ref_index = cp->signature_ref_index_at(name_and_type_ref_index); |
583 int signature_ref_index = cp->signature_ref_index_at(name_and_type_ref_index); |
565 symbolHandle name(THREAD, cp->symbol_at(name_ref_index)); |
584 Symbol* name = cp->symbol_at(name_ref_index); |
566 symbolHandle signature(THREAD, cp->symbol_at(signature_ref_index)); |
585 Symbol* signature = cp->symbol_at(signature_ref_index); |
567 if (tag == JVM_CONSTANT_Fieldref) { |
586 if (tag == JVM_CONSTANT_Fieldref) { |
568 verify_legal_field_name(name, CHECK_(nullHandle)); |
587 verify_legal_field_name(name, CHECK_(nullHandle)); |
569 if (_need_verify && _major_version >= JAVA_7_VERSION) { |
588 if (_need_verify && _major_version >= JAVA_7_VERSION) { |
570 // Signature is verified above, when iterating NameAndType_info. |
589 // Signature is verified above, when iterating NameAndType_info. |
571 // Need only to be sure it's the right type. |
590 // Need only to be sure it's the right type. |
588 } else { |
607 } else { |
589 verify_legal_method_signature(name, signature, CHECK_(nullHandle)); |
608 verify_legal_method_signature(name, signature, CHECK_(nullHandle)); |
590 } |
609 } |
591 if (tag == JVM_CONSTANT_Methodref) { |
610 if (tag == JVM_CONSTANT_Methodref) { |
592 // 4509014: If a class method name begins with '<', it must be "<init>". |
611 // 4509014: If a class method name begins with '<', it must be "<init>". |
593 assert(!name.is_null(), "method name in constant pool is null"); |
612 assert(name != NULL, "method name in constant pool is null"); |
594 unsigned int name_len = name->utf8_length(); |
613 unsigned int name_len = name->utf8_length(); |
595 assert(name_len > 0, "bad method name"); // already verified as legal name |
614 assert(name_len > 0, "bad method name"); // already verified as legal name |
596 if (name->byte_at(0) == '<') { |
615 if (name->byte_at(0) == '<') { |
597 if (name() != vmSymbols::object_initializer_name()) { |
616 if (name != vmSymbols::object_initializer_name()) { |
598 classfile_parse_error( |
617 classfile_parse_error( |
599 "Bad method name at constant pool index %u in class file %s", |
618 "Bad method name at constant pool index %u in class file %s", |
600 name_ref_index, CHECK_(nullHandle)); |
619 name_ref_index, CHECK_(nullHandle)); |
601 } |
620 } |
602 } |
621 } |
613 case JVM_REF_invokeSpecial: |
632 case JVM_REF_invokeSpecial: |
614 case JVM_REF_newInvokeSpecial: |
633 case JVM_REF_newInvokeSpecial: |
615 { |
634 { |
616 int name_and_type_ref_index = cp->name_and_type_ref_index_at(ref_index); |
635 int name_and_type_ref_index = cp->name_and_type_ref_index_at(ref_index); |
617 int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index); |
636 int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index); |
618 symbolHandle name(THREAD, cp->symbol_at(name_ref_index)); |
637 Symbol* name = cp->symbol_at(name_ref_index); |
619 if (ref_kind == JVM_REF_newInvokeSpecial) { |
638 if (ref_kind == JVM_REF_newInvokeSpecial) { |
620 if (name() != vmSymbols::object_initializer_name()) { |
639 if (name != vmSymbols::object_initializer_name()) { |
621 classfile_parse_error( |
640 classfile_parse_error( |
622 "Bad constructor name at constant pool index %u in class file %s", |
641 "Bad constructor name at constant pool index %u in class file %s", |
623 name_ref_index, CHECK_(nullHandle)); |
642 name_ref_index, CHECK_(nullHandle)); |
624 } |
643 } |
625 } else { |
644 } else { |
626 if (name() == vmSymbols::object_initializer_name()) { |
645 if (name == vmSymbols::object_initializer_name()) { |
627 classfile_parse_error( |
646 classfile_parse_error( |
628 "Bad method name at constant pool index %u in class file %s", |
647 "Bad method name at constant pool index %u in class file %s", |
629 name_ref_index, CHECK_(nullHandle)); |
648 name_ref_index, CHECK_(nullHandle)); |
630 } |
649 } |
631 } |
650 } |
634 // Other ref_kinds are already fully checked in previous pass. |
653 // Other ref_kinds are already fully checked in previous pass. |
635 } |
654 } |
636 break; |
655 break; |
637 } |
656 } |
638 case JVM_CONSTANT_MethodType: { |
657 case JVM_CONSTANT_MethodType: { |
639 symbolHandle no_name = vmSymbolHandles::type_name(); // place holder |
658 Symbol* no_name = vmSymbols::type_name(); // place holder |
640 symbolHandle signature(THREAD, cp->method_type_signature_at(index)); |
659 Symbol* signature = cp->method_type_signature_at(index); |
641 verify_legal_method_signature(no_name, signature, CHECK_(nullHandle)); |
660 verify_legal_method_signature(no_name, signature, CHECK_(nullHandle)); |
642 break; |
661 break; |
643 } |
662 } |
|
663 case JVM_CONSTANT_Utf8: { |
|
664 assert(cp->symbol_at(index)->refcount() != 0, "count corrupted"); |
|
665 } |
644 } // end of switch |
666 } // end of switch |
645 } // end of for |
667 } // end of for |
646 |
668 |
|
669 cp_in_error.set_in_error(false); |
647 return cp; |
670 return cp; |
648 } |
671 } |
649 |
672 |
650 |
673 |
651 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) { |
674 void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) { |
663 cp->klass_at_put(index, java_lang_Class::as_klassOop(patch())); |
686 cp->klass_at_put(index, java_lang_Class::as_klassOop(patch())); |
664 } else { |
687 } else { |
665 guarantee_property(java_lang_String::is_instance(patch()), |
688 guarantee_property(java_lang_String::is_instance(patch()), |
666 "Illegal class patch at %d in class file %s", |
689 "Illegal class patch at %d in class file %s", |
667 index, CHECK); |
690 index, CHECK); |
668 symbolHandle name = java_lang_String::as_symbol(patch(), CHECK); |
691 Symbol* name = java_lang_String::as_symbol(patch(), CHECK); |
669 cp->unresolved_klass_at_put(index, name()); |
692 cp->unresolved_klass_at_put(index, name); |
670 } |
693 } |
671 break; |
694 break; |
672 |
695 |
673 case JVM_CONSTANT_UnresolvedString : |
696 case JVM_CONSTANT_UnresolvedString : |
674 // Patching a string means pre-resolving it. |
697 // Patching a string means pre-resolving it. |
715 |
738 |
716 |
739 |
717 |
740 |
718 class NameSigHash: public ResourceObj { |
741 class NameSigHash: public ResourceObj { |
719 public: |
742 public: |
720 symbolOop _name; // name |
743 Symbol* _name; // name |
721 symbolOop _sig; // signature |
744 Symbol* _sig; // signature |
722 NameSigHash* _next; // Next entry in hash table |
745 NameSigHash* _next; // Next entry in hash table |
723 }; |
746 }; |
724 |
747 |
725 |
748 |
726 #define HASH_ROW_SIZE 256 |
749 #define HASH_ROW_SIZE 256 |
727 |
750 |
728 unsigned int hash(symbolOop name, symbolOop sig) { |
751 unsigned int hash(Symbol* name, Symbol* sig) { |
729 unsigned int raw_hash = 0; |
752 unsigned int raw_hash = 0; |
730 raw_hash += ((unsigned int)(uintptr_t)name) >> (LogHeapWordSize + 2); |
753 raw_hash += ((unsigned int)(uintptr_t)name) >> (LogHeapWordSize + 2); |
731 raw_hash += ((unsigned int)(uintptr_t)sig) >> LogHeapWordSize; |
754 raw_hash += ((unsigned int)(uintptr_t)sig) >> LogHeapWordSize; |
732 |
755 |
733 return (raw_hash + (unsigned int)(uintptr_t)name) % HASH_ROW_SIZE; |
756 return (raw_hash + (unsigned int)(uintptr_t)name) % HASH_ROW_SIZE; |
740 |
763 |
741 // Return false if the name/sig combination is found in table. |
764 // Return false if the name/sig combination is found in table. |
742 // Return true if no duplicate is found. And name/sig is added as a new entry in table. |
765 // Return true if no duplicate is found. And name/sig is added as a new entry in table. |
743 // The old format checker uses heap sort to find duplicates. |
766 // The old format checker uses heap sort to find duplicates. |
744 // NOTE: caller should guarantee that GC doesn't happen during the life cycle |
767 // NOTE: caller should guarantee that GC doesn't happen during the life cycle |
745 // of table since we don't expect symbolOop's to move. |
768 // of table since we don't expect Symbol*'s to move. |
746 bool put_after_lookup(symbolOop name, symbolOop sig, NameSigHash** table) { |
769 bool put_after_lookup(Symbol* name, Symbol* sig, NameSigHash** table) { |
747 assert(name != NULL, "name in constant pool is NULL"); |
770 assert(name != NULL, "name in constant pool is NULL"); |
748 |
771 |
749 // First lookup for duplicates |
772 // First lookup for duplicates |
750 int index = hash(name, sig); |
773 int index = hash(name, sig); |
751 NameSigHash* entry = table[index]; |
774 NameSigHash* entry = table[index]; |
771 |
794 |
772 objArrayHandle ClassFileParser::parse_interfaces(constantPoolHandle cp, |
795 objArrayHandle ClassFileParser::parse_interfaces(constantPoolHandle cp, |
773 int length, |
796 int length, |
774 Handle class_loader, |
797 Handle class_loader, |
775 Handle protection_domain, |
798 Handle protection_domain, |
776 symbolHandle class_name, |
799 Symbol* class_name, |
777 TRAPS) { |
800 TRAPS) { |
778 ClassFileStream* cfs = stream(); |
801 ClassFileStream* cfs = stream(); |
779 assert(length > 0, "only called for length>0"); |
802 assert(length > 0, "only called for length>0"); |
780 objArrayHandle nullHandle; |
803 objArrayHandle nullHandle; |
781 objArrayOop interface_oop = oopFactory::new_system_objArray(length, CHECK_(nullHandle)); |
804 objArrayOop interface_oop = oopFactory::new_system_objArray(length, CHECK_(nullHandle)); |
791 "Interface name has bad constant pool index %u in class file %s", |
814 "Interface name has bad constant pool index %u in class file %s", |
792 interface_index, CHECK_(nullHandle)); |
815 interface_index, CHECK_(nullHandle)); |
793 if (cp->tag_at(interface_index).is_klass()) { |
816 if (cp->tag_at(interface_index).is_klass()) { |
794 interf = KlassHandle(THREAD, cp->resolved_klass_at(interface_index)); |
817 interf = KlassHandle(THREAD, cp->resolved_klass_at(interface_index)); |
795 } else { |
818 } else { |
796 symbolHandle unresolved_klass (THREAD, cp->klass_name_at(interface_index)); |
819 Symbol* unresolved_klass = cp->klass_name_at(interface_index); |
797 |
820 |
798 // Don't need to check legal name because it's checked when parsing constant pool. |
821 // Don't need to check legal name because it's checked when parsing constant pool. |
799 // But need to make sure it's not an array type. |
822 // But need to make sure it's not an array type. |
800 guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY, |
823 guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY, |
801 "Bad interface name in class file %s", CHECK_(nullHandle)); |
824 "Bad interface name in class file %s", CHECK_(nullHandle)); |
828 bool dup = false; |
851 bool dup = false; |
829 { |
852 { |
830 debug_only(No_Safepoint_Verifier nsv;) |
853 debug_only(No_Safepoint_Verifier nsv;) |
831 for (index = 0; index < length; index++) { |
854 for (index = 0; index < length; index++) { |
832 klassOop k = (klassOop)interfaces->obj_at(index); |
855 klassOop k = (klassOop)interfaces->obj_at(index); |
833 symbolOop name = instanceKlass::cast(k)->name(); |
856 Symbol* name = instanceKlass::cast(k)->name(); |
834 // If no duplicates, add (name, NULL) in hashtable interface_names. |
857 // If no duplicates, add (name, NULL) in hashtable interface_names. |
835 if (!put_after_lookup(name, NULL, interface_names)) { |
858 if (!put_after_lookup(name, NULL, interface_names)) { |
836 dup = true; |
859 dup = true; |
837 break; |
860 break; |
838 } |
861 } |
906 check_property(valid_cp_range(attribute_name_index, cp->length()) && |
929 check_property(valid_cp_range(attribute_name_index, cp->length()) && |
907 cp->tag_at(attribute_name_index).is_utf8(), |
930 cp->tag_at(attribute_name_index).is_utf8(), |
908 "Invalid field attribute index %u in class file %s", |
931 "Invalid field attribute index %u in class file %s", |
909 attribute_name_index, |
932 attribute_name_index, |
910 CHECK); |
933 CHECK); |
911 symbolOop attribute_name = cp->symbol_at(attribute_name_index); |
934 Symbol* attribute_name = cp->symbol_at(attribute_name_index); |
912 if (is_static && attribute_name == vmSymbols::tag_constant_value()) { |
935 if (is_static && attribute_name == vmSymbols::tag_constant_value()) { |
913 // ignore if non-static |
936 // ignore if non-static |
914 if (constantvalue_index != 0) { |
937 if (constantvalue_index != 0) { |
915 classfile_parse_error("Duplicate ConstantValue attribute in class file %s", CHECK); |
938 classfile_parse_error("Duplicate ConstantValue attribute in class file %s", CHECK); |
916 } |
939 } |
1029 int cp_size = cp->length(); |
1052 int cp_size = cp->length(); |
1030 check_property( |
1053 check_property( |
1031 valid_cp_range(name_index, cp_size) && cp->tag_at(name_index).is_utf8(), |
1054 valid_cp_range(name_index, cp_size) && cp->tag_at(name_index).is_utf8(), |
1032 "Invalid constant pool index %u for field name in class file %s", |
1055 "Invalid constant pool index %u for field name in class file %s", |
1033 name_index, CHECK_(nullHandle)); |
1056 name_index, CHECK_(nullHandle)); |
1034 symbolHandle name(THREAD, cp->symbol_at(name_index)); |
1057 Symbol* name = cp->symbol_at(name_index); |
1035 verify_legal_field_name(name, CHECK_(nullHandle)); |
1058 verify_legal_field_name(name, CHECK_(nullHandle)); |
1036 |
1059 |
1037 u2 signature_index = cfs->get_u2_fast(); |
1060 u2 signature_index = cfs->get_u2_fast(); |
1038 check_property( |
1061 check_property( |
1039 valid_cp_range(signature_index, cp_size) && |
1062 valid_cp_range(signature_index, cp_size) && |
1040 cp->tag_at(signature_index).is_utf8(), |
1063 cp->tag_at(signature_index).is_utf8(), |
1041 "Invalid constant pool index %u for field signature in class file %s", |
1064 "Invalid constant pool index %u for field signature in class file %s", |
1042 signature_index, CHECK_(nullHandle)); |
1065 signature_index, CHECK_(nullHandle)); |
1043 symbolHandle sig(THREAD, cp->symbol_at(signature_index)); |
1066 Symbol* sig = cp->symbol_at(signature_index); |
1044 verify_legal_field_signature(name, sig, CHECK_(nullHandle)); |
1067 verify_legal_field_signature(name, sig, CHECK_(nullHandle)); |
1045 |
1068 |
1046 u2 constantvalue_index = 0; |
1069 u2 constantvalue_index = 0; |
1047 bool is_synthetic = false; |
1070 bool is_synthetic = false; |
1048 u2 generic_signature_index = 0; |
1071 u2 generic_signature_index = 0; |
1164 bool dup = false; |
1187 bool dup = false; |
1165 { |
1188 { |
1166 debug_only(No_Safepoint_Verifier nsv;) |
1189 debug_only(No_Safepoint_Verifier nsv;) |
1167 for (int i = 0; i < length*instanceKlass::next_offset; i += instanceKlass::next_offset) { |
1190 for (int i = 0; i < length*instanceKlass::next_offset; i += instanceKlass::next_offset) { |
1168 int name_index = fields->ushort_at(i + instanceKlass::name_index_offset); |
1191 int name_index = fields->ushort_at(i + instanceKlass::name_index_offset); |
1169 symbolOop name = cp->symbol_at(name_index); |
1192 Symbol* name = cp->symbol_at(name_index); |
1170 int sig_index = fields->ushort_at(i + instanceKlass::signature_index_offset); |
1193 int sig_index = fields->ushort_at(i + instanceKlass::signature_index_offset); |
1171 symbolOop sig = cp->symbol_at(sig_index); |
1194 Symbol* sig = cp->symbol_at(sig_index); |
1172 // If no duplicates, add name/signature in hashtable names_and_sigs. |
1195 // If no duplicates, add name/signature in hashtable names_and_sigs. |
1173 if (!put_after_lookup(name, sig, names_and_sigs)) { |
1196 if (!put_after_lookup(name, sig, names_and_sigs)) { |
1174 dup = true; |
1197 dup = true; |
1175 break; |
1198 break; |
1176 } |
1199 } |
1420 valid_cp_range(descriptor_index, cp_size) && |
1443 valid_cp_range(descriptor_index, cp_size) && |
1421 cp->tag_at(descriptor_index).is_utf8(), |
1444 cp->tag_at(descriptor_index).is_utf8(), |
1422 "Signature index %u in %s has bad constant type in class file %s", |
1445 "Signature index %u in %s has bad constant type in class file %s", |
1423 descriptor_index, tbl_name, CHECK_NULL); |
1446 descriptor_index, tbl_name, CHECK_NULL); |
1424 |
1447 |
1425 symbolHandle name(THREAD, cp->symbol_at(name_index)); |
1448 Symbol* name = cp->symbol_at(name_index); |
1426 symbolHandle sig(THREAD, cp->symbol_at(descriptor_index)); |
1449 Symbol* sig = cp->symbol_at(descriptor_index); |
1427 verify_legal_field_name(name, CHECK_NULL); |
1450 verify_legal_field_name(name, CHECK_NULL); |
1428 u2 extra_slot = 0; |
1451 u2 extra_slot = 0; |
1429 if (!isLVTT) { |
1452 if (!isLVTT) { |
1430 verify_legal_field_signature(name, sig, CHECK_NULL); |
1453 verify_legal_field_signature(name, sig, CHECK_NULL); |
1431 |
1454 |
1432 // 4894874: check special cases for double and long local variables |
1455 // 4894874: check special cases for double and long local variables |
1433 if (sig() == vmSymbols::type_signature(T_DOUBLE) || |
1456 if (sig == vmSymbols::type_signature(T_DOUBLE) || |
1434 sig() == vmSymbols::type_signature(T_LONG)) { |
1457 sig == vmSymbols::type_signature(T_LONG)) { |
1435 extra_slot = 1; |
1458 extra_slot = 1; |
1436 } |
1459 } |
1437 } |
1460 } |
1438 guarantee_property((index + extra_slot) < max_locals, |
1461 guarantee_property((index + extra_slot) < max_locals, |
1439 "Invalid index %u in %s in class file %s", |
1462 "Invalid index %u in %s in class file %s", |
1537 } |
1560 } |
1538 return checked_exceptions_start; |
1561 return checked_exceptions_start; |
1539 } |
1562 } |
1540 |
1563 |
1541 void ClassFileParser::throwIllegalSignature( |
1564 void ClassFileParser::throwIllegalSignature( |
1542 const char* type, symbolHandle name, symbolHandle sig, TRAPS) { |
1565 const char* type, Symbol* name, Symbol* sig, TRAPS) { |
1543 ResourceMark rm(THREAD); |
1566 ResourceMark rm(THREAD); |
1544 Exceptions::fthrow(THREAD_AND_LOCATION, |
1567 Exceptions::fthrow(THREAD_AND_LOCATION, |
1545 vmSymbols::java_lang_ClassFormatError(), |
1568 vmSymbols::java_lang_ClassFormatError(), |
1546 "%s \"%s\" in class %s has illegal signature \"%s\"", type, |
1569 "%s \"%s\" in class %s has illegal signature \"%s\"", type, |
1547 name->as_C_string(), _class_name->as_C_string(), sig->as_C_string()); |
1570 name->as_C_string(), _class_name->as_C_string(), sig->as_C_string()); |
1578 check_property( |
1601 check_property( |
1579 valid_cp_range(name_index, cp_size) && |
1602 valid_cp_range(name_index, cp_size) && |
1580 cp->tag_at(name_index).is_utf8(), |
1603 cp->tag_at(name_index).is_utf8(), |
1581 "Illegal constant pool index %u for method name in class file %s", |
1604 "Illegal constant pool index %u for method name in class file %s", |
1582 name_index, CHECK_(nullHandle)); |
1605 name_index, CHECK_(nullHandle)); |
1583 symbolHandle name(THREAD, cp->symbol_at(name_index)); |
1606 Symbol* name = cp->symbol_at(name_index); |
1584 verify_legal_method_name(name, CHECK_(nullHandle)); |
1607 verify_legal_method_name(name, CHECK_(nullHandle)); |
1585 |
1608 |
1586 u2 signature_index = cfs->get_u2_fast(); |
1609 u2 signature_index = cfs->get_u2_fast(); |
1587 guarantee_property( |
1610 guarantee_property( |
1588 valid_cp_range(signature_index, cp_size) && |
1611 valid_cp_range(signature_index, cp_size) && |
1589 cp->tag_at(signature_index).is_utf8(), |
1612 cp->tag_at(signature_index).is_utf8(), |
1590 "Illegal constant pool index %u for method signature in class file %s", |
1613 "Illegal constant pool index %u for method signature in class file %s", |
1591 signature_index, CHECK_(nullHandle)); |
1614 signature_index, CHECK_(nullHandle)); |
1592 symbolHandle signature(THREAD, cp->symbol_at(signature_index)); |
1615 Symbol* signature = cp->symbol_at(signature_index); |
1593 |
1616 |
1594 AccessFlags access_flags; |
1617 AccessFlags access_flags; |
1595 if (name == vmSymbols::class_initializer_name()) { |
1618 if (name == vmSymbols::class_initializer_name()) { |
1596 // We ignore the access flags for a class initializer. (JVM Spec. p. 116) |
1619 // We ignore the access flags for a class initializer. (JVM Spec. p. 116) |
1597 flags = JVM_ACC_STATIC; |
1620 flags = JVM_ACC_STATIC; |
1658 valid_cp_range(method_attribute_name_index, cp_size) && |
1681 valid_cp_range(method_attribute_name_index, cp_size) && |
1659 cp->tag_at(method_attribute_name_index).is_utf8(), |
1682 cp->tag_at(method_attribute_name_index).is_utf8(), |
1660 "Invalid method attribute name index %u in class file %s", |
1683 "Invalid method attribute name index %u in class file %s", |
1661 method_attribute_name_index, CHECK_(nullHandle)); |
1684 method_attribute_name_index, CHECK_(nullHandle)); |
1662 |
1685 |
1663 symbolOop method_attribute_name = cp->symbol_at(method_attribute_name_index); |
1686 Symbol* method_attribute_name = cp->symbol_at(method_attribute_name_index); |
1664 if (method_attribute_name == vmSymbols::tag_code()) { |
1687 if (method_attribute_name == vmSymbols::tag_code()) { |
1665 // Parse Code attribute |
1688 // Parse Code attribute |
1666 if (_need_verify) { |
1689 if (_need_verify) { |
1667 guarantee_property(!access_flags.is_native() && !access_flags.is_abstract(), |
1690 guarantee_property(!access_flags.is_native() && !access_flags.is_abstract(), |
1668 "Code attribute in native or abstract methods in class file %s", |
1691 "Code attribute in native or abstract methods in class file %s", |
2055 annotation_default_length, |
2078 annotation_default_length, |
2056 NULL, |
2079 NULL, |
2057 0, |
2080 0, |
2058 CHECK_(nullHandle)); |
2081 CHECK_(nullHandle)); |
2059 |
2082 |
2060 if (name() == vmSymbols::finalize_method_name() && |
2083 if (name == vmSymbols::finalize_method_name() && |
2061 signature() == vmSymbols::void_method_signature()) { |
2084 signature == vmSymbols::void_method_signature()) { |
2062 if (m->is_empty_method()) { |
2085 if (m->is_empty_method()) { |
2063 _has_empty_finalizer = true; |
2086 _has_empty_finalizer = true; |
2064 } else { |
2087 } else { |
2065 _has_finalizer = true; |
2088 _has_finalizer = true; |
2066 } |
2089 } |
2067 } |
2090 } |
2068 if (name() == vmSymbols::object_initializer_name() && |
2091 if (name == vmSymbols::object_initializer_name() && |
2069 signature() == vmSymbols::void_method_signature() && |
2092 signature == vmSymbols::void_method_signature() && |
2070 m->is_vanilla_constructor()) { |
2093 m->is_vanilla_constructor()) { |
2071 _has_vanilla_constructor = true; |
2094 _has_vanilla_constructor = true; |
2072 } |
2095 } |
2073 |
2096 |
2074 if (EnableMethodHandles && (m->is_method_handle_invoke() || |
2097 if (EnableMethodHandles && (m->is_method_handle_invoke() || |
2191 assert(!m->valid_vtable_index(), "vtable index should not be set"); |
2214 assert(!m->valid_vtable_index(), "vtable index should not be set"); |
2192 m->set_vtable_index(index); |
2215 m->set_vtable_index(index); |
2193 } |
2216 } |
2194 } |
2217 } |
2195 // Sort method array by ascending method name (for faster lookups & vtable construction) |
2218 // Sort method array by ascending method name (for faster lookups & vtable construction) |
2196 // Note that the ordering is not alphabetical, see symbolOopDesc::fast_compare |
2219 // Note that the ordering is not alphabetical, see Symbol::fast_compare |
2197 methodOopDesc::sort_methods(methods(), |
2220 methodOopDesc::sort_methods(methods(), |
2198 methods_annotations(), |
2221 methods_annotations(), |
2199 methods_parameter_annotations(), |
2222 methods_parameter_annotations(), |
2200 methods_default_annotations()); |
2223 methods_default_annotations()); |
2201 |
2224 |
2240 |
2263 |
2241 // Don't bother storing it if there is no way to retrieve it |
2264 // Don't bother storing it if there is no way to retrieve it |
2242 if (JvmtiExport::can_get_source_debug_extension()) { |
2265 if (JvmtiExport::can_get_source_debug_extension()) { |
2243 // Optimistically assume that only 1 byte UTF format is used |
2266 // Optimistically assume that only 1 byte UTF format is used |
2244 // (common case) |
2267 // (common case) |
2245 symbolOop sde_symbol = oopFactory::new_symbol((char*)sde_buffer, |
2268 TempNewSymbol sde_symbol = SymbolTable::new_symbol((const char*)sde_buffer, length, CHECK); |
2246 length, CHECK); |
|
2247 k->set_source_debug_extension(sde_symbol); |
2269 k->set_source_debug_extension(sde_symbol); |
|
2270 // Note that set_source_debug_extension() increments the reference count |
|
2271 // for its copy of the Symbol*, so use a TempNewSymbol here. |
2248 } |
2272 } |
2249 // Got utf8 string, set stream position forward |
2273 // Got utf8 string, set stream position forward |
2250 cfs->skip_u1(length, CHECK); |
2274 cfs->skip_u1(length, CHECK); |
2251 } |
2275 } |
2252 |
2276 |
2438 check_property( |
2462 check_property( |
2439 valid_cp_range(attribute_name_index, cp->length()) && |
2463 valid_cp_range(attribute_name_index, cp->length()) && |
2440 cp->tag_at(attribute_name_index).is_utf8(), |
2464 cp->tag_at(attribute_name_index).is_utf8(), |
2441 "Attribute name has bad constant pool index %u in class file %s", |
2465 "Attribute name has bad constant pool index %u in class file %s", |
2442 attribute_name_index, CHECK); |
2466 attribute_name_index, CHECK); |
2443 symbolOop tag = cp->symbol_at(attribute_name_index); |
2467 Symbol* tag = cp->symbol_at(attribute_name_index); |
2444 if (tag == vmSymbols::tag_source_file()) { |
2468 if (tag == vmSymbols::tag_source_file()) { |
2445 // Check for SourceFile tag |
2469 // Check for SourceFile tag |
2446 if (_need_verify) { |
2470 if (_need_verify) { |
2447 guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s", CHECK); |
2471 guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s", CHECK); |
2448 } |
2472 } |
2605 h_k()->long_field_put(fd->offset(), fd->long_initial_value()); |
2629 h_k()->long_field_put(fd->offset(), fd->long_initial_value()); |
2606 break; |
2630 break; |
2607 case T_OBJECT: |
2631 case T_OBJECT: |
2608 { |
2632 { |
2609 #ifdef ASSERT |
2633 #ifdef ASSERT |
2610 symbolOop sym = oopFactory::new_symbol("Ljava/lang/String;", CHECK); |
2634 TempNewSymbol sym = SymbolTable::new_symbol("Ljava/lang/String;", CHECK); |
2611 assert(fd->signature() == sym, "just checking"); |
2635 assert(fd->signature() == sym, "just checking"); |
2612 #endif |
2636 #endif |
2613 oop string = fd->string_initial_value(CHECK); |
2637 oop string = fd->string_initial_value(CHECK); |
2614 h_k()->obj_field_put(fd->offset(), string); |
2638 h_k()->obj_field_put(fd->offset(), string); |
2615 } |
2639 } |
2648 for (int i = 0; i < n; i += instanceKlass::next_offset ) { |
2672 for (int i = 0; i < n; i += instanceKlass::next_offset ) { |
2649 int name_index = |
2673 int name_index = |
2650 (*fields_ptr)()->ushort_at(i + instanceKlass::name_index_offset); |
2674 (*fields_ptr)()->ushort_at(i + instanceKlass::name_index_offset); |
2651 int sig_index = |
2675 int sig_index = |
2652 (*fields_ptr)()->ushort_at(i + instanceKlass::signature_index_offset); |
2676 (*fields_ptr)()->ushort_at(i + instanceKlass::signature_index_offset); |
2653 symbolOop f_name = cp->symbol_at(name_index); |
2677 Symbol* f_name = cp->symbol_at(name_index); |
2654 symbolOop f_sig = cp->symbol_at(sig_index); |
2678 Symbol* f_sig = cp->symbol_at(sig_index); |
2655 if (f_sig == vmSymbols::reference_signature() && reference_index == 0) { |
2679 if (f_sig == vmSymbols::reference_signature() && reference_index == 0) { |
2656 // Save the index for reference signature for later use. |
2680 // Save the index for reference signature for later use. |
2657 // The fake discovered field does not entries in the |
2681 // The fake discovered field does not entries in the |
2658 // constant pool so the index for its signature cannot |
2682 // constant pool so the index for its signature cannot |
2659 // be extracted from the constant pool. It will need |
2683 // be extracted from the constant pool. It will need |
2803 bool found_vmentry = false; |
2827 bool found_vmentry = false; |
2804 for (int i = 0; i < fields->length(); i += instanceKlass::next_offset) { |
2828 for (int i = 0; i < fields->length(); i += instanceKlass::next_offset) { |
2805 int name_index = fields->ushort_at(i + instanceKlass::name_index_offset); |
2829 int name_index = fields->ushort_at(i + instanceKlass::name_index_offset); |
2806 int sig_index = fields->ushort_at(i + instanceKlass::signature_index_offset); |
2830 int sig_index = fields->ushort_at(i + instanceKlass::signature_index_offset); |
2807 int acc_flags = fields->ushort_at(i + instanceKlass::access_flags_offset); |
2831 int acc_flags = fields->ushort_at(i + instanceKlass::access_flags_offset); |
2808 symbolOop f_name = cp->symbol_at(name_index); |
2832 Symbol* f_name = cp->symbol_at(name_index); |
2809 symbolOop f_sig = cp->symbol_at(sig_index); |
2833 Symbol* f_sig = cp->symbol_at(sig_index); |
2810 |
|
2811 if (f_name == vmSymbols::vmentry_name() && (acc_flags & JVM_ACC_STATIC) == 0) { |
2834 if (f_name == vmSymbols::vmentry_name() && (acc_flags & JVM_ACC_STATIC) == 0) { |
2812 if (f_sig == vmSymbols::machine_word_signature()) { |
2835 if (f_sig == vmSymbols::machine_word_signature()) { |
2813 // If the signature of vmentry is already changed, we're done. |
2836 // If the signature of vmentry is already changed, we're done. |
2814 found_vmentry = true; |
2837 found_vmentry = true; |
2815 break; |
2838 break; |
2839 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), |
2862 THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), |
2840 "missing vmentry byte field in java.dyn.MethodHandle"); |
2863 "missing vmentry byte field in java.dyn.MethodHandle"); |
2841 } |
2864 } |
2842 |
2865 |
2843 |
2866 |
2844 instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, |
2867 instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, |
2845 Handle class_loader, |
2868 Handle class_loader, |
2846 Handle protection_domain, |
2869 Handle protection_domain, |
2847 KlassHandle host_klass, |
2870 KlassHandle host_klass, |
2848 GrowableArray<Handle>* cp_patches, |
2871 GrowableArray<Handle>* cp_patches, |
2849 symbolHandle& parsed_name, |
2872 TempNewSymbol& parsed_name, |
2850 bool verify, |
2873 bool verify, |
2851 TRAPS) { |
2874 TRAPS) { |
2852 // So that JVMTI can cache class file in the state before retransformable agents |
2875 // So that JVMTI can cache class file in the state before retransformable agents |
2853 // have modified it |
2876 // have modified it |
2854 unsigned char *cached_class_file_bytes = NULL; |
2877 unsigned char *cached_class_file_bytes = NULL; |
2897 |
2920 |
2898 // Set the verify flag in stream |
2921 // Set the verify flag in stream |
2899 cfs->set_verify(_need_verify); |
2922 cfs->set_verify(_need_verify); |
2900 |
2923 |
2901 // Save the class file name for easier error message printing. |
2924 // Save the class file name for easier error message printing. |
2902 _class_name = name.not_null()? name : vmSymbolHandles::unknown_class_name(); |
2925 _class_name = (name != NULL) ? name : vmSymbols::unknown_class_name(); |
2903 |
2926 |
2904 cfs->guarantee_more(8, CHECK_(nullHandle)); // magic, major, minor |
2927 cfs->guarantee_more(8, CHECK_(nullHandle)); // magic, major, minor |
2905 // Magic value |
2928 // Magic value |
2906 u4 magic = cfs->get_u4_fast(); |
2929 u4 magic = cfs->get_u4_fast(); |
2907 guarantee_property(magic == JAVA_CLASSFILE_MAGIC, |
2930 guarantee_property(magic == JAVA_CLASSFILE_MAGIC, |
2912 u2 minor_version = cfs->get_u2_fast(); |
2935 u2 minor_version = cfs->get_u2_fast(); |
2913 u2 major_version = cfs->get_u2_fast(); |
2936 u2 major_version = cfs->get_u2_fast(); |
2914 |
2937 |
2915 // Check version numbers - we check this even with verifier off |
2938 // Check version numbers - we check this even with verifier off |
2916 if (!is_supported_version(major_version, minor_version)) { |
2939 if (!is_supported_version(major_version, minor_version)) { |
2917 if (name.is_null()) { |
2940 if (name == NULL) { |
2918 Exceptions::fthrow( |
2941 Exceptions::fthrow( |
2919 THREAD_AND_LOCATION, |
2942 THREAD_AND_LOCATION, |
2920 vmSymbolHandles::java_lang_UnsupportedClassVersionError(), |
2943 vmSymbols::java_lang_UnsupportedClassVersionError(), |
2921 "Unsupported major.minor version %u.%u", |
2944 "Unsupported major.minor version %u.%u", |
2922 major_version, |
2945 major_version, |
2923 minor_version); |
2946 minor_version); |
2924 } else { |
2947 } else { |
2925 ResourceMark rm(THREAD); |
2948 ResourceMark rm(THREAD); |
2926 Exceptions::fthrow( |
2949 Exceptions::fthrow( |
2927 THREAD_AND_LOCATION, |
2950 THREAD_AND_LOCATION, |
2928 vmSymbolHandles::java_lang_UnsupportedClassVersionError(), |
2951 vmSymbols::java_lang_UnsupportedClassVersionError(), |
2929 "%s : Unsupported major.minor version %u.%u", |
2952 "%s : Unsupported major.minor version %u.%u", |
2930 name->as_C_string(), |
2953 name->as_C_string(), |
2931 major_version, |
2954 major_version, |
2932 minor_version); |
2955 minor_version); |
2933 } |
2956 } |
2942 // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376) |
2965 // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376) |
2943 _relax_verify = Verifier::relax_verify_for(class_loader()); |
2966 _relax_verify = Verifier::relax_verify_for(class_loader()); |
2944 |
2967 |
2945 // Constant pool |
2968 // Constant pool |
2946 constantPoolHandle cp = parse_constant_pool(CHECK_(nullHandle)); |
2969 constantPoolHandle cp = parse_constant_pool(CHECK_(nullHandle)); |
|
2970 ConstantPoolCleaner error_handler(cp); // set constant pool to be cleaned up. |
|
2971 |
2947 int cp_size = cp->length(); |
2972 int cp_size = cp->length(); |
2948 |
2973 |
2949 cfs->guarantee_more(8, CHECK_(nullHandle)); // flags, this_class, super_class, infs_len |
2974 cfs->guarantee_more(8, CHECK_(nullHandle)); // flags, this_class, super_class, infs_len |
2950 |
2975 |
2951 // Access flags |
2976 // Access flags |
2966 valid_cp_range(this_class_index, cp_size) && |
2991 valid_cp_range(this_class_index, cp_size) && |
2967 cp->tag_at(this_class_index).is_unresolved_klass(), |
2992 cp->tag_at(this_class_index).is_unresolved_klass(), |
2968 "Invalid this class index %u in constant pool in class file %s", |
2993 "Invalid this class index %u in constant pool in class file %s", |
2969 this_class_index, CHECK_(nullHandle)); |
2994 this_class_index, CHECK_(nullHandle)); |
2970 |
2995 |
2971 symbolHandle class_name (THREAD, cp->unresolved_klass_at(this_class_index)); |
2996 Symbol* class_name = cp->unresolved_klass_at(this_class_index); |
2972 assert(class_name.not_null(), "class_name can't be null"); |
2997 assert(class_name != NULL, "class_name can't be null"); |
2973 |
2998 |
2974 // It's important to set parsed_name *before* resolving the super class. |
2999 // It's important to set parsed_name *before* resolving the super class. |
2975 // (it's used for cleanup by the caller if parsing fails) |
3000 // (it's used for cleanup by the caller if parsing fails) |
2976 parsed_name = class_name; |
3001 parsed_name = class_name; |
|
3002 // parsed_name is returned and can be used if there's an error, so add to |
|
3003 // its reference count. Caller will decrement the refcount. |
|
3004 parsed_name->increment_refcount(); |
2977 |
3005 |
2978 // Update _class_name which could be null previously to be class_name |
3006 // Update _class_name which could be null previously to be class_name |
2979 _class_name = class_name; |
3007 _class_name = class_name; |
2980 |
3008 |
2981 // Don't need to check whether this class name is legal or not. |
3009 // Don't need to check whether this class name is legal or not. |
2991 |
3019 |
2992 // release all handles when parsing is done |
3020 // release all handles when parsing is done |
2993 { HandleMark hm(THREAD); |
3021 { HandleMark hm(THREAD); |
2994 |
3022 |
2995 // Checks if name in class file matches requested name |
3023 // Checks if name in class file matches requested name |
2996 if (name.not_null() && class_name() != name()) { |
3024 if (name != NULL && class_name != name) { |
2997 ResourceMark rm(THREAD); |
3025 ResourceMark rm(THREAD); |
2998 Exceptions::fthrow( |
3026 Exceptions::fthrow( |
2999 THREAD_AND_LOCATION, |
3027 THREAD_AND_LOCATION, |
3000 vmSymbolHandles::java_lang_NoClassDefFoundError(), |
3028 vmSymbols::java_lang_NoClassDefFoundError(), |
3001 "%s (wrong name: %s)", |
3029 "%s (wrong name: %s)", |
3002 name->as_C_string(), |
3030 name->as_C_string(), |
3003 class_name->as_C_string() |
3031 class_name->as_C_string() |
3004 ); |
3032 ); |
3005 return nullHandle; |
3033 return nullHandle; |
3006 } |
3034 } |
3007 |
3035 |
3008 if (TraceClassLoadingPreorder) { |
3036 if (TraceClassLoadingPreorder) { |
3009 tty->print("[Loading %s", name()->as_klass_external_name()); |
3037 tty->print("[Loading %s", name->as_klass_external_name()); |
3010 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); |
3038 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); |
3011 tty->print_cr("]"); |
3039 tty->print_cr("]"); |
3012 } |
3040 } |
3013 |
3041 |
3014 u2 super_class_index = cfs->get_u2_fast(); |
3042 u2 super_class_index = cfs->get_u2_fast(); |
3015 if (super_class_index == 0) { |
3043 if (super_class_index == 0) { |
3016 check_property(class_name() == vmSymbols::java_lang_Object(), |
3044 check_property(class_name == vmSymbols::java_lang_Object(), |
3017 "Invalid superclass index %u in class file %s", |
3045 "Invalid superclass index %u in class file %s", |
3018 super_class_index, |
3046 super_class_index, |
3019 CHECK_(nullHandle)); |
3047 CHECK_(nullHandle)); |
3020 } else { |
3048 } else { |
3021 check_property(valid_cp_range(super_class_index, cp_size) && |
3049 check_property(valid_cp_range(super_class_index, cp_size) && |
3073 objArrayHandle methods_parameter_annotations(THREAD, methods_parameter_annotations_oop); |
3101 objArrayHandle methods_parameter_annotations(THREAD, methods_parameter_annotations_oop); |
3074 objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop); |
3102 objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop); |
3075 |
3103 |
3076 // We check super class after class file is parsed and format is checked |
3104 // We check super class after class file is parsed and format is checked |
3077 if (super_class_index > 0 && super_klass.is_null()) { |
3105 if (super_class_index > 0 && super_klass.is_null()) { |
3078 symbolHandle sk (THREAD, cp->klass_name_at(super_class_index)); |
3106 Symbol* sk = cp->klass_name_at(super_class_index); |
3079 if (access_flags.is_interface()) { |
3107 if (access_flags.is_interface()) { |
3080 // Before attempting to resolve the superclass, check for class format |
3108 // Before attempting to resolve the superclass, check for class format |
3081 // errors not checked yet. |
3109 // errors not checked yet. |
3082 guarantee_property(sk() == vmSymbols::java_lang_Object(), |
3110 guarantee_property(sk == vmSymbols::java_lang_Object(), |
3083 "Interfaces must have java.lang.Object as superclass in class file %s", |
3111 "Interfaces must have java.lang.Object as superclass in class file %s", |
3084 CHECK_(nullHandle)); |
3112 CHECK_(nullHandle)); |
3085 } |
3113 } |
3086 klassOop k = SystemDictionary::resolve_super_or_fail(class_name, |
3114 klassOop k = SystemDictionary::resolve_super_or_fail(class_name, |
3087 sk, |
3115 sk, |
3098 if (super_klass.not_null()) { |
3126 if (super_klass.not_null()) { |
3099 if (super_klass->is_interface()) { |
3127 if (super_klass->is_interface()) { |
3100 ResourceMark rm(THREAD); |
3128 ResourceMark rm(THREAD); |
3101 Exceptions::fthrow( |
3129 Exceptions::fthrow( |
3102 THREAD_AND_LOCATION, |
3130 THREAD_AND_LOCATION, |
3103 vmSymbolHandles::java_lang_IncompatibleClassChangeError(), |
3131 vmSymbols::java_lang_IncompatibleClassChangeError(), |
3104 "class %s has interface %s as super class", |
3132 "class %s has interface %s as super class", |
3105 class_name->as_klass_external_name(), |
3133 class_name->as_klass_external_name(), |
3106 super_klass->external_name() |
3134 super_klass->external_name() |
3107 ); |
3135 ); |
3108 return nullHandle; |
3136 return nullHandle; |
3191 first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() + |
3219 first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() + |
3192 nonstatic_field_size * heapOopSize; |
3220 nonstatic_field_size * heapOopSize; |
3193 next_nonstatic_field_offset = first_nonstatic_field_offset; |
3221 next_nonstatic_field_offset = first_nonstatic_field_offset; |
3194 |
3222 |
3195 // Add fake fields for java.lang.Class instances (also see below) |
3223 // Add fake fields for java.lang.Class instances (also see below) |
3196 if (class_name() == vmSymbols::java_lang_Class() && class_loader.is_null()) { |
3224 if (class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) { |
3197 java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle)); |
3225 java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle)); |
3198 } |
3226 } |
3199 |
3227 |
3200 // adjust the vmentry field declaration in java.dyn.MethodHandle |
3228 // adjust the vmentry field declaration in java.dyn.MethodHandle |
3201 if (EnableMethodHandles && class_name() == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) { |
3229 if (EnableMethodHandles && class_name == vmSymbols::sun_dyn_MethodHandleImpl() && class_loader.is_null()) { |
3202 java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
3230 java_dyn_MethodHandle_fix_pre(cp, fields, &fac, CHECK_(nullHandle)); |
3203 } |
3231 } |
3204 |
3232 |
3205 // Add a fake "discovered" field if it is not present |
3233 // Add a fake "discovered" field if it is not present |
3206 // for compatibility with earlier jdk's. |
3234 // for compatibility with earlier jdk's. |
3207 if (class_name() == vmSymbols::java_lang_ref_Reference() |
3235 if (class_name == vmSymbols::java_lang_ref_Reference() |
3208 && class_loader.is_null()) { |
3236 && class_loader.is_null()) { |
3209 java_lang_ref_Reference_fix_pre(&fields, cp, &fac, CHECK_(nullHandle)); |
3237 java_lang_ref_Reference_fix_pre(&fields, cp, &fac, CHECK_(nullHandle)); |
3210 } |
3238 } |
3211 // end of "discovered" field compactibility fix |
3239 // end of "discovered" field compactibility fix |
3212 |
3240 |
3234 nonstatic_oop_counts = NEW_RESOURCE_ARRAY_IN_THREAD( |
3262 nonstatic_oop_counts = NEW_RESOURCE_ARRAY_IN_THREAD( |
3235 THREAD, unsigned int, nonstatic_oop_count + 1); |
3263 THREAD, unsigned int, nonstatic_oop_count + 1); |
3236 |
3264 |
3237 // Add fake fields for java.lang.Class instances (also see above). |
3265 // Add fake fields for java.lang.Class instances (also see above). |
3238 // FieldsAllocationStyle and CompactFields values will be reset to default. |
3266 // FieldsAllocationStyle and CompactFields values will be reset to default. |
3239 if(class_name() == vmSymbols::java_lang_Class() && class_loader.is_null()) { |
3267 if(class_name == vmSymbols::java_lang_Class() && class_loader.is_null()) { |
3240 java_lang_Class_fix_post(&next_nonstatic_field_offset); |
3268 java_lang_Class_fix_post(&next_nonstatic_field_offset); |
3241 nonstatic_oop_offsets[0] = first_nonstatic_field_offset; |
3269 nonstatic_oop_offsets[0] = first_nonstatic_field_offset; |
3242 const uint fake_oop_count = (next_nonstatic_field_offset - |
3270 const uint fake_oop_count = (next_nonstatic_field_offset - |
3243 first_nonstatic_field_offset) / heapOopSize; |
3271 first_nonstatic_field_offset) / heapOopSize; |
3244 nonstatic_oop_counts[0] = fake_oop_count; |
3272 nonstatic_oop_counts[0] = fake_oop_count; |
3277 |
3305 |
3278 // The next classes have predefined hard-coded fields offsets |
3306 // The next classes have predefined hard-coded fields offsets |
3279 // (see in JavaClasses::compute_hard_coded_offsets()). |
3307 // (see in JavaClasses::compute_hard_coded_offsets()). |
3280 // Use default fields allocation order for them. |
3308 // Use default fields allocation order for them. |
3281 if( (allocation_style != 0 || compact_fields ) && class_loader.is_null() && |
3309 if( (allocation_style != 0 || compact_fields ) && class_loader.is_null() && |
3282 (class_name() == vmSymbols::java_lang_AssertionStatusDirectives() || |
3310 (class_name == vmSymbols::java_lang_AssertionStatusDirectives() || |
3283 class_name() == vmSymbols::java_lang_Class() || |
3311 class_name == vmSymbols::java_lang_Class() || |
3284 class_name() == vmSymbols::java_lang_ClassLoader() || |
3312 class_name == vmSymbols::java_lang_ClassLoader() || |
3285 class_name() == vmSymbols::java_lang_ref_Reference() || |
3313 class_name == vmSymbols::java_lang_ref_Reference() || |
3286 class_name() == vmSymbols::java_lang_ref_SoftReference() || |
3314 class_name == vmSymbols::java_lang_ref_SoftReference() || |
3287 class_name() == vmSymbols::java_lang_StackTraceElement() || |
3315 class_name == vmSymbols::java_lang_StackTraceElement() || |
3288 class_name() == vmSymbols::java_lang_String() || |
3316 class_name == vmSymbols::java_lang_String() || |
3289 class_name() == vmSymbols::java_lang_Throwable() || |
3317 class_name == vmSymbols::java_lang_Throwable() || |
3290 class_name() == vmSymbols::java_lang_Boolean() || |
3318 class_name == vmSymbols::java_lang_Boolean() || |
3291 class_name() == vmSymbols::java_lang_Character() || |
3319 class_name == vmSymbols::java_lang_Character() || |
3292 class_name() == vmSymbols::java_lang_Float() || |
3320 class_name == vmSymbols::java_lang_Float() || |
3293 class_name() == vmSymbols::java_lang_Double() || |
3321 class_name == vmSymbols::java_lang_Double() || |
3294 class_name() == vmSymbols::java_lang_Byte() || |
3322 class_name == vmSymbols::java_lang_Byte() || |
3295 class_name() == vmSymbols::java_lang_Short() || |
3323 class_name == vmSymbols::java_lang_Short() || |
3296 class_name() == vmSymbols::java_lang_Integer() || |
3324 class_name == vmSymbols::java_lang_Integer() || |
3297 class_name() == vmSymbols::java_lang_Long())) { |
3325 class_name == vmSymbols::java_lang_Long())) { |
3298 allocation_style = 0; // Allocate oops first |
3326 allocation_style = 0; // Allocate oops first |
3299 compact_fields = false; // Don't compact fields |
3327 compact_fields = false; // Don't compact fields |
3300 } |
3328 } |
3301 |
3329 |
3302 if( allocation_style == 0 ) { |
3330 if( allocation_style == 0 ) { |
3541 this_klass->set_class_loader(class_loader()); |
3569 this_klass->set_class_loader(class_loader()); |
3542 this_klass->set_nonstatic_field_size(nonstatic_field_size); |
3570 this_klass->set_nonstatic_field_size(nonstatic_field_size); |
3543 this_klass->set_has_nonstatic_fields(has_nonstatic_fields); |
3571 this_klass->set_has_nonstatic_fields(has_nonstatic_fields); |
3544 this_klass->set_static_oop_field_size(fac.static_oop_count); |
3572 this_klass->set_static_oop_field_size(fac.static_oop_count); |
3545 cp->set_pool_holder(this_klass()); |
3573 cp->set_pool_holder(this_klass()); |
|
3574 error_handler.set_in_error(false); // turn off error handler for cp |
3546 this_klass->set_constants(cp()); |
3575 this_klass->set_constants(cp()); |
3547 this_klass->set_local_interfaces(local_interfaces()); |
3576 this_klass->set_local_interfaces(local_interfaces()); |
3548 this_klass->set_fields(fields()); |
3577 this_klass->set_fields(fields()); |
3549 this_klass->set_methods(methods()); |
3578 this_klass->set_methods(methods()); |
3550 if (has_final_method) { |
3579 if (has_final_method) { |
3933 if ((super != NULL) && |
3962 if ((super != NULL) && |
3934 (!Reflection::verify_class_access(this_klass->as_klassOop(), super, false))) { |
3963 (!Reflection::verify_class_access(this_klass->as_klassOop(), super, false))) { |
3935 ResourceMark rm(THREAD); |
3964 ResourceMark rm(THREAD); |
3936 Exceptions::fthrow( |
3965 Exceptions::fthrow( |
3937 THREAD_AND_LOCATION, |
3966 THREAD_AND_LOCATION, |
3938 vmSymbolHandles::java_lang_IllegalAccessError(), |
3967 vmSymbols::java_lang_IllegalAccessError(), |
3939 "class %s cannot access its superclass %s", |
3968 "class %s cannot access its superclass %s", |
3940 this_klass->external_name(), |
3969 this_klass->external_name(), |
3941 instanceKlass::cast(super)->external_name() |
3970 instanceKlass::cast(super)->external_name() |
3942 ); |
3971 ); |
3943 return; |
3972 return; |
3953 assert (k != NULL && Klass::cast(k)->is_interface(), "invalid interface"); |
3982 assert (k != NULL && Klass::cast(k)->is_interface(), "invalid interface"); |
3954 if (!Reflection::verify_class_access(this_klass->as_klassOop(), k, false)) { |
3983 if (!Reflection::verify_class_access(this_klass->as_klassOop(), k, false)) { |
3955 ResourceMark rm(THREAD); |
3984 ResourceMark rm(THREAD); |
3956 Exceptions::fthrow( |
3985 Exceptions::fthrow( |
3957 THREAD_AND_LOCATION, |
3986 THREAD_AND_LOCATION, |
3958 vmSymbolHandles::java_lang_IllegalAccessError(), |
3987 vmSymbols::java_lang_IllegalAccessError(), |
3959 "class %s cannot access its superinterface %s", |
3988 "class %s cannot access its superinterface %s", |
3960 this_klass->external_name(), |
3989 this_klass->external_name(), |
3961 instanceKlass::cast(k)->external_name() |
3990 instanceKlass::cast(k)->external_name() |
3962 ); |
3991 ); |
3963 return; |
3992 return; |
3977 // skip private, static and <init> methods |
4006 // skip private, static and <init> methods |
3978 if ((!m->is_private()) && |
4007 if ((!m->is_private()) && |
3979 (!m->is_static()) && |
4008 (!m->is_static()) && |
3980 (m->name() != vmSymbols::object_initializer_name())) { |
4009 (m->name() != vmSymbols::object_initializer_name())) { |
3981 |
4010 |
3982 symbolOop name = m->name(); |
4011 Symbol* name = m->name(); |
3983 symbolOop signature = m->signature(); |
4012 Symbol* signature = m->signature(); |
3984 klassOop k = this_klass->super(); |
4013 klassOop k = this_klass->super(); |
3985 methodOop super_m = NULL; |
4014 methodOop super_m = NULL; |
3986 while (k != NULL) { |
4015 while (k != NULL) { |
3987 // skip supers that don't have final methods. |
4016 // skip supers that don't have final methods. |
3988 if (k->klass_part()->has_final_method()) { |
4017 if (k->klass_part()->has_final_method()) { |
4001 // this class can access super final method and therefore override |
4030 // this class can access super final method and therefore override |
4002 ) { |
4031 ) { |
4003 ResourceMark rm(THREAD); |
4032 ResourceMark rm(THREAD); |
4004 Exceptions::fthrow( |
4033 Exceptions::fthrow( |
4005 THREAD_AND_LOCATION, |
4034 THREAD_AND_LOCATION, |
4006 vmSymbolHandles::java_lang_VerifyError(), |
4035 vmSymbols::java_lang_VerifyError(), |
4007 "class %s overrides final method %s.%s", |
4036 "class %s overrides final method %s.%s", |
4008 this_klass->external_name(), |
4037 this_klass->external_name(), |
4009 name->as_C_string(), |
4038 name->as_C_string(), |
4010 signature->as_C_string() |
4039 signature->as_C_string() |
4011 ); |
4040 ); |
4035 // if m is static and not the init method, throw a verify error |
4064 // if m is static and not the init method, throw a verify error |
4036 if ((m->is_static()) && (m->name() != vmSymbols::class_initializer_name())) { |
4065 if ((m->is_static()) && (m->name() != vmSymbols::class_initializer_name())) { |
4037 ResourceMark rm(THREAD); |
4066 ResourceMark rm(THREAD); |
4038 Exceptions::fthrow( |
4067 Exceptions::fthrow( |
4039 THREAD_AND_LOCATION, |
4068 THREAD_AND_LOCATION, |
4040 vmSymbolHandles::java_lang_VerifyError(), |
4069 vmSymbols::java_lang_VerifyError(), |
4041 "Illegal static method %s in interface %s", |
4070 "Illegal static method %s in interface %s", |
4042 m->name()->as_C_string(), |
4071 m->name()->as_C_string(), |
4043 this_klass->external_name() |
4072 this_klass->external_name() |
4044 ); |
4073 ); |
4045 return; |
4074 return; |
4065 (is_interface && major_gte_15 && (is_super || is_enum)) || |
4094 (is_interface && major_gte_15 && (is_super || is_enum)) || |
4066 (!is_interface && major_gte_15 && is_annotation)) { |
4095 (!is_interface && major_gte_15 && is_annotation)) { |
4067 ResourceMark rm(THREAD); |
4096 ResourceMark rm(THREAD); |
4068 Exceptions::fthrow( |
4097 Exceptions::fthrow( |
4069 THREAD_AND_LOCATION, |
4098 THREAD_AND_LOCATION, |
4070 vmSymbolHandles::java_lang_ClassFormatError(), |
4099 vmSymbols::java_lang_ClassFormatError(), |
4071 "Illegal class modifiers in class %s: 0x%X", |
4100 "Illegal class modifiers in class %s: 0x%X", |
4072 _class_name->as_C_string(), flags |
4101 _class_name->as_C_string(), flags |
4073 ); |
4102 ); |
4074 return; |
4103 return; |
4075 } |
4104 } |
4125 |
4154 |
4126 if (is_illegal) { |
4155 if (is_illegal) { |
4127 ResourceMark rm(THREAD); |
4156 ResourceMark rm(THREAD); |
4128 Exceptions::fthrow( |
4157 Exceptions::fthrow( |
4129 THREAD_AND_LOCATION, |
4158 THREAD_AND_LOCATION, |
4130 vmSymbolHandles::java_lang_ClassFormatError(), |
4159 vmSymbols::java_lang_ClassFormatError(), |
4131 "Illegal field modifiers in class %s: 0x%X", |
4160 "Illegal field modifiers in class %s: 0x%X", |
4132 _class_name->as_C_string(), flags); |
4161 _class_name->as_C_string(), flags); |
4133 return; |
4162 return; |
4134 } |
4163 } |
4135 } |
4164 } |
4136 |
4165 |
4137 void ClassFileParser::verify_legal_method_modifiers( |
4166 void ClassFileParser::verify_legal_method_modifiers( |
4138 jint flags, bool is_interface, symbolHandle name, TRAPS) { |
4167 jint flags, bool is_interface, Symbol* name, TRAPS) { |
4139 if (!_need_verify) { return; } |
4168 if (!_need_verify) { return; } |
4140 |
4169 |
4141 const bool is_public = (flags & JVM_ACC_PUBLIC) != 0; |
4170 const bool is_public = (flags & JVM_ACC_PUBLIC) != 0; |
4142 const bool is_private = (flags & JVM_ACC_PRIVATE) != 0; |
4171 const bool is_private = (flags & JVM_ACC_PRIVATE) != 0; |
4143 const bool is_static = (flags & JVM_ACC_STATIC) != 0; |
4172 const bool is_static = (flags & JVM_ACC_STATIC) != 0; |
4178 |
4207 |
4179 if (is_illegal) { |
4208 if (is_illegal) { |
4180 ResourceMark rm(THREAD); |
4209 ResourceMark rm(THREAD); |
4181 Exceptions::fthrow( |
4210 Exceptions::fthrow( |
4182 THREAD_AND_LOCATION, |
4211 THREAD_AND_LOCATION, |
4183 vmSymbolHandles::java_lang_ClassFormatError(), |
4212 vmSymbols::java_lang_ClassFormatError(), |
4184 "Method %s in class %s has illegal modifiers: 0x%X", |
4213 "Method %s in class %s has illegal modifiers: 0x%X", |
4185 name->as_C_string(), _class_name->as_C_string(), flags); |
4214 name->as_C_string(), _class_name->as_C_string(), flags); |
4186 return; |
4215 return; |
4187 } |
4216 } |
4188 } |
4217 } |
4249 } // end of switch |
4278 } // end of switch |
4250 } // end of for |
4279 } // end of for |
4251 } |
4280 } |
4252 |
4281 |
4253 // Checks if name is a legal class name. |
4282 // Checks if name is a legal class name. |
4254 void ClassFileParser::verify_legal_class_name(symbolHandle name, TRAPS) { |
4283 void ClassFileParser::verify_legal_class_name(Symbol* name, TRAPS) { |
4255 if (!_need_verify || _relax_verify) { return; } |
4284 if (!_need_verify || _relax_verify) { return; } |
4256 |
4285 |
4257 char buf[fixed_buffer_size]; |
4286 char buf[fixed_buffer_size]; |
4258 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4287 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4259 unsigned int length = name->utf8_length(); |
4288 unsigned int length = name->utf8_length(); |
4279 } |
4308 } |
4280 if (!legal) { |
4309 if (!legal) { |
4281 ResourceMark rm(THREAD); |
4310 ResourceMark rm(THREAD); |
4282 Exceptions::fthrow( |
4311 Exceptions::fthrow( |
4283 THREAD_AND_LOCATION, |
4312 THREAD_AND_LOCATION, |
4284 vmSymbolHandles::java_lang_ClassFormatError(), |
4313 vmSymbols::java_lang_ClassFormatError(), |
4285 "Illegal class name \"%s\" in class file %s", bytes, |
4314 "Illegal class name \"%s\" in class file %s", bytes, |
4286 _class_name->as_C_string() |
4315 _class_name->as_C_string() |
4287 ); |
4316 ); |
4288 return; |
4317 return; |
4289 } |
4318 } |
4290 } |
4319 } |
4291 |
4320 |
4292 // Checks if name is a legal field name. |
4321 // Checks if name is a legal field name. |
4293 void ClassFileParser::verify_legal_field_name(symbolHandle name, TRAPS) { |
4322 void ClassFileParser::verify_legal_field_name(Symbol* name, TRAPS) { |
4294 if (!_need_verify || _relax_verify) { return; } |
4323 if (!_need_verify || _relax_verify) { return; } |
4295 |
4324 |
4296 char buf[fixed_buffer_size]; |
4325 char buf[fixed_buffer_size]; |
4297 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4326 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4298 unsigned int length = name->utf8_length(); |
4327 unsigned int length = name->utf8_length(); |
4312 |
4341 |
4313 if (!legal) { |
4342 if (!legal) { |
4314 ResourceMark rm(THREAD); |
4343 ResourceMark rm(THREAD); |
4315 Exceptions::fthrow( |
4344 Exceptions::fthrow( |
4316 THREAD_AND_LOCATION, |
4345 THREAD_AND_LOCATION, |
4317 vmSymbolHandles::java_lang_ClassFormatError(), |
4346 vmSymbols::java_lang_ClassFormatError(), |
4318 "Illegal field name \"%s\" in class %s", bytes, |
4347 "Illegal field name \"%s\" in class %s", bytes, |
4319 _class_name->as_C_string() |
4348 _class_name->as_C_string() |
4320 ); |
4349 ); |
4321 return; |
4350 return; |
4322 } |
4351 } |
4323 } |
4352 } |
4324 |
4353 |
4325 // Checks if name is a legal method name. |
4354 // Checks if name is a legal method name. |
4326 void ClassFileParser::verify_legal_method_name(symbolHandle name, TRAPS) { |
4355 void ClassFileParser::verify_legal_method_name(Symbol* name, TRAPS) { |
4327 if (!_need_verify || _relax_verify) { return; } |
4356 if (!_need_verify || _relax_verify) { return; } |
4328 |
4357 |
4329 assert(!name.is_null(), "method name is null"); |
4358 assert(name != NULL, "method name is null"); |
4330 char buf[fixed_buffer_size]; |
4359 char buf[fixed_buffer_size]; |
4331 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4360 char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4332 unsigned int length = name->utf8_length(); |
4361 unsigned int length = name->utf8_length(); |
4333 bool legal = false; |
4362 bool legal = false; |
4334 |
4363 |
4349 |
4378 |
4350 if (!legal) { |
4379 if (!legal) { |
4351 ResourceMark rm(THREAD); |
4380 ResourceMark rm(THREAD); |
4352 Exceptions::fthrow( |
4381 Exceptions::fthrow( |
4353 THREAD_AND_LOCATION, |
4382 THREAD_AND_LOCATION, |
4354 vmSymbolHandles::java_lang_ClassFormatError(), |
4383 vmSymbols::java_lang_ClassFormatError(), |
4355 "Illegal method name \"%s\" in class %s", bytes, |
4384 "Illegal method name \"%s\" in class %s", bytes, |
4356 _class_name->as_C_string() |
4385 _class_name->as_C_string() |
4357 ); |
4386 ); |
4358 return; |
4387 return; |
4359 } |
4388 } |
4360 } |
4389 } |
4361 |
4390 |
4362 |
4391 |
4363 // Checks if signature is a legal field signature. |
4392 // Checks if signature is a legal field signature. |
4364 void ClassFileParser::verify_legal_field_signature(symbolHandle name, symbolHandle signature, TRAPS) { |
4393 void ClassFileParser::verify_legal_field_signature(Symbol* name, Symbol* signature, TRAPS) { |
4365 if (!_need_verify) { return; } |
4394 if (!_need_verify) { return; } |
4366 |
4395 |
4367 char buf[fixed_buffer_size]; |
4396 char buf[fixed_buffer_size]; |
4368 char* bytes = signature->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4397 char* bytes = signature->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size); |
4369 unsigned int length = signature->utf8_length(); |
4398 unsigned int length = signature->utf8_length(); |
4374 } |
4403 } |
4375 } |
4404 } |
4376 |
4405 |
4377 // Checks if signature is a legal method signature. |
4406 // Checks if signature is a legal method signature. |
4378 // Returns number of parameters |
4407 // Returns number of parameters |
4379 int ClassFileParser::verify_legal_method_signature(symbolHandle name, symbolHandle signature, TRAPS) { |
4408 int ClassFileParser::verify_legal_method_signature(Symbol* name, Symbol* signature, TRAPS) { |
4380 if (!_need_verify) { |
4409 if (!_need_verify) { |
4381 // make sure caller's args_size will be less than 0 even for non-static |
4410 // make sure caller's args_size will be less than 0 even for non-static |
4382 // method so it will be recomputed in compute_size_of_parameters(). |
4411 // method so it will be recomputed in compute_size_of_parameters(). |
4383 return -2; |
4412 return -2; |
4384 } |
4413 } |
4506 args.push_int(unicode_ch); |
4535 args.push_int(unicode_ch); |
4507 |
4536 |
4508 // public static boolean isJavaIdentifierStart(char ch); |
4537 // public static boolean isJavaIdentifierStart(char ch); |
4509 JavaCalls::call_static(&result, |
4538 JavaCalls::call_static(&result, |
4510 klass, |
4539 klass, |
4511 vmSymbolHandles::isJavaIdentifierStart_name(), |
4540 vmSymbols::isJavaIdentifierStart_name(), |
4512 vmSymbolHandles::int_bool_signature(), |
4541 vmSymbols::int_bool_signature(), |
4513 &args, |
4542 &args, |
4514 THREAD); |
4543 THREAD); |
4515 |
4544 |
4516 if (HAS_PENDING_EXCEPTION) { |
4545 if (HAS_PENDING_EXCEPTION) { |
4517 CLEAR_PENDING_EXCEPTION; |
4546 CLEAR_PENDING_EXCEPTION; |
4523 |
4552 |
4524 if (not_first_ch) { |
4553 if (not_first_ch) { |
4525 // public static boolean isJavaIdentifierPart(char ch); |
4554 // public static boolean isJavaIdentifierPart(char ch); |
4526 JavaCalls::call_static(&result, |
4555 JavaCalls::call_static(&result, |
4527 klass, |
4556 klass, |
4528 vmSymbolHandles::isJavaIdentifierPart_name(), |
4557 vmSymbols::isJavaIdentifierPart_name(), |
4529 vmSymbolHandles::int_bool_signature(), |
4558 vmSymbols::int_bool_signature(), |
4530 &args, |
4559 &args, |
4531 THREAD); |
4560 THREAD); |
4532 |
4561 |
4533 if (HAS_PENDING_EXCEPTION) { |
4562 if (HAS_PENDING_EXCEPTION) { |
4534 CLEAR_PENDING_EXCEPTION; |
4563 CLEAR_PENDING_EXCEPTION; |