ART: Rewrite test 911 stack trace reporting

Return an array of arrays, which is easier to extend and doesn't
have the tight coupling of a collapsed array.

Bug: 31684812
Test: m test-art-host-run-test-911-get-stack-trace
Change-Id: I4221ef8135c7b76a50c1af25f6328f447cf40ab2
diff --git a/test/911-get-stack-trace/expected.txt b/test/911-get-stack-trace/expected.txt
index 20bab78..409c318 100644
--- a/test/911-get-stack-trace/expected.txt
+++ b/test/911-get-stack-trace/expected.txt
@@ -3,7 +3,7 @@
 ###################
 From top
 ---------
- getStackTrace (Ljava/lang/Thread;II)[Ljava/lang/String;
+ getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String;
  print (Ljava/lang/Thread;II)V
  printOrWait (IILMain$ControlData;)V
  baz (IIILMain$ControlData;)Ljava/lang/Object;
@@ -44,7 +44,7 @@
  doTest ()V
  main ([Ljava/lang/String;)V
 ---------
- getStackTrace (Ljava/lang/Thread;II)[Ljava/lang/String;
+ getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String;
  print (Ljava/lang/Thread;II)V
  printOrWait (IILMain$ControlData;)V
  baz (IIILMain$ControlData;)Ljava/lang/Object;
diff --git a/test/911-get-stack-trace/src/Main.java b/test/911-get-stack-trace/src/Main.java
index df4501d..722bee8 100644
--- a/test/911-get-stack-trace/src/Main.java
+++ b/test/911-get-stack-trace/src/Main.java
@@ -109,13 +109,14 @@
     t.join();
   }
 
-  public static void print(String[] stack) {
+  public static void print(String[][] stack) {
     System.out.println("---------");
-    for (int i = 0; i < stack.length; i += 2) {
-      System.out.print(' ');
-      System.out.print(stack[i]);
-      System.out.print(' ');
-      System.out.println(stack[i + 1]);
+    for (String[] stackElement : stack) {
+      for (String part : stackElement) {
+        System.out.print(' ');
+        System.out.print(part);
+      }
+      System.out.println();
     }
   }
 
@@ -174,5 +175,5 @@
     volatile boolean stop = false;
   }
 
-  public static native String[] getStackTrace(Thread thread, int start, int max);
+  public static native String[][] getStackTrace(Thread thread, int start, int max);
 }
diff --git a/test/911-get-stack-trace/stack_trace.cc b/test/911-get-stack-trace/stack_trace.cc
index e7d9380..d562753 100644
--- a/test/911-get-stack-trace/stack_trace.cc
+++ b/test/911-get-stack-trace/stack_trace.cc
@@ -20,6 +20,7 @@
 #include <stdio.h>
 
 #include "base/logging.h"
+#include "base/macros.h"
 #include "jni.h"
 #include "openjdkjvmti/jvmti.h"
 #include "ScopedLocalRef.h"
@@ -44,8 +45,7 @@
     }
   }
 
-  auto callback = [&](jint i) -> jstring {
-    size_t method_index = static_cast<size_t>(i) / 2;
+  auto callback = [&](jint method_index) -> jobjectArray {
     char* name;
     char* sig;
     char* gen;
@@ -58,12 +58,18 @@
         return nullptr;
       }
     }
-    jstring callback_result;
-    if (i % 2 == 0) {
-      callback_result = name == nullptr ? nullptr : env->NewStringUTF(name);
-    } else {
-      callback_result = sig == nullptr ? nullptr : env->NewStringUTF(sig);
-    }
+
+    auto inner_callback = [&](jint component_index) -> jstring {
+      switch (component_index) {
+        case 0:
+          return (name == nullptr) ? nullptr : env->NewStringUTF(name);
+        case 1:
+          return (sig == nullptr) ? nullptr : env->NewStringUTF(sig);
+      }
+      LOG(FATAL) << "Unreachable";
+      UNREACHABLE();
+    };
+    jobjectArray inner_array = CreateObjectArray(env, 2, "java/lang/String", inner_callback);
 
     if (name != nullptr) {
       jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(name));
@@ -74,9 +80,10 @@
     if (gen != nullptr) {
       jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(gen));
     }
-    return callback_result;
+
+    return inner_array;
   };
-  return CreateObjectArray(env, 2 * count, "java/lang/String", callback);
+  return CreateObjectArray(env, count, "[Ljava/lang/String;", callback);
 }
 
 // Don't do anything