@@ -834,6 +834,67 @@ void ClassPrelinker::record_resolved_indys() {
834
834
log_info (cds)(" %d indies in %d classes will be resolved in final CDS image" , total_indys_to_resolve, tmp_klasses.length ());
835
835
}
836
836
837
+ // Warning -- this is fragile!!!
838
+ // This is a hard-coded list of classes that are safely to preinitialize at dump time. It needs
839
+ // to be updated if the Java source code changes.
840
+ class ForcePreinitClosure : public CLDClosure {
841
+ public:
842
+ void do_cld (ClassLoaderData* cld) {
843
+ static const char * forced_preinit_classes[] = {
844
+ " java/util/HexFormat" ,
845
+ " jdk/internal/util/ClassFileDumper" ,
846
+ " java/lang/reflect/ClassFileFormatVersion" ,
847
+ " java/lang/Character$CharacterCache" ,
848
+ " java/lang/invoke/Invokers" ,
849
+ " java/lang/invoke/Invokers$Holder" ,
850
+ " java/lang/invoke/MethodHandle" ,
851
+ " java/lang/invoke/MethodHandleStatics" ,
852
+ " java/lang/invoke/DelegatingMethodHandle" ,
853
+ " java/lang/invoke/DelegatingMethodHandle$Holder" ,
854
+ " java/lang/invoke/LambdaForm" ,
855
+ " java/lang/invoke/LambdaForm$NamedFunction" ,
856
+ " java/lang/invoke/ClassSpecializer" ,
857
+ " java/lang/invoke/DirectMethodHandle" ,
858
+ " java/lang/invoke/DirectMethodHandle$Holder" ,
859
+ " java/lang/invoke/BoundMethodHandle$Specializer" ,
860
+ " java/lang/invoke/MethodHandles$Lookup" ,
861
+
862
+ // TODO -- need to clear internTable, etc
863
+ // "java/lang/invoke/MethodType",
864
+
865
+ // TODO -- these need to link to native code
866
+ // "java/lang/invoke/BoundMethodHandle",
867
+ // "java/lang/invoke/BoundMethodHandle$Holder",
868
+ // "java/lang/invoke/MemberName",
869
+ // "java/lang/invoke/MethodHandleNatives",
870
+ nullptr
871
+ };
872
+ for (Klass* k = cld->klasses (); k != nullptr ; k = k->next_link ()) {
873
+ if (k->is_instance_klass ()) {
874
+ for (const char ** classes = forced_preinit_classes; *classes != nullptr ; classes++) {
875
+ const char * class_name = *classes;
876
+ if (k->name ()->equals (class_name)) {
877
+ ResourceMark rm;
878
+ log_info (cds, init)(" Force initialization %s" , k->external_name ());
879
+ SystemDictionaryShared::force_preinit (InstanceKlass::cast (k));
880
+ }
881
+ }
882
+ }
883
+ }
884
+ }
885
+ };
886
+
887
+ void ClassPrelinker::setup_forced_preinit_classes () {
888
+ if (!ArchiveInvokeDynamic) {
889
+ return ;
890
+ }
891
+
892
+ // Collect all loaded ClassLoaderData.
893
+ ForcePreinitClosure closure;
894
+ MutexLocker lock (ClassLoaderDataGraph_lock);
895
+ ClassLoaderDataGraph::loaded_cld_do (&closure);
896
+ }
897
+
837
898
// Initialize a class at dump time, if possible.
838
899
void ClassPrelinker::maybe_preinit_class (InstanceKlass* ik, TRAPS) {
839
900
if (ik->is_initialized ()) {
0 commit comments