Mercurial > hg > truffle
comparison src/share/vm/classfile/classFileParser.cpp @ 20375:6e0cb14ce59b
8046070: Class Data Sharing clean up and refactoring
Summary: Cleaned up CDS to be more configurable, maintainable and extensible
Reviewed-by: dholmes, coleenp, acorn, mchung
author | iklam |
---|---|
date | Thu, 21 Aug 2014 13:57:51 -0700 |
parents | 72fa1e83e5f9 |
children | 47e3110c47e8 8cb56c8cb30d |
comparison
equal
deleted
inserted
replaced
20374:999824269b71 | 20375:6e0cb14ce59b |
---|---|
29 #include "classfile/classLoaderData.inline.hpp" | 29 #include "classfile/classLoaderData.inline.hpp" |
30 #include "classfile/defaultMethods.hpp" | 30 #include "classfile/defaultMethods.hpp" |
31 #include "classfile/javaClasses.hpp" | 31 #include "classfile/javaClasses.hpp" |
32 #include "classfile/symbolTable.hpp" | 32 #include "classfile/symbolTable.hpp" |
33 #include "classfile/systemDictionary.hpp" | 33 #include "classfile/systemDictionary.hpp" |
34 #if INCLUDE_CDS | |
35 #include "classfile/systemDictionaryShared.hpp" | |
36 #endif | |
34 #include "classfile/verificationType.hpp" | 37 #include "classfile/verificationType.hpp" |
35 #include "classfile/verifier.hpp" | 38 #include "classfile/verifier.hpp" |
36 #include "classfile/vmSymbols.hpp" | 39 #include "classfile/vmSymbols.hpp" |
37 #include "memory/allocation.hpp" | 40 #include "memory/allocation.hpp" |
38 #include "memory/gcLocker.hpp" | 41 #include "memory/gcLocker.hpp" |
58 #include "runtime/timer.hpp" | 61 #include "runtime/timer.hpp" |
59 #include "services/classLoadingService.hpp" | 62 #include "services/classLoadingService.hpp" |
60 #include "services/threadService.hpp" | 63 #include "services/threadService.hpp" |
61 #include "utilities/array.hpp" | 64 #include "utilities/array.hpp" |
62 #include "utilities/globalDefinitions.hpp" | 65 #include "utilities/globalDefinitions.hpp" |
66 #include "utilities/ostream.hpp" | |
63 | 67 |
64 // We generally try to create the oops directly when parsing, rather than | 68 // We generally try to create the oops directly when parsing, rather than |
65 // allocating temporary data structures and copying the bytes twice. A | 69 // allocating temporary data structures and copying the bytes twice. A |
66 // temporary area is only needed when parsing utf8 entries in the constant | 70 // temporary area is only needed when parsing utf8 entries in the constant |
67 // pool and when parsing line number tables. | 71 // pool and when parsing line number tables. |
3735 _cp_patches = cp_patches; | 3739 _cp_patches = cp_patches; |
3736 | 3740 |
3737 instanceKlassHandle nullHandle; | 3741 instanceKlassHandle nullHandle; |
3738 | 3742 |
3739 // Figure out whether we can skip format checking (matching classic VM behavior) | 3743 // Figure out whether we can skip format checking (matching classic VM behavior) |
3740 _need_verify = Verifier::should_verify_for(class_loader(), verify); | 3744 if (DumpSharedSpaces) { |
3745 // verify == true means it's a 'remote' class (i.e., non-boot class) | |
3746 // Verification decision is based on BytecodeVerificationRemote flag | |
3747 // for those classes. | |
3748 _need_verify = (verify) ? BytecodeVerificationRemote : | |
3749 BytecodeVerificationLocal; | |
3750 } else { | |
3751 _need_verify = Verifier::should_verify_for(class_loader(), verify); | |
3752 } | |
3741 | 3753 |
3742 // Set the verify flag in stream | 3754 // Set the verify flag in stream |
3743 cfs->set_verify(_need_verify); | 3755 cfs->set_verify(_need_verify); |
3744 | 3756 |
3745 // Save the class file name for easier error message printing. | 3757 // Save the class file name for easier error message printing. |
3753 magic, CHECK_(nullHandle)); | 3765 magic, CHECK_(nullHandle)); |
3754 | 3766 |
3755 // Version numbers | 3767 // Version numbers |
3756 u2 minor_version = cfs->get_u2_fast(); | 3768 u2 minor_version = cfs->get_u2_fast(); |
3757 u2 major_version = cfs->get_u2_fast(); | 3769 u2 major_version = cfs->get_u2_fast(); |
3770 | |
3771 if (DumpSharedSpaces && major_version < JAVA_1_5_VERSION) { | |
3772 ResourceMark rm; | |
3773 warning("Pre JDK 1.5 class not supported by CDS: %u.%u %s", | |
3774 major_version, minor_version, name->as_C_string()); | |
3775 Exceptions::fthrow( | |
3776 THREAD_AND_LOCATION, | |
3777 vmSymbols::java_lang_UnsupportedClassVersionError(), | |
3778 "Unsupported major.minor version for dump time %u.%u", | |
3779 major_version, | |
3780 minor_version); | |
3781 } | |
3758 | 3782 |
3759 // Check version numbers - we check this even with verifier off | 3783 // Check version numbers - we check this even with verifier off |
3760 if (!is_supported_version(major_version, minor_version)) { | 3784 if (!is_supported_version(major_version, minor_version)) { |
3761 if (name == NULL) { | 3785 if (name == NULL) { |
3762 Exceptions::fthrow( | 3786 Exceptions::fthrow( |
3861 if (TraceClassLoadingPreorder) { | 3885 if (TraceClassLoadingPreorder) { |
3862 tty->print("[Loading %s", (name != NULL) ? name->as_klass_external_name() : "NoName"); | 3886 tty->print("[Loading %s", (name != NULL) ? name->as_klass_external_name() : "NoName"); |
3863 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); | 3887 if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); |
3864 tty->print_cr("]"); | 3888 tty->print_cr("]"); |
3865 } | 3889 } |
3890 #if INCLUDE_CDS | |
3891 if (DumpLoadedClassList != NULL && cfs->source() != NULL && classlist_file->is_open()) { | |
3892 // Only dump the classes that can be stored into CDS archive | |
3893 if (SystemDictionaryShared::is_sharing_possible(loader_data)) { | |
3894 if (name != NULL) { | |
3895 ResourceMark rm(THREAD); | |
3896 classlist_file->print_cr("%s", name->as_C_string()); | |
3897 classlist_file->flush(); | |
3898 } | |
3899 } | |
3900 } | |
3901 #endif | |
3866 | 3902 |
3867 u2 super_class_index = cfs->get_u2_fast(); | 3903 u2 super_class_index = cfs->get_u2_fast(); |
3868 instanceKlassHandle super_klass = parse_super_class(super_class_index, | 3904 instanceKlassHandle super_klass = parse_super_class(super_class_index, |
3869 CHECK_NULL); | 3905 CHECK_NULL); |
3870 | 3906 |