< prev index next >
src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java
Print this page
rev 12327 : 8062543: Replace uses of MethodHandleImpl.castReference with Class.cast
*** 1,7 ****
/*
! * Copyright (c) 2008, 2013, 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
--- 1,7 ----
/*
! * Copyright (c) 2008, 2015, 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
*** 216,226 ****
for (int i = 0; i < convSpecs.length-1; i++) {
Object convSpec = convSpecs[i];
if (convSpec == null) continue;
MethodHandle fn;
if (convSpec instanceof Class) {
! fn = Lazy.MH_castReference.bindTo(convSpec);
} else {
fn = (MethodHandle) convSpec;
}
Class<?> newType = basicSrcType.parameterType(i);
if (--convCount == 0)
--- 216,226 ----
for (int i = 0; i < convSpecs.length-1; i++) {
Object convSpec = convSpecs[i];
if (convSpec == null) continue;
MethodHandle fn;
if (convSpec instanceof Class) {
! fn = Lazy.MH_cast.bindTo(convSpec);
} else {
fn = (MethodHandle) convSpec;
}
Class<?> newType = basicSrcType.parameterType(i);
if (--convCount == 0)
*** 236,246 ****
MethodHandle fn;
if (convSpec instanceof Class) {
if (convSpec == void.class)
fn = null;
else
! fn = Lazy.MH_castReference.bindTo(convSpec);
} else {
fn = (MethodHandle) convSpec;
}
Class<?> newType = basicSrcType.returnType();
assert(--convCount == 0);
--- 236,246 ----
MethodHandle fn;
if (convSpec instanceof Class) {
if (convSpec == void.class)
fn = null;
else
! fn = Lazy.MH_cast.bindTo(convSpec);
} else {
fn = (MethodHandle) convSpec;
}
Class<?> newType = basicSrcType.returnType();
assert(--convCount == 0);
*** 299,309 ****
}
Name conv;
if (convSpec instanceof Class) {
Class<?> convClass = (Class<?>) convSpec;
! conv = new Name(Lazy.MH_castReference, convClass, names[INARG_BASE + i]);
} else {
MethodHandle fn = (MethodHandle) convSpec;
conv = new Name(fn, names[INARG_BASE + i]);
}
assert(names[nameCursor] == null);
--- 299,309 ----
}
Name conv;
if (convSpec instanceof Class) {
Class<?> convClass = (Class<?>) convSpec;
! conv = new Name(Lazy.MH_cast, convClass, names[INARG_BASE + i]);
} else {
MethodHandle fn = (MethodHandle) convSpec;
conv = new Name(fn, names[INARG_BASE + i]);
}
assert(names[nameCursor] == null);
*** 323,333 ****
Name conv;
if (convSpec == void.class) {
conv = new Name(LambdaForm.constantZero(BasicType.basicType(srcType.returnType())));
} else if (convSpec instanceof Class) {
Class<?> convClass = (Class<?>) convSpec;
! conv = new Name(Lazy.MH_castReference, convClass, names[OUT_CALL]);
} else {
MethodHandle fn = (MethodHandle) convSpec;
if (fn.type().parameterCount() == 0)
conv = new Name(fn); // don't pass retval to void conversion
else
--- 323,333 ----
Name conv;
if (convSpec == void.class) {
conv = new Name(LambdaForm.constantZero(BasicType.basicType(srcType.returnType())));
} else if (convSpec instanceof Class) {
Class<?> convClass = (Class<?>) convSpec;
! conv = new Name(Lazy.MH_cast, convClass, names[OUT_CALL]);
} else {
MethodHandle fn = (MethodHandle) convSpec;
if (fn.type().parameterCount() == 0)
conv = new Name(fn); // don't pass retval to void conversion
else
*** 340,368 ****
LambdaForm form = new LambdaForm("convert", lambdaType.parameterCount(), names, RESULT);
return SimpleMethodHandle.make(srcType, form);
}
- /**
- * Identity function, with reference cast.
- * @param t an arbitrary reference type
- * @param x an arbitrary reference value
- * @return the same value x
- */
- @ForceInline
- @SuppressWarnings("unchecked")
- static <T,U> T castReference(Class<? extends T> t, U x) {
- // inlined Class.cast because we can't ForceInline it
- if (x != null && !t.isInstance(x))
- throw newClassCastException(t, x);
- return (T) x;
- }
-
- private static ClassCastException newClassCastException(Class<?> t, Object obj) {
- return new ClassCastException("Cannot cast " + obj.getClass().getName() + " to " + t.getName());
- }
-
static Object[] computeValueConversions(MethodType srcType, MethodType dstType,
boolean strict, boolean monobox) {
final int INARG_COUNT = srcType.parameterCount();
Object[] convSpecs = new Object[INARG_COUNT+1];
for (int i = 0; i <= INARG_COUNT; i++) {
--- 340,349 ----
*** 588,607 ****
* Pre-initialized NamedFunctions for bootstrapping purposes.
* Factored in an inner class to delay initialization until first usage.
*/
static class Lazy {
private static final Class<?> MHI = MethodHandleImpl.class;
private static final MethodHandle[] ARRAYS;
private static final MethodHandle[] FILL_ARRAYS;
static final NamedFunction NF_checkSpreadArgument;
static final NamedFunction NF_guardWithCatch;
static final NamedFunction NF_throwException;
static final NamedFunction NF_profileBoolean;
! static final MethodHandle MH_castReference;
static final MethodHandle MH_selectAlternative;
static final MethodHandle MH_copyAsPrimitiveArray;
static final MethodHandle MH_fillNewTypedArray;
static final MethodHandle MH_fillNewArray;
static final MethodHandle MH_arrayIdentity;
--- 569,589 ----
* Pre-initialized NamedFunctions for bootstrapping purposes.
* Factored in an inner class to delay initialization until first usage.
*/
static class Lazy {
private static final Class<?> MHI = MethodHandleImpl.class;
+ private static final Class<?> CLS = Class.class;
private static final MethodHandle[] ARRAYS;
private static final MethodHandle[] FILL_ARRAYS;
static final NamedFunction NF_checkSpreadArgument;
static final NamedFunction NF_guardWithCatch;
static final NamedFunction NF_throwException;
static final NamedFunction NF_profileBoolean;
! static final MethodHandle MH_cast;
static final MethodHandle MH_selectAlternative;
static final MethodHandle MH_copyAsPrimitiveArray;
static final MethodHandle MH_fillNewTypedArray;
static final MethodHandle MH_fillNewArray;
static final MethodHandle MH_arrayIdentity;
*** 620,631 ****
NF_checkSpreadArgument.resolve();
NF_guardWithCatch.resolve();
NF_throwException.resolve();
NF_profileBoolean.resolve();
! MH_castReference = IMPL_LOOKUP.findStatic(MHI, "castReference",
! MethodType.methodType(Object.class, Class.class, Object.class));
MH_copyAsPrimitiveArray = IMPL_LOOKUP.findStatic(MHI, "copyAsPrimitiveArray",
MethodType.methodType(Object.class, Wrapper.class, Object[].class));
MH_arrayIdentity = IMPL_LOOKUP.findStatic(MHI, "identity",
MethodType.methodType(Object[].class, Object[].class));
MH_fillNewArray = IMPL_LOOKUP.findStatic(MHI, "fillNewArray",
--- 602,613 ----
NF_checkSpreadArgument.resolve();
NF_guardWithCatch.resolve();
NF_throwException.resolve();
NF_profileBoolean.resolve();
! MH_cast = IMPL_LOOKUP.findVirtual(CLS, "cast",
! MethodType.methodType(Object.class, Object.class));
MH_copyAsPrimitiveArray = IMPL_LOOKUP.findStatic(MHI, "copyAsPrimitiveArray",
MethodType.methodType(Object.class, Wrapper.class, Object[].class));
MH_arrayIdentity = IMPL_LOOKUP.findStatic(MHI, "identity",
MethodType.methodType(Object[].class, Object[].class));
MH_fillNewArray = IMPL_LOOKUP.findStatic(MHI, "fillNewArray",
< prev index next >