57 VM_RedefineClasses::get_cached_class_file_bytes(archived_class_data);
58 unsigned char* end_ptr =
59 ptr + VM_RedefineClasses::get_cached_class_file_len(archived_class_data);
60 unsigned char* old_ptr = ptr;
61 JvmtiExport::post_class_file_load_hook(class_name,
62 class_loader,
63 protection_domain,
64 &ptr,
65 &end_ptr,
66 &cached_class_file);
67 if (old_ptr != ptr) {
68 // JVMTI agent has modified class file data.
69 // Set new class file stream using JVMTI agent modified class file data.
70 ClassLoaderData* loader_data =
71 ClassLoaderData::class_loader_data(class_loader());
72 int path_index = ik->shared_classpath_index();
73 SharedClassPathEntry* ent =
74 (SharedClassPathEntry*)FileMapInfo::shared_classpath(path_index);
75 ClassFileStream* stream = new ClassFileStream(ptr,
76 end_ptr - ptr,
77 ent == NULL ? NULL : ent->_name,
78 ClassFileStream::verify);
79 ClassFileParser parser(stream,
80 class_name,
81 loader_data,
82 protection_domain,
83 NULL,
84 NULL,
85 ClassFileParser::BROADCAST, // publicity level
86 CHECK_NULL);
87 InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
88 CHECK_NULL);
89 if (cached_class_file != NULL) {
90 new_ik->set_cached_class_file(cached_class_file);
91 }
92
93 if (class_loader.is_null()) {
94 ResourceMark rm;
95 ClassLoader::add_package(class_name->as_C_string(), path_index, THREAD);
96 }
97
212 if (InstanceKlass::should_store_fingerprint()) {
213 result->store_fingerprint(!result->is_anonymous() ? stream->compute_fingerprint() : 0);
214 }
215
216 TRACE_KLASS_CREATION(result, parser, THREAD);
217
218 #if INCLUDE_CDS && INCLUDE_JVMTI
219 if (DumpSharedSpaces) {
220 assert(cached_class_file == NULL, "Sanity");
221 // Archive the class stream data into the optional data section
222 JvmtiCachedClassFileData *p;
223 int len;
224 const unsigned char *bytes;
225 // event based tracing might set cached_class_file
226 if ((bytes = result->get_cached_class_file_bytes()) != NULL) {
227 len = result->get_cached_class_file_len();
228 } else {
229 len = stream->length();
230 bytes = stream->buffer();
231 }
232 p = (JvmtiCachedClassFileData*)MetaspaceShared::optional_data_space_alloc(
233 offset_of(JvmtiCachedClassFileData, data) + len);
234 p->length = len;
235 memcpy(p->data, bytes, len);
236 result->set_archived_class_data(p);
237 }
238 #endif
239
240 return result;
241 }
|
57 VM_RedefineClasses::get_cached_class_file_bytes(archived_class_data);
58 unsigned char* end_ptr =
59 ptr + VM_RedefineClasses::get_cached_class_file_len(archived_class_data);
60 unsigned char* old_ptr = ptr;
61 JvmtiExport::post_class_file_load_hook(class_name,
62 class_loader,
63 protection_domain,
64 &ptr,
65 &end_ptr,
66 &cached_class_file);
67 if (old_ptr != ptr) {
68 // JVMTI agent has modified class file data.
69 // Set new class file stream using JVMTI agent modified class file data.
70 ClassLoaderData* loader_data =
71 ClassLoaderData::class_loader_data(class_loader());
72 int path_index = ik->shared_classpath_index();
73 SharedClassPathEntry* ent =
74 (SharedClassPathEntry*)FileMapInfo::shared_classpath(path_index);
75 ClassFileStream* stream = new ClassFileStream(ptr,
76 end_ptr - ptr,
77 ent == NULL ? NULL : ent->name(),
78 ClassFileStream::verify);
79 ClassFileParser parser(stream,
80 class_name,
81 loader_data,
82 protection_domain,
83 NULL,
84 NULL,
85 ClassFileParser::BROADCAST, // publicity level
86 CHECK_NULL);
87 InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
88 CHECK_NULL);
89 if (cached_class_file != NULL) {
90 new_ik->set_cached_class_file(cached_class_file);
91 }
92
93 if (class_loader.is_null()) {
94 ResourceMark rm;
95 ClassLoader::add_package(class_name->as_C_string(), path_index, THREAD);
96 }
97
212 if (InstanceKlass::should_store_fingerprint()) {
213 result->store_fingerprint(!result->is_anonymous() ? stream->compute_fingerprint() : 0);
214 }
215
216 TRACE_KLASS_CREATION(result, parser, THREAD);
217
218 #if INCLUDE_CDS && INCLUDE_JVMTI
219 if (DumpSharedSpaces) {
220 assert(cached_class_file == NULL, "Sanity");
221 // Archive the class stream data into the optional data section
222 JvmtiCachedClassFileData *p;
223 int len;
224 const unsigned char *bytes;
225 // event based tracing might set cached_class_file
226 if ((bytes = result->get_cached_class_file_bytes()) != NULL) {
227 len = result->get_cached_class_file_len();
228 } else {
229 len = stream->length();
230 bytes = stream->buffer();
231 }
232 p = (JvmtiCachedClassFileData*)os::malloc(offset_of(JvmtiCachedClassFileData, data) + len, mtInternal);
233 p->length = len;
234 memcpy(p->data, bytes, len);
235 result->set_archived_class_data(p);
236 }
237 #endif
238
239 return result;
240 }
|