Mercurial > hg > release > icedtea7-forest-2.1 > jdk
changeset 4650:02de5cdbef21
7082631: JSR 292: need profiling support in GWTs
Summary: add CountingMethodHandle
Reviewed-by: twisti, jrose
author | never |
---|---|
date | Wed, 07 Sep 2011 21:05:24 -0700 |
parents | 1ffe9f7251e3 |
children | 3f5758dbe3e1 3bf3f68bbe56 |
files | src/share/classes/java/lang/invoke/AdapterMethodHandle.java src/share/classes/java/lang/invoke/CountingMethodHandle.java src/share/classes/java/lang/invoke/MethodHandleImpl.java src/share/classes/java/lang/invoke/MethodHandleNatives.java |
diffstat | 4 files changed, 59 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/AdapterMethodHandle.java Mon Oct 10 14:34:24 2011 +0100 +++ b/src/share/classes/java/lang/invoke/AdapterMethodHandle.java Wed Sep 07 21:05:24 2011 -0700 @@ -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); } @@ -427,7 +427,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 Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/java/lang/invoke/CountingMethodHandle.java Wed Sep 07 21:05:24 2011 -0700 @@ -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; + } +}
--- a/src/share/classes/java/lang/invoke/MethodHandleImpl.java Mon Oct 10 14:34:24 2011 +0100 +++ b/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Sep 07 21:05:24 2011 -0700 @@ -1071,8 +1071,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);
--- a/src/share/classes/java/lang/invoke/MethodHandleNatives.java Mon Oct 10 14:34:24 2011 +0100 +++ b/src/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Sep 07 21:05:24 2011 -0700 @@ -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<<OP_COLLECT_ARGS)) != 0; + COUNT_GWT = getConstant(Constants.GC_COUNT_GWT) != 0; //sun.reflect.Reflection.registerMethodsToFilter(MethodHandleImpl.class, "init"); } @@ -143,7 +146,8 @@ GC_JVM_PUSH_LIMIT = 0, GC_JVM_STACK_MOVE_UNIT = 1, GC_CONV_OP_IMPLEMENTED_MASK = 2, - GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS = 3; + GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS = 3, + GC_COUNT_GWT = 4; static final int ETF_HANDLE_OR_METHOD_NAME = 0, // all available data (immediate MH or method) ETF_DIRECT_HANDLE = 1, // ultimate method handle (will be a DMH, may be self)