diff -r 2e7898927798 -r 979ebd346ecf hotspot/src/share/vm/classfile/systemDictionary.cpp --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Feb 14 20:00:28 2017 -0800 +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Feb 15 22:59:57 2017 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -160,17 +160,17 @@ // Returns true if the passed class loader is the builtin application class loader // or a custom system class loader. A customer system class loader can be // specified via -Djava.system.class.loader. -bool SystemDictionary::is_system_class_loader(Handle class_loader) { - if (class_loader.is_null()) { +bool SystemDictionary::is_system_class_loader(oop class_loader) { + if (class_loader == NULL) { return false; } return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass() || - class_loader() == _java_system_loader); + class_loader == _java_system_loader); } // Returns true if the passed class loader is the platform class loader. -bool SystemDictionary::is_platform_class_loader(Handle class_loader) { - if (class_loader.is_null()) { +bool SystemDictionary::is_platform_class_loader(oop class_loader) { + if (class_loader == NULL) { return false; } return (class_loader->klass() == SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass()); @@ -662,6 +662,8 @@ Ticks class_load_start_time = Ticks::now(); + HandleMark hm(THREAD); + // Fix for 4474172; see evaluation for more details class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL); @@ -1103,6 +1105,8 @@ ClassFileStream* st, TRAPS) { + HandleMark hm(THREAD); + // Classloaders that support parallelism, e.g. bootstrap classloader, // or all classloaders with UnsyncloadClass do not acquire lock here bool DoObjectLock = true; @@ -1381,6 +1385,7 @@ ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); { + HandleMark hm(THREAD); Handle lockObject = compute_loader_lock_object(class_loader, THREAD); check_loader_lock_contention(lockObject, THREAD); ObjectLocker ol(lockObject, THREAD, true); @@ -1601,6 +1606,7 @@ void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { + HandleMark hm(THREAD); ClassLoaderData* loader_data = k->class_loader_data(); Handle class_loader_h(THREAD, loader_data->class_loader()); @@ -2608,8 +2614,9 @@ SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); int ref_kind = JVM_REF_invokeVirtual; - Handle name_str = StringTable::intern(name, CHECK_(empty)); - objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); + oop name_oop = StringTable::intern(name, CHECK_(empty)); + Handle name_str (THREAD, name_oop); + objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); assert(appendix_box->obj_at(0) == NULL, ""); // This should not happen. JDK code should take care of that. @@ -2619,12 +2626,12 @@ // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName JavaCallArguments args; - args.push_oop(accessing_klass()->java_mirror()); + args.push_oop(Handle(THREAD, accessing_klass()->java_mirror())); args.push_int(ref_kind); - args.push_oop(klass()->java_mirror()); - args.push_oop(name_str()); - args.push_oop(method_type()); - args.push_oop(appendix_box()); + args.push_oop(Handle(THREAD, klass()->java_mirror())); + args.push_oop(name_str); + args.push_oop(method_type); + args.push_oop(appendix_box); JavaValue result(T_OBJECT); JavaCalls::call_static(&result, SystemDictionary::MethodHandleNatives_klass(), @@ -2682,7 +2689,7 @@ } bool can_be_cached = true; int npts = ArgumentCount(signature).size(); - objArrayHandle pts = oopFactory::new_objArray(SystemDictionary::Class_klass(), npts, CHECK_(empty)); + objArrayHandle pts = oopFactory::new_objArray_handle(SystemDictionary::Class_klass(), npts, CHECK_(empty)); int arg = 0; Handle rt; // the return type from the signature ResourceMark rm(THREAD); @@ -2725,7 +2732,7 @@ // call java.lang.invoke.MethodHandleNatives::findMethodHandleType(Class rt, Class[] pts) -> MethodType JavaCallArguments args(Handle(THREAD, rt())); - args.push_oop(pts()); + args.push_oop(pts); JavaValue result(T_OBJECT); JavaCalls::call_static(&result, SystemDictionary::MethodHandleNatives_klass(), @@ -2768,7 +2775,8 @@ ResourceMark rm(THREAD); SignatureStream ss(signature, false); if (!ss.is_done()) { - oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(), + oop mirror = ss.as_java_mirror(Handle(THREAD, caller->class_loader()), + Handle(THREAD, caller->protection_domain()), SignatureStream::NCDFError, CHECK_(empty)); type = Handle(THREAD, mirror); ss.next(); @@ -2781,11 +2789,11 @@ // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle JavaCallArguments args; - args.push_oop(caller->java_mirror()); // the referring class + args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class args.push_int(ref_kind); - args.push_oop(callee->java_mirror()); // the target class - args.push_oop(name()); - args.push_oop(type()); + args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class + args.push_oop(name); + args.push_oop(type); JavaValue result(T_OBJECT); JavaCalls::call_static(&result, SystemDictionary::MethodHandleNatives_klass(), @@ -2832,16 +2840,16 @@ THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty); } - objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); + objArrayHandle appendix_box = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), 1, CHECK_(empty)); assert(appendix_box->obj_at(0) == NULL, ""); // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix) JavaCallArguments args; - args.push_oop(caller->java_mirror()); - args.push_oop(bsm()); - args.push_oop(method_name()); - args.push_oop(method_type()); - args.push_oop(info()); + args.push_oop(Handle(THREAD, caller->java_mirror())); + args.push_oop(bsm); + args.push_oop(method_name); + args.push_oop(method_type); + args.push_oop(info); args.push_oop(appendix_box); JavaValue result(T_OBJECT); JavaCalls::call_static(&result,