jaroslav@1646: /* jaroslav@1646: * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. jaroslav@1646: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jaroslav@1646: * jaroslav@1646: * This code is free software; you can redistribute it and/or modify it jaroslav@1646: * under the terms of the GNU General Public License version 2 only, as jaroslav@1646: * published by the Free Software Foundation. Oracle designates this jaroslav@1646: * particular file as subject to the "Classpath" exception as provided jaroslav@1646: * by Oracle in the LICENSE file that accompanied this code. jaroslav@1646: * jaroslav@1646: * This code is distributed in the hope that it will be useful, but WITHOUT jaroslav@1646: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jaroslav@1646: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jaroslav@1646: * version 2 for more details (a copy is included in the LICENSE file that jaroslav@1646: * accompanied this code). jaroslav@1646: * jaroslav@1646: * You should have received a copy of the GNU General Public License version jaroslav@1646: * 2 along with this work; if not, write to the Free Software Foundation, jaroslav@1646: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jaroslav@1646: * jaroslav@1646: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jaroslav@1646: * or visit www.oracle.com if you need additional information or have any jaroslav@1646: * questions. jaroslav@1646: */ jaroslav@1646: jaroslav@1646: package java.lang.invoke; jaroslav@1646: jaroslav@1646: import java.security.AccessController; jaroslav@1646: import java.security.PrivilegedAction; jaroslav@1646: import sun.misc.Unsafe; jaroslav@1646: jaroslav@1646: /** jaroslav@1646: * This class consists exclusively of static names internal to the jaroslav@1646: * method handle implementation. jaroslav@1646: * Usage: {@code import static java.lang.invoke.MethodHandleStatics.*} jaroslav@1646: * @author John Rose, JSR 292 EG jaroslav@1646: */ jaroslav@1646: /*non-public*/ class MethodHandleStatics { jaroslav@1646: jaroslav@1646: private MethodHandleStatics() { } // do not instantiate jaroslav@1646: jaroslav@1646: static final Unsafe UNSAFE = Unsafe.getUnsafe(); jaroslav@1646: jaroslav@1646: static final boolean DEBUG_METHOD_HANDLE_NAMES; jaroslav@1646: static final boolean DUMP_CLASS_FILES; jaroslav@1646: static final boolean TRACE_INTERPRETER; jaroslav@1646: static final boolean TRACE_METHOD_LINKAGE; jaroslav@1646: static final Integer COMPILE_THRESHOLD; jaroslav@1646: static { jaroslav@1646: final Object[] values = { false, false, false, false, null }; jaroslav@1646: AccessController.doPrivileged(new PrivilegedAction() { jaroslav@1646: public Void run() { jaroslav@1646: values[0] = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES"); jaroslav@1646: values[1] = Boolean.getBoolean("java.lang.invoke.MethodHandle.DUMP_CLASS_FILES"); jaroslav@1646: values[2] = Boolean.getBoolean("java.lang.invoke.MethodHandle.TRACE_INTERPRETER"); jaroslav@1646: values[3] = Boolean.getBoolean("java.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE"); jaroslav@1646: values[4] = Integer.getInteger("java.lang.invoke.MethodHandle.COMPILE_THRESHOLD"); jaroslav@1646: return null; jaroslav@1646: } jaroslav@1646: }); jaroslav@1646: DEBUG_METHOD_HANDLE_NAMES = (Boolean) values[0]; jaroslav@1646: DUMP_CLASS_FILES = (Boolean) values[1]; jaroslav@1646: TRACE_INTERPRETER = (Boolean) values[2]; jaroslav@1646: TRACE_METHOD_LINKAGE = (Boolean) values[3]; jaroslav@1646: COMPILE_THRESHOLD = (Integer) values[4]; jaroslav@1646: } jaroslav@1646: jaroslav@1646: /*non-public*/ static String getNameString(MethodHandle target, MethodType type) { jaroslav@1646: if (type == null) jaroslav@1646: type = target.type(); jaroslav@1646: MemberName name = null; jaroslav@1646: if (target != null) jaroslav@1646: name = target.internalMemberName(); jaroslav@1646: if (name == null) jaroslav@1646: return "invoke" + type; jaroslav@1646: return name.getName() + type; jaroslav@1646: } jaroslav@1646: jaroslav@1646: /*non-public*/ static String getNameString(MethodHandle target, MethodHandle typeHolder) { jaroslav@1646: return getNameString(target, typeHolder == null ? (MethodType) null : typeHolder.type()); jaroslav@1646: } jaroslav@1646: jaroslav@1646: /*non-public*/ static String getNameString(MethodHandle target) { jaroslav@1646: return getNameString(target, (MethodType) null); jaroslav@1646: } jaroslav@1646: jaroslav@1646: /*non-public*/ static String addTypeString(Object obj, MethodHandle target) { jaroslav@1646: String str = String.valueOf(obj); jaroslav@1646: if (target == null) return str; jaroslav@1646: int paren = str.indexOf('('); jaroslav@1646: if (paren >= 0) str = str.substring(0, paren); jaroslav@1646: return str + target.type(); jaroslav@1646: } jaroslav@1646: jaroslav@1646: // handy shared exception makers (they simplify the common case code) jaroslav@1646: /*non-public*/ static InternalError newInternalError(String message, Throwable cause) { jaroslav@1646: return new InternalError(message, cause); jaroslav@1646: } jaroslav@1646: /*non-public*/ static InternalError newInternalError(Throwable cause) { jaroslav@1646: return new InternalError(cause); jaroslav@1646: } jaroslav@1646: /*non-public*/ static RuntimeException newIllegalStateException(String message) { jaroslav@1646: return new IllegalStateException(message); jaroslav@1646: } jaroslav@1646: /*non-public*/ static RuntimeException newIllegalStateException(String message, Object obj) { jaroslav@1646: return new IllegalStateException(message(message, obj)); jaroslav@1646: } jaroslav@1646: /*non-public*/ static RuntimeException newIllegalArgumentException(String message) { jaroslav@1646: return new IllegalArgumentException(message); jaroslav@1646: } jaroslav@1646: /*non-public*/ static RuntimeException newIllegalArgumentException(String message, Object obj) { jaroslav@1646: return new IllegalArgumentException(message(message, obj)); jaroslav@1646: } jaroslav@1646: /*non-public*/ static RuntimeException newIllegalArgumentException(String message, Object obj, Object obj2) { jaroslav@1646: return new IllegalArgumentException(message(message, obj, obj2)); jaroslav@1646: } jaroslav@1646: /*non-public*/ static Error uncaughtException(Throwable ex) { jaroslav@1646: throw newInternalError("uncaught exception", ex); jaroslav@1646: } jaroslav@1646: static Error NYI() { jaroslav@1646: throw new AssertionError("NYI"); jaroslav@1646: } jaroslav@1646: private static String message(String message, Object obj) { jaroslav@1646: if (obj != null) message = message + ": " + obj; jaroslav@1646: return message; jaroslav@1646: } jaroslav@1646: private static String message(String message, Object obj, Object obj2) { jaroslav@1646: if (obj != null || obj2 != null) message = message + ": " + obj + ", " + obj2; jaroslav@1646: return message; jaroslav@1646: } jaroslav@1646: }