src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java

Print this page
rev 12972 : 8140606: Update library code to use internal Unsafe
Reviewed-by: duke


 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();