< prev index next >

src/hotspot/share/classfile/klassFactory.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com

*** 1,7 **** /* ! * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 77,96 **** int path_index = ik->shared_classpath_index(); ClassFileStream* stream = new ClassFileStream(ptr, end_ptr - ptr, cfs->source(), ClassFileStream::verify); ClassFileParser parser(stream, class_name, loader_data, ! protection_domain, ! NULL, ! NULL, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); ! InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */, CHECK_NULL); if (cached_class_file != NULL) { new_ik->set_cached_class_file(cached_class_file); } if (class_loader.is_null()) { --- 77,98 ---- int path_index = ik->shared_classpath_index(); ClassFileStream* stream = new ClassFileStream(ptr, end_ptr - ptr, cfs->source(), ClassFileStream::verify); + ClassLoadInfo cl_info(protection_domain); ClassFileParser parser(stream, class_name, loader_data, ! &cl_info, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); ! const ClassInstanceInfo* cl_inst_info = cl_info.class_hidden_info_ptr(); ! InstanceKlass* new_ik = parser.create_instance_klass(true, // changed_by_loadhook ! *cl_inst_info, // dynamic_nest_host and classData CHECK_NULL); + if (cached_class_file != NULL) { new_ik->set_cached_class_file(cached_class_file); } if (class_loader.is_null()) {
*** 163,175 **** InstanceKlass* KlassFactory::create_from_stream(ClassFileStream* stream, Symbol* name, ClassLoaderData* loader_data, ! Handle protection_domain, ! const InstanceKlass* unsafe_anonymous_host, ! GrowableArray<Handle>* cp_patches, TRAPS) { assert(stream != NULL, "invariant"); assert(loader_data != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread"); --- 165,175 ---- InstanceKlass* KlassFactory::create_from_stream(ClassFileStream* stream, Symbol* name, ClassLoaderData* loader_data, ! const ClassLoadInfo& cl_info, TRAPS) { assert(stream != NULL, "invariant"); assert(loader_data != NULL, "invariant"); assert(THREAD->is_Java_thread(), "must be a JavaThread");
*** 181,211 **** ClassFileStream* old_stream = stream; // increment counter THREAD->statistical_info().incr_define_class_count(); ! // Skip this processing for VM anonymous classes ! if (unsafe_anonymous_host == 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, ! unsafe_anonymous_host, ! cp_patches, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); ! InstanceKlass* result = parser.create_instance_klass(old_stream != stream, CHECK_NULL); ! assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant"); if (result == NULL) { return NULL; } --- 181,212 ---- ClassFileStream* old_stream = stream; // increment counter THREAD->statistical_info().incr_define_class_count(); ! assert(!(cl_info.is_hidden() && (cl_info.unsafe_anonymous_host() != NULL)), ! "hidden class has an anonymous host"); ! ! // Skip this processing for VM hidden or anonymous classes ! if (!cl_info.is_hidden() && (cl_info.unsafe_anonymous_host() == NULL)) { stream = check_class_file_load_hook(stream, name, loader_data, ! cl_info.protection_domain(), &cached_class_file, CHECK_NULL); } ClassFileParser parser(stream, name, loader_data, ! &cl_info, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); ! const ClassInstanceInfo* cl_inst_info = cl_info.class_hidden_info_ptr(); ! InstanceKlass* result = parser.create_instance_klass(old_stream != stream, *cl_inst_info, CHECK_NULL); if (result == NULL) { return NULL; }
< prev index next >