RFR(S): JDK-8025580 Temporary flags: UseNewReflection and ReflectionWrapResolutionErrors
harold seigel
harold.seigel at oracle.com
Wed May 14 17:24:36 UTC 2014
Hi Yuri,
Your change looks good.
Thanks, Harold
On 5/14/2014 11:57 AM, Yuri Gaevsky wrote:
> Hi Harold,
>
> Thanks for your suggestion, updated (please also see the patch below):
> http://htmlpreview.github.io/?https://raw.github.com/ygaevsky/openjdk/master/8025580.2/index.html
> https://github.com/ygaevsky/openjdk/blob/master/8025580.2/hotspot.patch
>
> Regards,
> -Yuri
>
> --- old/src/share/vm/classfile/systemDictionary.cpp 2014-05-14 19:46:41.205613700 +0400
> +++ new/src/share/vm/classfile/systemDictionary.cpp 2014-05-14 19:46:40.890502100 +0400
> @@ -600,7 +600,6 @@
>
> Ticks class_load_start_time = Ticks::now();
>
> - // UseNewReflection
> // 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);
> @@ -894,7 +893,6 @@
> Handle protection_domain,
> TRAPS) {
>
> - // UseNewReflection
> // The result of this call should be consistent with the result
> // of the call to resolve_instance_class_or_null().
> // See evaluation 6790209 and 4474172 for more details.
> --- old/src/share/vm/classfile/systemDictionary.hpp 2014-05-14 19:46:42.931244400 +0400
> +++ new/src/share/vm/classfile/systemDictionary.hpp 2014-05-14 19:46:42.621133600 +0400
> @@ -392,7 +392,7 @@
> return k;
> }
> static Klass* check_klass_Opt_Only_JDK14NewRef(Klass* k) {
> - assert(JDK_Version::is_gte_jdk14x_version() && UseNewReflection, "JDK 1.4 only");
> + assert(JDK_Version::is_gte_jdk14x_version(), "JDK 1.4 only");
> // despite the optional loading, if you use this it must be present:
> return check_klass(k);
> }
> --- old/src/share/vm/classfile/verifier.cpp 2014-05-14 19:46:44.592661400 +0400
> +++ new/src/share/vm/classfile/verifier.cpp 2014-05-14 19:46:44.206530200 +0400
> @@ -211,9 +211,9 @@
> // reflection implementation, not just those associated with
> // sun/reflect/SerializationConstructorAccessor.
> // NOTE: this is called too early in the bootstrapping process to be
> - // guarded by Universe::is_gte_jdk14x_version()/UseNewReflection.
> + // guarded by Universe::is_gte_jdk14x_version().
> // Also for lambda generated code, gte jdk8
> - (!is_reflect || VerifyReflectionBytecodes));
> + (!is_reflect));
> }
>
> Symbol* Verifier::inference_verify(
> --- old/src/share/vm/interpreter/linkResolver.cpp 2014-05-14 19:46:46.224960300 +0400
> +++ new/src/share/vm/interpreter/linkResolver.cpp 2014-05-14 19:46:45.909849500 +0400
> @@ -951,7 +951,6 @@
> // reflection implementation, not just those associated with
> // sun/reflect/SerializationConstructorAccessor.
> bool is_reflect = JDK_Version::is_gte_jdk14x_version() &&
> - UseNewReflection &&
> klass_to_check->is_subclass_of(
> SystemDictionary::reflect_MagicAccessorImpl_klass());
>
> --- old/src/share/vm/oops/method.cpp 2014-05-14 19:46:47.797062900 +0400
> +++ new/src/share/vm/oops/method.cpp 2014-05-14 19:46:47.486052800 +0400
> @@ -1017,13 +1017,11 @@
> * security related stack walks (like Reflection.getCallerClass).
> */
> bool Method::is_ignored_by_security_stack_walk() const {
> - const bool use_new_reflection = JDK_Version::is_gte_jdk14x_version() && UseNewReflection;
> -
> if (intrinsic_id() == vmIntrinsics::_invoke) {
> // This is Method.invoke() -- ignore it
> return true;
> }
> - if (use_new_reflection &&
> + if (JDK_Version::is_gte_jdk14x_version() &&
> method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) {
> // This is an auxilary frame -- ignore it
> return true;
> --- old/src/share/vm/opto/library_call.cpp 2014-05-14 19:46:49.394328000 +0400
> +++ new/src/share/vm/opto/library_call.cpp 2014-05-14 19:46:49.079214600 +0400
> @@ -420,7 +420,6 @@
> return NULL;
>
> case vmIntrinsics::_getCallerClass:
> - if (!UseNewReflection) return NULL;
> if (!InlineReflectionGetCallerClass) return NULL;
> if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return NULL;
> break;
> --- old/src/share/vm/prims/jni.cpp 2014-05-14 19:46:51.263677900 +0400
> +++ new/src/share/vm/prims/jni.cpp 2014-05-14 19:46:50.945659800 +0400
> @@ -543,7 +543,7 @@
> if (m->is_initializer()) {
> reflection_method = Reflection::new_constructor(m, CHECK_NULL);
> } else {
> - reflection_method = Reflection::new_method(m, UseNewReflection, false, CHECK_NULL);
> + reflection_method = Reflection::new_method(m, false, CHECK_NULL);
> }
> ret = JNIHandles::make_local(env, reflection_method);
> return ret;
> @@ -2271,7 +2271,7 @@
> found = InstanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
> }
> assert(found, "bad fieldID passed into jni_ToReflectedField");
> - oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
> + oop reflected = Reflection::new_field(&fd, CHECK_NULL);
> ret = JNIHandles::make_local(env, reflected);
> return ret;
> JNI_END
> --- old/src/share/vm/prims/jvm.cpp 2014-05-14 19:46:52.984575200 +0400
> +++ new/src/share/vm/prims/jvm.cpp 2014-05-14 19:46:52.678162800 +0400
> @@ -1836,7 +1836,7 @@
>
> if (!publicOnly || fs.access_flags().is_public()) {
> fd.reinitialize(k(), fs.index());
> - oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
> + oop field = Reflection::new_field(&fd, CHECK_NULL);
> result->obj_at_put(out_idx, field);
> ++out_idx;
> }
> @@ -1914,7 +1914,7 @@
> if (want_constructor) {
> m = Reflection::new_constructor(method, CHECK_NULL);
> } else {
> - m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
> + m = Reflection::new_method(method, false, CHECK_NULL);
> }
> result->obj_at_put(i, m);
> }
> @@ -2037,7 +2037,7 @@
> }
> oop method;
> if (!m->is_initializer() || m->is_static()) {
> - method = Reflection::new_method(m, true, true, CHECK_NULL);
> + method = Reflection::new_method(m, true, CHECK_NULL);
> } else {
> method = Reflection::new_constructor(m, CHECK_NULL);
> }
> @@ -2087,7 +2087,7 @@
> if (target_klass == NULL) {
> THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
> }
> - oop field = Reflection::new_field(&fd, true, CHECK_NULL);
> + oop field = Reflection::new_field(&fd, CHECK_NULL);
> return JNIHandles::make_local(field);
> }
>
> @@ -3502,7 +3502,6 @@
>
> JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
> for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
> - // UseNewReflection
> vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
> oop loader = vfst.method()->method_holder()->class_loader();
> if (loader != NULL) {
> --- old/src/share/vm/runtime/arguments.cpp 2014-05-14 19:46:54.828999300 +0400
> +++ new/src/share/vm/runtime/arguments.cpp 2014-05-14 19:46:54.512978900 +0400
> @@ -310,6 +310,9 @@
> { "UseBoundThreads", JDK_Version::jdk(9), JDK_Version::jdk(10) },
> { "DefaultThreadPriority", JDK_Version::jdk(9), JDK_Version::jdk(10) },
> { "NoYieldsInMicrolock", JDK_Version::jdk(9), JDK_Version::jdk(10) },
> + { "UseNewReflection", JDK_Version::jdk(9), JDK_Version::jdk(10) },
> + { "ReflectionWrapResolutionErrors",JDK_Version::jdk(9), JDK_Version::jdk(10) },
> + { "VerifyReflectionBytecodes", JDK_Version::jdk(9), JDK_Version::jdk(10) },
> { NULL, JDK_Version(0), JDK_Version(0) }
> };
>
> --- old/src/share/vm/runtime/globals.hpp 2014-05-14 19:46:56.674353200 +0400
> +++ new/src/share/vm/runtime/globals.hpp 2014-05-14 19:46:56.358544700 +0400
> @@ -3654,22 +3654,6 @@
> \
> /* New JDK 1.4 reflection implementation */ \
> \
> - develop(bool, UseNewReflection, true, \
> - "Temporary flag for transition to reflection based on dynamic " \
> - "bytecode generation in 1.4; can no longer be turned off in 1.4 " \
> - "JDK, and is unneeded in 1.3 JDK, but marks most places VM " \
> - "changes were needed") \
> - \
> - develop(bool, VerifyReflectionBytecodes, false, \
> - "Force verification of 1.4 reflection bytecodes. Does not work " \
> - "in situations like that described in 4486457 or for " \
> - "constructors generated for serialization, so can not be enabled "\
> - "in product.") \
> - \
> - product(bool, ReflectionWrapResolutionErrors, true, \
> - "Temporary flag for transition to AbstractMethodError wrapped " \
> - "in InvocationTargetException. See 6531596") \
> - \
> develop(intx, FastSuperclassLimit, 8, \
> "Depth of hardwired instanceof accelerator array") \
> \
> --- old/src/share/vm/runtime/reflection.cpp 2014-05-14 19:46:58.408444200 +0400
> +++ new/src/share/vm/runtime/reflection.cpp 2014-05-14 19:46:58.100813200 +0400
> @@ -466,7 +466,6 @@
> // New (1.4) reflection implementation. Allow all accesses from
> // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
> if ( JDK_Version::is_gte_jdk14x_version()
> - && UseNewReflection
> && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
> return true;
> }
> @@ -571,7 +570,6 @@
> // New (1.4) reflection implementation. Allow all accesses from
> // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
> if ( JDK_Version::is_gte_jdk14x_version()
> - && UseNewReflection
> && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
> return true;
> }
> @@ -708,7 +706,7 @@
> }
>
>
> -oop Reflection::new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS) {
> +oop Reflection::new_method(methodHandle method, bool for_constant_pool_access, TRAPS) {
> // In jdk1.2.x, getMethods on an interface erroneously includes <clinit>, thus the complicated assert.
> // Also allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods.
> assert(!method()->is_initializer() ||
> @@ -731,14 +729,8 @@
> if (exception_types.is_null()) return NULL;
>
> Symbol* method_name = method->name();
> - Handle name;
> - if (intern_name) {
> - // intern_name is only true with UseNewReflection
> - oop name_oop = StringTable::intern(method_name, CHECK_NULL);
> - name = Handle(THREAD, name_oop);
> - } else {
> - name = java_lang_String::create_from_symbol(method_name, CHECK_NULL);
> - }
> + oop name_oop = StringTable::intern(method_name, CHECK_NULL);
> + Handle name = Handle(THREAD, name_oop);
> if (name == NULL) return NULL;
>
> int modifiers = method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
> @@ -825,16 +817,10 @@
> }
>
>
> -oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) {
> +oop Reflection::new_field(fieldDescriptor* fd, TRAPS) {
> Symbol* field_name = fd->name();
> - Handle name;
> - if (intern_name) {
> - // intern_name is only true with UseNewReflection
> - oop name_oop = StringTable::intern(field_name, CHECK_NULL);
> - name = Handle(THREAD, name_oop);
> - } else {
> - name = java_lang_String::create_from_symbol(field_name, CHECK_NULL);
> - }
> + oop name_oop = StringTable::intern(field_name, CHECK_NULL);
> + Handle name = Handle(THREAD, name_oop);
> Symbol* signature = fd->signature();
> instanceKlassHandle holder (THREAD, fd->field_holder());
> Handle type = new_type(signature, holder, CHECK_NULL);
> @@ -933,27 +919,23 @@
> // resolve based on the receiver
> if (reflected_method->method_holder()->is_interface()) {
> // resolve interface call
> - if (ReflectionWrapResolutionErrors) {
> - // new default: 6531596
> - // Match resolution errors with those thrown due to reflection inlining
> - // Linktime resolution & IllegalAccessCheck already done by Class.getMethod()
> - method = resolve_interface_call(klass, reflected_method, target_klass, receiver, THREAD);
> - if (HAS_PENDING_EXCEPTION) {
> - // Method resolution threw an exception; wrap it in an InvocationTargetException
> - oop resolution_exception = PENDING_EXCEPTION;
> - CLEAR_PENDING_EXCEPTION;
> - // JVMTI has already reported the pending exception
> - // JVMTI internal flag reset is needed in order to report InvocationTargetException
> - if (THREAD->is_Java_thread()) {
> - JvmtiExport::clear_detected_exception((JavaThread*) THREAD);
> - }
> - JavaCallArguments args(Handle(THREAD, resolution_exception));
> - THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
> - vmSymbols::throwable_void_signature(),
> - &args);
> + //
> + // Match resolution errors with those thrown due to reflection inlining
> + // Linktime resolution & IllegalAccessCheck already done by Class.getMethod()
> + method = resolve_interface_call(klass, reflected_method, target_klass, receiver, THREAD);
> + if (HAS_PENDING_EXCEPTION) {
> + // Method resolution threw an exception; wrap it in an InvocationTargetException
> + oop resolution_exception = PENDING_EXCEPTION;
> + CLEAR_PENDING_EXCEPTION;
> + // JVMTI has already reported the pending exception
> + // JVMTI internal flag reset is needed in order to report InvocationTargetException
> + if (THREAD->is_Java_thread()) {
> + JvmtiExport::clear_detected_exception((JavaThread*) THREAD);
> }
> - } else {
> - method = resolve_interface_call(klass, reflected_method, target_klass, receiver, CHECK_(NULL));
> + JavaCallArguments args(Handle(THREAD, resolution_exception));
> + THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
> + vmSymbols::throwable_void_signature(),
> + &args);
> }
> } else {
> // if the method can be overridden, we resolve using the vtable index.
> @@ -970,24 +952,16 @@
> // Check for abstract methods as well
> if (method->is_abstract()) {
> // new default: 6531596
> - if (ReflectionWrapResolutionErrors) {
> - ResourceMark rm(THREAD);
> - Handle h_origexception = Exceptions::new_exception(THREAD,
> - vmSymbols::java_lang_AbstractMethodError(),
> - Method::name_and_sig_as_C_string(target_klass(),
> - method->name(),
> - method->signature()));
> - JavaCallArguments args(h_origexception);
> - THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
> - vmSymbols::throwable_void_signature(),
> - &args);
> - } else {
> - ResourceMark rm(THREAD);
> - THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
> - Method::name_and_sig_as_C_string(target_klass(),
> - method->name(),
> - method->signature()));
> - }
> + ResourceMark rm(THREAD);
> + Handle h_origexception = Exceptions::new_exception(THREAD,
> + vmSymbols::java_lang_AbstractMethodError(),
> + Method::name_and_sig_as_C_string(target_klass(),
> + method->name(),
> + method->signature()));
> + JavaCallArguments args(h_origexception);
> + THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
> + vmSymbols::throwable_void_signature(),
> + &args);
> }
> }
> }
> @@ -1006,7 +980,7 @@
>
> // In the JDK 1.4 reflection implementation, the security check is
> // done at the Java level
> - if (!(JDK_Version::is_gte_jdk14x_version() && UseNewReflection)) {
> + if (!JDK_Version::is_gte_jdk14x_version()) {
>
> // Access checking (unless overridden by Method)
> if (!override) {
> @@ -1018,7 +992,7 @@
> }
> }
>
> - } // !(Universe::is_gte_jdk14x_version() && UseNewReflection)
> + } // !Universe::is_gte_jdk14x_version()
>
> assert(ptypes->is_objArray(), "just checking");
> int args_len = args.is_null() ? 0 : args->length();
> --- old/src/share/vm/runtime/reflection.hpp 2014-05-14 19:47:00.175340700 +0400
> +++ new/src/share/vm/runtime/reflection.hpp 2014-05-14 19:46:59.748720100 +0400
> @@ -113,11 +113,11 @@
> //
>
> // Create a java.lang.reflect.Method object based on a method
> - static oop new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS);
> + static oop new_method(methodHandle method, bool for_constant_pool_access, TRAPS);
> // Create a java.lang.reflect.Constructor object based on a method
> static oop new_constructor(methodHandle method, TRAPS);
> // Create a java.lang.reflect.Field object based on a field descriptor
> - static oop new_field(fieldDescriptor* fd, bool intern_name, TRAPS);
> + static oop new_field(fieldDescriptor* fd, TRAPS);
> // Create a java.lang.reflect.Parameter object based on a
> // MethodParameterElement
> static oop new_parameter(Handle method, int index, Symbol* sym,
> --- old/src/share/vm/runtime/vframe.cpp 2014-05-14 19:47:01.700223700 +0400
> +++ new/src/share/vm/runtime/vframe.cpp 2014-05-14 19:47:01.390747300 +0400
> @@ -471,7 +471,7 @@
>
> void vframeStreamCommon::skip_reflection_related_frames() {
> while (!at_end() &&
> - (JDK_Version::is_gte_jdk14x_version() && UseNewReflection &&
> + (JDK_Version::is_gte_jdk14x_version() &&
> (method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) ||
> method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) {
> next();
More information about the hotspot-runtime-dev
mailing list