--- a/hotspot/src/share/vm/prims/whitebox.cpp Tue Mar 25 12:54:21 2014 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Thu Mar 27 11:17:26 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, 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
@@ -510,6 +510,44 @@
return features_string;
WB_END
+
+WB_ENTRY(jobjectArray, WB_GetNMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
+ ResourceMark rm(THREAD);
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
+ jobjectArray result = NULL;
+ if (code == NULL) {
+ return result;
+ }
+ int insts_size = code->insts_size();
+
+ ThreadToNativeFromVM ttn(thread);
+ jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ result = env->NewObjectArray(2, clazz, NULL);
+ if (result == NULL) {
+ return result;
+ }
+
+ clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ jobject obj = env->NewObject(clazz, constructor, code->comp_level());
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ env->SetObjectArrayElement(result, 0, obj);
+
+ jbyteArray insts = env->NewByteArray(insts_size);
+ CHECK_JNI_EXCEPTION_(env, NULL);
+ env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
+ env->SetObjectArrayElement(result, 1, insts);
+
+ return result;
+WB_END
+
+
//Some convenience methods to deal with objects from java
int WhiteBox::offset_for_field(const char* field_name, oop object,
Symbol* signature_symbol) {
@@ -622,6 +660,8 @@
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
{CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
{CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
+ {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
+ (void*)&WB_GetNMethod },
};
#undef CC
--- a/hotspot/src/share/vm/prims/whitebox.hpp Tue Mar 25 12:54:21 2014 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.hpp Thu Mar 27 11:17:26 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, 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
@@ -40,7 +40,6 @@
do { \
JavaThread* THREAD = JavaThread::thread_from_jni_environment(env); \
if (HAS_PENDING_EXCEPTION) { \
- CLEAR_PENDING_EXCEPTION; \
return(value); \
} \
} while (0)
@@ -49,7 +48,6 @@
do { \
JavaThread* THREAD = JavaThread::thread_from_jni_environment(env); \
if (HAS_PENDING_EXCEPTION) { \
- CLEAR_PENDING_EXCEPTION; \
return; \
} \
} while (0)
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Tue Mar 25 12:54:21 2014 -0700
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Thu Mar 27 11:17:26 2014 +0400
@@ -24,6 +24,7 @@
import com.sun.management.HotSpotDiagnosticMXBean;
import com.sun.management.VMOption;
import sun.hotspot.WhiteBox;
+import sun.hotspot.code.NMethod;
import sun.management.ManagementFactoryHelper;
import java.lang.reflect.Constructor;
@@ -278,7 +279,8 @@
}
protected final int getCompLevel() {
- return WHITE_BOX.getMethodCompilationLevel(method, testCase.isOsr());
+ NMethod nm = NMethod.get(method, testCase.isOsr());
+ return nm == null ? COMP_LEVEL_NONE : nm.comp_level;
}
protected final boolean isCompilable() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/GetNMethodTest.java Thu Mar 27 11:17:26 2014 +0400
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014, 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.
+ *
+ * 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.
+ *
+ */
+
+import sun.hotspot.code.NMethod;
+
+/*
+ * @test GetNMethodTest
+ * @bug 8038240
+ * @library /testlibrary /testlibrary/whitebox
+ * @build GetNMethodTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* GetNMethodTest
+ * @summary testing of WB::getNMethod()
+ * @author igor.ignatyev@oracle.com
+ */
+public class GetNMethodTest extends CompilerWhiteBoxTest {
+ public static void main(String[] args) throws Exception {
+ CompilerWhiteBoxTest.main(GetNMethodTest::new, args);
+ }
+
+ private GetNMethodTest(TestCase testCase) {
+ super(testCase);
+ // to prevent inlining of #method
+ WHITE_BOX.testSetDontInlineMethod(method, true);
+ }
+
+ @Override
+ protected void test() throws Exception {
+ checkNotCompiled();
+
+ compile();
+ checkCompiled();
+ NMethod nmethod = NMethod.get(method, testCase.isOsr());
+ if (IS_VERBOSE) {
+ System.out.println("nmethod = " + nmethod);
+ }
+ if (nmethod == null) {
+ throw new RuntimeException("nmethod of compiled method is null");
+ }
+ if (nmethod.insts.length == 0) {
+ throw new RuntimeException("compiled method's instructions is empty");
+ }
+ deoptimize();
+ checkNotCompiled();
+ nmethod = NMethod.get(method, testCase.isOsr());
+ if (nmethod != null) {
+ throw new RuntimeException("nmethod of non-compiled method isn't null");
+ }
+ }
+}
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Tue Mar 25 12:54:21 2014 -0700
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Thu Mar 27 11:17:26 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, 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
@@ -135,6 +135,7 @@
public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
public native void clearMethodState(Executable method);
public native int getMethodEntryBci(Executable method);
+ public native Object[] getNMethod(Executable method, boolean isOsr);
// Intered strings
public native boolean isInStringTable(String str);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/code/NMethod.java Thu Mar 27 11:17:26 2014 +0400
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, 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.
+ *
+ * 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 sun.hotspot.code;
+
+import java.lang.reflect.Executable;
+import sun.hotspot.WhiteBox;
+
+public class NMethod {
+ private static final WhiteBox wb = WhiteBox.getWhiteBox();
+ public static NMethod get(Executable method, boolean isOsr) {
+ Object[] obj = wb.getNMethod(method, isOsr);
+ return obj == null ? null : new NMethod(obj);
+ }
+ private NMethod(Object[] obj) {
+ assert obj.length == 2;
+ comp_level = (Integer) obj[0];
+ insts = (byte[]) obj[1];
+ }
+ public byte[] insts;
+ public int comp_level;
+
+ @Override
+ public String toString() {
+ return "NMethod{" +
+ "insts=" + insts +
+ ", comp_level=" + comp_level +
+ '}';
+ }
+}