--- old/make/mapfiles/libjava/mapfile-vers 2016-03-02 21:17:13.212344835 -0500 +++ new/make/mapfiles/libjava/mapfile-vers 2016-03-02 21:17:13.040687664 -0500 @@ -227,8 +227,7 @@ 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; --- old/src/java.base/share/classes/java/lang/StackTraceElement.java 2016-03-02 21:17:14.215597273 -0500 +++ new/src/java.base/share/classes/java/lang/StackTraceElement.java 2016-03-02 21:17:14.046671795 -0500 @@ -74,6 +74,13 @@ this.lineNumber = lineNumber; } + + /** + * Creates an empty stack frame element to be filled in by Throwable. + * @since 1.9 + */ + StackTraceElement() { } + /** * Returns the name of the source file containing the execution point * represented by this stack trace element. Generally, this corresponds --- old/src/java.base/share/classes/java/lang/Throwable.java 2016-03-02 21:17:15.144534325 -0500 +++ new/src/java.base/share/classes/java/lang/Throwable.java 2016-03-02 21:17:14.944201153 -0500 @@ -211,6 +211,11 @@ */ private StackTraceElement[] stackTrace = UNASSIGNED_STACK; + /** + * Native 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 SUPPRESSED_SENTINEL = Collections.emptyList(); @@ -828,10 +833,11 @@ 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,10 @@ } /** - * Returns the number of elements in the stack trace (or 0 if the stack - * trace is unavailable). - * - * package-protection for use by SharedSecrets. - */ - 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() } + * @param elements + * @throws IndexOutOfBoundsException if {@code elements.length != depth } */ - native StackTraceElement getStackTraceElement(int index); + private native void getStackTraceElements(StackTraceElement[] elements); /** * Reads a {@code Throwable} from a stream, enforcing --- old/src/java.base/share/native/include/jvm.h 2016-03-02 21:17:16.277349105 -0500 +++ new/src/java.base/share/native/include/jvm.h 2016-03-02 21:17:16.046825523 -0500 @@ -171,11 +171,8 @@ 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 --- old/src/java.base/share/native/libjava/Throwable.c 2016-03-02 21:17:17.265671697 -0500 +++ new/src/java.base/share/native/libjava/Throwable.c 2016-03-02 21:17:17.096310964 -0500 @@ -50,15 +50,9 @@ 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); }