7045138: OutOfMemoryError thrown without stack trace in jdk7-b142
authordarcy
Wed, 18 May 2011 16:49:20 -0700
changeset 9703 f607d3a94d70
parent 9701 4608ed0204d2
child 9704 915171a14a94
7045138: OutOfMemoryError thrown without stack trace in jdk7-b142 Reviewed-by: dholmes, mchung
jdk/src/share/classes/java/lang/Throwable.java
--- a/jdk/src/share/classes/java/lang/Throwable.java	Mon May 16 12:58:48 2011 -0700
+++ b/jdk/src/share/classes/java/lang/Throwable.java	Wed May 18 16:49:20 2011 -0700
@@ -777,7 +777,8 @@
      * @see     java.lang.Throwable#printStackTrace()
      */
     public synchronized Throwable fillInStackTrace() {
-        if (stackTrace != null) {
+        if (stackTrace != null ||
+            backtrace != null /* Out of protocol state */ ) {
             fillInStackTrace(0);
             stackTrace = UNASSIGNED_STACK;
         }
@@ -817,7 +818,8 @@
     private synchronized StackTraceElement[] getOurStackTrace() {
         // Initialize stack trace field with information from
         // backtrace if this is the first call to this method
-        if (stackTrace == UNASSIGNED_STACK) {
+        if (stackTrace == UNASSIGNED_STACK ||
+            (stackTrace == null && backtrace != null) /* Out of protocol state */) {
             int depth = getStackTraceDepth();
             stackTrace = new StackTraceElement[depth];
             for (int i=0; i < depth; i++)
@@ -865,7 +867,8 @@
         }
 
         synchronized (this) {
-            if (this.stackTrace == null) // Immutable stack
+            if (this.stackTrace == null && // Immutable stack
+                backtrace == null) // Test for out of protocol state
                 return;
             this.stackTrace = defensiveCopy;
         }