instanceKlassHandle KlassFactory::create_from_stream(ClassFileStream* stream, Symbol* name, ClassLoaderData* loader_data, Handle protection_domain, const Klass* host_klass, GrowableArray<Handle>* cp_patches, TRAPS) { assert(stream != NULL, "invariant"); assert(loader_data != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread"); bool changed_by_loadhook = false; ResourceMark rm; HandleMark hm; JvmtiCachedClassFileData* cached_class_file = NULL; ClassFileStream* old_stream = stream; stream = prologue(stream, name, loader_data, protection_domain, &cached_class_file, CHECK_NULL); ClassFileParser parser(stream, name, loader_data, protection_domain, host_klass, cp_patches, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); instanceKlassHandle result = parser.create_instance_klass(old_stream != stream, CHECK_NULL); assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant"); if (result.is_null()) { return NULL; } if (cached_class_file != NULL) { // JVMTI: we have an InstanceKlass now, tell it about the cached bytes result->set_cached_class_file(cached_class_file); } TRACE_KLASS_CREATION(result, parser, THREAD); return result; }
instanceKlassHandle KlassFactory::create_from_stream(ClassFileStream* stream, Symbol* name, ClassLoaderData* loader_data, Handle protection_domain, const InstanceKlass* host_klass, GrowableArray<Handle>* cp_patches, TRAPS) { assert(stream != NULL, "invariant"); assert(loader_data != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread"); ResourceMark rm; HandleMark hm; JvmtiCachedClassFileData* cached_class_file = NULL; ClassFileStream* old_stream = stream; // Skip this processing for VM anonymous classes if (host_klass == NULL) { stream = check_class_file_load_hook(stream, name, loader_data, protection_domain, &cached_class_file, CHECK_NULL); } ClassFileParser parser(stream, name, loader_data, protection_domain, host_klass, cp_patches, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); instanceKlassHandle result = parser.create_instance_klass(old_stream != stream, CHECK_NULL); assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant"); if (result.is_null()) { return NULL; } if (cached_class_file != NULL) { // JVMTI: we have an InstanceKlass now, tell it about the cached bytes result->set_cached_class_file(cached_class_file); } if (InstanceKlass::should_store_fingerprint()) { result->store_fingerprint(!result->is_anonymous() ? stream->compute_fingerprint() : 0); } TRACE_KLASS_CREATION(result, parser, THREAD); #if INCLUDE_CDS && INCLUDE_JVMTI if (DumpSharedSpaces) { assert(cached_class_file == NULL, "Sanity"); // Archive the class stream data into the optional data section JvmtiCachedClassFileData *p; int len; const unsigned char *bytes; // event based tracing might set cached_class_file if ((bytes = result->get_cached_class_file_bytes()) != NULL) { len = result->get_cached_class_file_len(); } else { len = stream->length(); bytes = stream->buffer(); } p = (JvmtiCachedClassFileData*)MetaspaceShared::optional_data_space_alloc( offset_of(JvmtiCachedClassFileData, data) + len); p->length = len; memcpy(p->data, bytes, len); result->set_archived_class_data(p); } #endif return result; }