src/share/classes/sun/invoke/util/ValueConversions.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/classes/sun/invoke/util/ValueConversions.java	Wed Feb 26 04:10:28 2014
--- new/src/share/classes/sun/invoke/util/ValueConversions.java	Wed Feb 26 04:10:28 2014

*** 441,479 **** --- 441,463 ---- static double identity(double x) { return x; } /** * Identity function, with reference cast. * @param t an arbitrary reference type * @param x an arbitrary reference value * @return the same value x */ @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()); } private static final MethodHandle IDENTITY, CAST_REFERENCE, ZERO_OBJECT, IGNORE, EMPTY, ARRAY_IDENTITY, FILL_NEW_TYPED_ARRAY, FILL_NEW_ARRAY; static { try { MethodType idType = MethodType.genericMethodType(1); MethodType castType = idType.insertParameterTypes(0, Class.class); MethodType ignoreType = idType.changeReturnType(void.class); MethodType zeroObjectType = MethodType.genericMethodType(0); IDENTITY = IMPL_LOOKUP.findStatic(THIS_CLASS, "identity", idType); - //CAST_REFERENCE = IMPL_LOOKUP.findVirtual(Class.class, "cast", idType); CAST_REFERENCE = IMPL_LOOKUP.findStatic(THIS_CLASS, "castReference", castType); ZERO_OBJECT = IMPL_LOOKUP.findStatic(THIS_CLASS, "zeroObject", zeroObjectType); IGNORE = IMPL_LOOKUP.findStatic(THIS_CLASS, "ignore", ignoreType); EMPTY = IMPL_LOOKUP.findStatic(THIS_CLASS, "empty", ignoreType.dropParameterTypes(0, 1)); ARRAY_IDENTITY = IMPL_LOOKUP.findStatic(THIS_CLASS, "identity", MethodType.methodType(Object[].class, Object[].class)); FILL_NEW_ARRAY = IMPL_LOOKUP
*** 507,527 **** --- 491,514 ---- /** Return a method that casts its sole argument (an Object) to the given type * and returns it as the given type. */ public static MethodHandle cast(Class<?> type) { + return cast(type, CAST_REFERENCE); + } + public static MethodHandle cast(Class<?> type, MethodHandle castReference) { if (type.isPrimitive()) throw new IllegalArgumentException("cannot cast primitive type "+type); MethodHandle mh; Wrapper wrap = null; EnumMap<Wrapper, MethodHandle> cache = null; if (Wrapper.isWrapperType(type)) { wrap = Wrapper.forWrapperType(type); cache = WRAPPER_CASTS[0]; mh = cache.get(wrap); if (mh != null) return mh; } ! mh = MethodHandles.insertArguments(CAST_REFERENCE, 0, type); ! mh = MethodHandles.insertArguments(castReference, 0, type); if (cache != null) cache.put(wrap, mh); return mh; }

src/share/classes/sun/invoke/util/ValueConversions.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File