mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-11 19:08:23 +00:00
8150778: Reduce Throwable.getStackTrace() calls to the JVM
Replace JVM_GetStackTraceDepth and JVM_GetStackTraceElement, with JVM_GetStackTraceElements that gets all the elements in the StackTraceElement[] Reviewed-by: dfuchs, mchung, shade, hseigel
This commit is contained in:
parent
00e41ed9ce
commit
d0426d7d41
@ -227,8 +227,7 @@ SUNWprivate_1.1 {
|
||||
Java_java_lang_System_setOut0;
|
||||
Java_java_lang_Thread_registerNatives;
|
||||
Java_java_lang_Throwable_fillInStackTrace;
|
||||
Java_java_lang_Throwable_getStackTraceDepth;
|
||||
Java_java_lang_Throwable_getStackTraceElement;
|
||||
Java_java_lang_Throwable_getStackTraceElements;
|
||||
Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2;
|
||||
Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2Ljava_security_AccessControlContext_2;
|
||||
Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2;
|
||||
|
||||
@ -78,8 +78,7 @@ text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_Pri
|
||||
text: .text%JNU_GetEnv;
|
||||
text: .text%Java_java_io_UnixFileSystem_checkAccess;
|
||||
text: .text%Java_java_lang_reflect_Array_newArray;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceDepth;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElement;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElements;
|
||||
text: .text%throwFileNotFoundException;
|
||||
text: .text%JNU_NotifyAll;
|
||||
# Test LoadFrame
|
||||
|
||||
@ -74,8 +74,7 @@ text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_Pri
|
||||
text: .text%JNU_GetEnv;
|
||||
text: .text%Java_java_io_UnixFileSystem_checkAccess;
|
||||
text: .text%Java_java_lang_reflect_Array_newArray;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceDepth;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElement;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElements;
|
||||
text: .text%throwFileNotFoundException: OUTPUTDIR/io_util.o;
|
||||
text: .text%JNU_NotifyAll;
|
||||
# Test LoadFrame
|
||||
|
||||
@ -78,8 +78,7 @@ text: .text%Java_java_io_UnixFileSystem_checkAccess;
|
||||
text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0;
|
||||
text: .text%Java_java_io_FileInputStream_available;
|
||||
text: .text%Java_java_lang_reflect_Array_newArray;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceDepth;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElement;
|
||||
text: .text%Java_java_lang_Throwable_getStackTraceElements;
|
||||
text: .text%Java_java_lang_System_identityHashCode;
|
||||
text: .text%JNU_NotifyAll;
|
||||
# Test LoadFrame
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2016, 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
|
||||
@ -74,6 +74,12 @@ public final class StackTraceElement implements java.io.Serializable {
|
||||
this.lineNumber = lineNumber;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty stack frame element to be filled in by Throwable.
|
||||
*/
|
||||
StackTraceElement() { }
|
||||
|
||||
/**
|
||||
* Returns the name of the source file containing the execution point
|
||||
* represented by this stack trace element. Generally, this corresponds
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1994, 2016, 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
|
||||
@ -118,7 +118,7 @@ public class Throwable implements Serializable {
|
||||
private static final long serialVersionUID = -3042686055658047285L;
|
||||
|
||||
/**
|
||||
* Native code saves some indication of the stack backtrace in this slot.
|
||||
* The JVM saves some indication of the stack backtrace in this slot.
|
||||
*/
|
||||
private transient Object backtrace;
|
||||
|
||||
@ -211,6 +211,11 @@ public class Throwable implements Serializable {
|
||||
*/
|
||||
private StackTraceElement[] stackTrace = UNASSIGNED_STACK;
|
||||
|
||||
/**
|
||||
* The JVM code sets the depth of the backtrace for later retrieval
|
||||
*/
|
||||
private transient int depth;
|
||||
|
||||
// Setting this static field introduces an acceptable
|
||||
// initialization dependency on a few java.util classes.
|
||||
private static final List<Throwable> SUPPRESSED_SENTINEL = Collections.emptyList();
|
||||
@ -828,10 +833,11 @@ public class Throwable implements Serializable {
|
||||
if (backtrace instanceof StackStreamFactory.StackTrace) {
|
||||
stackTrace = ((StackStreamFactory.StackTrace)backtrace).getStackTraceElements();
|
||||
} else {
|
||||
int depth = getStackTraceDepth();
|
||||
stackTrace = new StackTraceElement[depth];
|
||||
for (int i = 0; i < depth; i++)
|
||||
stackTrace[i] = getStackTraceElement(i);
|
||||
for (int i = 0; i < depth; i++) {
|
||||
stackTrace[i] = new StackTraceElement();
|
||||
}
|
||||
getStackTraceElements(stackTrace);
|
||||
}
|
||||
} else if (stackTrace == null) {
|
||||
return UNASSIGNED_STACK;
|
||||
@ -884,23 +890,11 @@ public class Throwable implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of elements in the stack trace (or 0 if the stack
|
||||
* trace is unavailable).
|
||||
*
|
||||
* package-protection for use by SharedSecrets.
|
||||
* Gets the stack trace elements.
|
||||
* @param elements
|
||||
* @throws IndexOutOfBoundsException if {@code elements.length != depth }
|
||||
*/
|
||||
native int getStackTraceDepth();
|
||||
|
||||
/**
|
||||
* Returns the specified element of the stack trace.
|
||||
*
|
||||
* package-protection for use by SharedSecrets.
|
||||
*
|
||||
* @param index index of the element to return.
|
||||
* @throws IndexOutOfBoundsException if {@code index < 0 ||
|
||||
* index >= getStackTraceDepth() }
|
||||
*/
|
||||
native StackTraceElement getStackTraceElement(int index);
|
||||
private native void getStackTraceElements(StackTraceElement[] elements);
|
||||
|
||||
/**
|
||||
* Reads a {@code Throwable} from a stream, enforcing
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, 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
|
||||
@ -171,11 +171,8 @@ JVM_IsSupportedJNIVersion(jint version);
|
||||
JNIEXPORT void JNICALL
|
||||
JVM_FillInStackTrace(JNIEnv *env, jobject throwable);
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable);
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index);
|
||||
JNIEXPORT void JNICALL
|
||||
JVM_GetStackTraceElements(JNIEnv *env, jobject throwable, jobjectArray elements);
|
||||
|
||||
/*
|
||||
* java.lang.StackWalker
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1994, 2016, 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
|
||||
@ -50,15 +50,9 @@ Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable, jint d
|
||||
return throwable;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_java_lang_Throwable_getStackTraceDepth(JNIEnv *env, jobject throwable)
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_Throwable_getStackTraceElements(JNIEnv *env,
|
||||
jobject throwable, jobjectArray elements)
|
||||
{
|
||||
return JVM_GetStackTraceDepth(env, throwable);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_java_lang_Throwable_getStackTraceElement(JNIEnv *env,
|
||||
jobject throwable, jint index)
|
||||
{
|
||||
return JVM_GetStackTraceElement(env, throwable, index);
|
||||
JVM_GetStackTraceElements(env, throwable, elements);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user