< prev index next >

src/share/vm/classfile/klassFactory.cpp

Print this page


  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 }
< prev index next >