--- old/src/share/classes/java/lang/invoke/AdapterMethodHandle.java Wed Sep 7 21:00:20 2011 +++ new/src/share/classes/java/lang/invoke/AdapterMethodHandle.java Wed Sep 7 21:00:19 2011 @@ -53,7 +53,7 @@ // JVM might update VM-specific bits of conversion (ignore) MethodHandleNatives.init(this, target, convArgPos(conv)); } - private AdapterMethodHandle(MethodHandle target, MethodType newType, + AdapterMethodHandle(MethodHandle target, MethodType newType, long conv) { this(target, newType, conv, null); } @@ -423,7 +423,7 @@ insertStackMove(stackMove) ); } - private static long makeConv(int convOp) { + static long makeConv(int convOp) { assert(convOp == OP_RETYPE_ONLY || convOp == OP_RETYPE_RAW); return ((long)-1 << 32) | (convOp << CONV_OP_SHIFT); // stackMove, src, dst all zero } --- /dev/null Wed Sep 7 21:00:01 2011 +++ new/src/share/classes/java/lang/invoke/CountingMethodHandle.java Wed Sep 7 21:00:20 2011 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2011, 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; + +import static java.lang.invoke.MethodHandleNatives.Constants.*; + +/** + * This method handle is used to optionally provide a count of how + * many times it was invoked. + * + * @author never + */ +class CountingMethodHandle extends AdapterMethodHandle { + private int vmcount; + + private CountingMethodHandle(MethodHandle target) { + super(target, target.type(), AdapterMethodHandle.makeConv(OP_RETYPE_ONLY)); + } + + /** Wrap the incoming MethodHandle in a CountingMethodHandle if they are enabled */ + static MethodHandle wrap(MethodHandle mh) { + if (MethodHandleNatives.COUNT_GWT) { + return new CountingMethodHandle(mh); + } + return mh; + } +} --- old/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Sep 7 21:00:22 2011 +++ new/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Sep 7 21:00:21 2011 @@ -749,8 +749,8 @@ assert(target.type().equals(fallback.type())); MethodHandle tailcall = MethodHandles.exactInvoker(target.type()); MethodHandle select = selectAlternative(); - select = bindArgument(select, 2, fallback); - select = bindArgument(select, 1, target); + select = bindArgument(select, 2, CountingMethodHandle.wrap(fallback)); + select = bindArgument(select, 1, CountingMethodHandle.wrap(target)); // select(z: boolean) => (z ? target : fallback) MethodHandle filter = filterArgument(tailcall, 0, select); assert(filter.type().parameterType(0) == boolean.class); --- old/src/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Sep 7 21:00:23 2011 +++ new/src/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Sep 7 21:00:23 2011 @@ -120,6 +120,8 @@ static final int OP_ROT_ARGS_DOWN_LIMIT_BIAS; + static final boolean COUNT_GWT; + private static native void registerNatives(); static { registerNatives(); @@ -131,6 +133,7 @@ k = getConstant(Constants.GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS); OP_ROT_ARGS_DOWN_LIMIT_BIAS = (k != 0) ? (byte)k : -1; HAVE_RICOCHET_FRAMES = (CONV_OP_IMPLEMENTED_MASK & (1<