// called from Lookup.revealDirect() (instead of MethodHandle.internalMemberName()) via map.xml replace-method-call public static MemberName internalMemberName(MethodHandle mh) { #if FIRST_PASS return(null); #else MemberName mn = mh.internalMemberName(); if (mn.isStatic() && mn.getName() == "<init>") { // HACK since we convert String constructors into static methods, we have to undo that here // Note that the MemberName we return is only used for a security check and by InfoFromMemberName (a MethodHandleInfo implementation), // so we don't need to make it actually invokable. MemberName alt = new MemberName(); typeof(MemberName).GetField("clazz", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getDeclaringClass()); typeof(MemberName).GetField("name", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getName()); typeof(MemberName).GetField("type", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getMethodType().changeReturnType(typeof(void))); int flags = mn._flags(); flags -= MethodHandleNatives.Constants.MN_IS_METHOD; flags += MethodHandleNatives.Constants.MN_IS_CONSTRUCTOR; flags &= ~(MethodHandleNatives.Constants.MN_REFERENCE_KIND_MASK << MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT); flags |= MethodHandleNatives.Constants.REF_newInvokeSpecial << MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT; flags &= ~MethodHandleNatives.Constants.ACC_STATIC; alt._flags(flags); return(alt); } return(mn); #endif }