758 // load receiver
759 emitAloadInsn(0);
760 emitReferenceCast(MethodHandle.class, null);
761 mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", LF_SIG);
762 mv.visitFieldInsn(Opcodes.GETFIELD, LF, "names", LFN_SIG);
763 // TODO more to come
764 }
765
766 // push arguments
767 emitPushArguments(name);
768
769 // invocation
770 MethodType type = name.function.methodType();
771 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false);
772 }
773
774 private static Class<?>[] STATICALLY_INVOCABLE_PACKAGES = {
775 // Sample classes from each package we are willing to bind to statically:
776 java.lang.Object.class,
777 java.util.Arrays.class,
778 sun.misc.Unsafe.class
779 //MethodHandle.class already covered
780 };
781
782 static boolean isStaticallyInvocable(Name name) {
783 return isStaticallyInvocable(name.function.member());
784 }
785
786 static boolean isStaticallyInvocable(MemberName member) {
787 if (member == null) return false;
788 if (member.isConstructor()) return false;
789 Class<?> cls = member.getDeclaringClass();
790 if (cls.isArray() || cls.isPrimitive())
791 return false; // FIXME
792 if (cls.isAnonymousClass() || cls.isLocalClass())
793 return false; // inner class of some sort
794 if (cls.getClassLoader() != MethodHandle.class.getClassLoader())
795 return false; // not on BCP
796 if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added
797 return false;
798 MethodType mtype = member.getMethodOrFieldType();
|
758 // load receiver
759 emitAloadInsn(0);
760 emitReferenceCast(MethodHandle.class, null);
761 mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", LF_SIG);
762 mv.visitFieldInsn(Opcodes.GETFIELD, LF, "names", LFN_SIG);
763 // TODO more to come
764 }
765
766 // push arguments
767 emitPushArguments(name);
768
769 // invocation
770 MethodType type = name.function.methodType();
771 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false);
772 }
773
774 private static Class<?>[] STATICALLY_INVOCABLE_PACKAGES = {
775 // Sample classes from each package we are willing to bind to statically:
776 java.lang.Object.class,
777 java.util.Arrays.class,
778 jdk.internal.misc.Unsafe.class
779 //MethodHandle.class already covered
780 };
781
782 static boolean isStaticallyInvocable(Name name) {
783 return isStaticallyInvocable(name.function.member());
784 }
785
786 static boolean isStaticallyInvocable(MemberName member) {
787 if (member == null) return false;
788 if (member.isConstructor()) return false;
789 Class<?> cls = member.getDeclaringClass();
790 if (cls.isArray() || cls.isPrimitive())
791 return false; // FIXME
792 if (cls.isAnonymousClass() || cls.isLocalClass())
793 return false; // inner class of some sort
794 if (cls.getClassLoader() != MethodHandle.class.getClassLoader())
795 return false; // not on BCP
796 if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added
797 return false;
798 MethodType mtype = member.getMethodOrFieldType();
|