From d0a286efb51e8514bdf83655b5124f1e49227db3 Mon Sep 17 00:00:00 2001 From: rfield Date: Sun, 20 Oct 2013 18:07:40 -0700 Subject: [PATCH] 8025631: Enhance Lambda construction Reviewed-by: ksrini, ahgross --- .../invoke/InnerClassLambdaMetafactory.java | 26 +++---------- .../java/lang/invoke/MagicLambdaImpl.java | 39 ------------------- 2 files changed, 5 insertions(+), 60 deletions(-) delete mode 100644 src/share/classes/java/lang/invoke/MagicLambdaImpl.java diff --git a/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java index 486680712..19255494c 100644 --- a/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java +++ b/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java @@ -33,7 +33,6 @@ import java.io.FilePermission; import java.lang.reflect.Constructor; import java.security.AccessController; import java.security.PrivilegedAction; -import java.security.ProtectionDomain; import java.util.concurrent.atomic.AtomicInteger; import java.util.PropertyPermission; @@ -50,14 +49,13 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; private static final int CLASSFILE_VERSION = 51; private static final String METHOD_DESCRIPTOR_VOID = Type.getMethodDescriptor(Type.VOID_TYPE); - private static final String NAME_MAGIC_ACCESSOR_IMPL = "java/lang/invoke/MagicLambdaImpl"; + private static final String JAVA_LANG_OBJECT = "java/lang/Object"; private static final String NAME_CTOR = ""; //Serialization support private static final String NAME_SERIALIZED_LAMBDA = "java/lang/invoke/SerializedLambda"; private static final String DESCR_METHOD_WRITE_REPLACE = "()Ljava/lang/Object;"; private static final String NAME_METHOD_WRITE_REPLACE = "writeReplace"; - private static final String NAME_OBJECT = "java/lang/Object"; private static final String DESCR_CTOR_SERIALIZED_LAMBDA = MethodType.methodType(void.class, Class.class, @@ -235,7 +233,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; } cw.visit(CLASSFILE_VERSION, ACC_SUPER + ACC_FINAL + ACC_SYNTHETIC, lambdaClassName, null, - NAME_MAGIC_ACCESSOR_IMPL, interfaces); + JAVA_LANG_OBJECT, interfaces); // Generate final fields to be filled in by constructor for (int i = 0; i < argTypes.length; i++) { @@ -287,21 +285,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; new PropertyPermission("user.dir", "read")); } - ClassLoader loader = targetClass.getClassLoader(); - ProtectionDomain pd = (loader == null) - ? null - : AccessController.doPrivileged( - new PrivilegedAction() { - @Override - public ProtectionDomain run() { - return targetClass.getProtectionDomain(); - } - } - ); - - return UNSAFE.defineClass(lambdaClassName, - classBytes, 0, classBytes.length, - loader, pd); + return UNSAFE.defineAnonymousClass(targetClass, classBytes, null); } /** @@ -313,7 +297,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; constructorDesc, null, null); ctor.visitCode(); ctor.visitVarInsn(ALOAD, 0); - ctor.visitMethodInsn(INVOKESPECIAL, NAME_MAGIC_ACCESSOR_IMPL, NAME_CTOR, + ctor.visitMethodInsn(INVOKESPECIAL, JAVA_LANG_OBJECT, NAME_CTOR, METHOD_DESCRIPTOR_VOID); int lvIndex = 0; for (int i = 0; i < argTypes.length; i++) { @@ -353,7 +337,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; mv.visitLdcInsn(instantiatedMethodType.toMethodDescriptorString()); mv.iconst(argTypes.length); - mv.visitTypeInsn(ANEWARRAY, NAME_OBJECT); + mv.visitTypeInsn(ANEWARRAY, JAVA_LANG_OBJECT); for (int i = 0; i < argTypes.length; i++) { mv.visitInsn(DUP); mv.iconst(i); diff --git a/src/share/classes/java/lang/invoke/MagicLambdaImpl.java b/src/share/classes/java/lang/invoke/MagicLambdaImpl.java deleted file mode 100644 index b78588bf8..000000000 --- a/src/share/classes/java/lang/invoke/MagicLambdaImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2012, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package java.lang.invoke; - -/**

MagicLambdaImpl (named for similarity to MagicAccessorImpl and - others, not because it actually implements an interface) is a - marker class in the hierarchy. All subclasses of this class are - "magically" granted access by the VM to otherwise inaccessible - fields and methods of other classes. It is distinct from MagicAccessorImpl - because, while we want to bypass accessibility checks, we do not want to - bypass verification.

- -

Do not change the name of this class without also changing the - VM's code.

*/ - -class MagicLambdaImpl { -} -- GitLab