Merge "[521999] Handle IBM java.lang.String implementation"
diff --git a/plugins/org.eclipse.mat.dtfj/src/org/eclipse/mat/dtfj/DTFJIndexBuilder.java b/plugins/org.eclipse.mat.dtfj/src/org/eclipse/mat/dtfj/DTFJIndexBuilder.java
index 9d693f2..e988be8 100644
--- a/plugins/org.eclipse.mat.dtfj/src/org/eclipse/mat/dtfj/DTFJIndexBuilder.java
+++ b/plugins/org.eclipse.mat.dtfj/src/org/eclipse/mat/dtfj/DTFJIndexBuilder.java
@@ -6918,6 +6918,19 @@
                                 Messages.DTFJIndexBuilder_UnableToFindClassLoader, name, format(claddr)), null);

             }

             loader = getLoaderAddress(load, bootLoaderAddress);

+            

+            int loaderId = indexToAddress.reverse(loader);

+            

+            if (loaderId < 0)

+            {

+                // If we can't find the loader ID, then we'll run into issues later

+                // in GarbageCleaner (see bug 464199), so we'll just raise an error

+                // and set the classloader to the bootloader.

+                listener.sendUserMessage(Severity.ERROR, MessageFormat.format(

+                                Messages.DTFJIndexBuilder_ClassLoaderAtAddressNotFound, format(loader), loaderId,

+                                format(claddr), indexToAddress.reverse(claddr), name), null);

+                loader = fixBootLoaderAddress(bootLoaderAddress, bootLoaderAddress);

+            }

         }

         catch (CorruptDataException e)

         {

diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
index 23ee997..4226ba7 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
@@ -123,6 +123,8 @@
 	public static String OQLParser_Encountered_X_at_line_X_column_X_Was_expecting_one_of_X;

 	public static String OQLParser_Missing_return_statement_in_function;

 	

+	public static String ThreadStackHelper_InvalidThread;

+	

     static

     {

         // initialize resource bundle

diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/ThreadStackHelper.java b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/ThreadStackHelper.java
index 42116a1..ce96844 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/ThreadStackHelper.java
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/ThreadStackHelper.java
@@ -18,15 +18,18 @@
 import java.math.BigInteger;

 import java.util.ArrayList;

 import java.util.List;

+import java.util.logging.Logger;

 

 import org.eclipse.mat.SnapshotException;

 import org.eclipse.mat.collect.ArrayInt;

 import org.eclipse.mat.collect.HashMapIntObject;

 import org.eclipse.mat.snapshot.ISnapshot;

 import org.eclipse.mat.snapshot.model.IThreadStack;

+import org.eclipse.mat.util.MessageUtil;

 

 /* package */class ThreadStackHelper

 {

+    private static final Logger logger = Logger.getLogger(ThreadStackHelper.class.getCanonicalName());

 

     /* package */static HashMapIntObject<IThreadStack> loadThreadsData(ISnapshot snapshot) throws SnapshotException

     {

@@ -83,9 +86,19 @@
 

                     if (threadAddress != -1)

                     {

-                        int threadId = snapshot.mapAddressToId(threadAddress);

-                        IThreadStack stack = new ThreadStackImpl(threadId, buildFrames(lines, line2locals));

-                        threadId2stack.put(threadId, stack);

+                        try

+                        {

+                            int threadId = snapshot.mapAddressToId(threadAddress);

+                            IThreadStack stack = new ThreadStackImpl(threadId, buildFrames(lines, line2locals));

+                            threadId2stack.put(threadId, stack);

+                        }

+                        catch (SnapshotException se)

+                        {

+                            // See

+                            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=520908

+                            logger.severe(MessageUtil.format(Messages.ThreadStackHelper_InvalidThread,

+                                            "0x" + Long.toHexString(threadAddress), se.getLocalizedMessage())); //$NON-NLS-1$

+                        }

                     }

                 }

 

diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
index 904514b..9ef08a2 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
@@ -117,3 +117,4 @@
 OQLParser_Encountered_X_at_line_X_column_X_Was_expecting_one_of_X=Encountered "{0}" at line {1}, column {2}.\nWas expecting one of: {3}

 OQLParser_Missing_return_statement_in_function=Missing return statement in function

 

+ThreadStackHelper_InvalidThread=Invalid thread {0}: {1}
\ No newline at end of file