Adding support for arbitrary VM args in dalvik runner.
diff --git a/libcore/tools/runner/java/dalvik/runner/DalvikRunner.java b/libcore/tools/runner/java/dalvik/runner/DalvikRunner.java
index 5c5075a..84d54ef 100644
--- a/libcore/tools/runner/java/dalvik/runner/DalvikRunner.java
+++ b/libcore/tools/runner/java/dalvik/runner/DalvikRunner.java
@@ -41,6 +41,7 @@
     private Set<File> expectationFiles = new LinkedHashSet<File>();
     private File xmlReportsDirectory;
     private String javaHome;
+    private List<String> vmArgs = new ArrayList<String>();
     private boolean clean = true;
     private String deviceRunnerDir = "/sdcard/dalvikrunner";
     private List<File> testFiles = new ArrayList<File>();
@@ -99,6 +100,9 @@
             } else if ("--verbose".equals(args[i])) {
                 Logger.getLogger("dalvik.runner").setLevel(Level.FINE);
 
+            } else if ("--vm-arg".equals(args[i])) {
+                vmArgs.add(args[++i]);
+
             } else if ("--xml-reports-directory".equals(args[i])) {
                 xmlReportsDirectory = new File(args[++i]);
                 if (!xmlReportsDirectory.isDirectory()) {
@@ -163,6 +167,9 @@
         System.out.println("      test before the runner aborts it.");
         System.out.println("      Default is: " + timeoutSeconds);
         System.out.println();
+        System.out.println("  --vm-arg <argument>: include the specified argument when spawning a");
+        System.out.println("      virtual machine. Examples: -Xint:fast, -ea, -Xmx16M");
+        System.out.println();
         System.out.println("  --xml-reports-directory <path>: directory to emit JUnit-style");
         System.out.println("      XML test results.");
         System.out.println();
@@ -172,9 +179,10 @@
 
     private void run() throws Exception {
         Vm vm = javaHome != null
-                ? new JavaVm(debugPort, timeoutSeconds, sdkJar, localTemp, javaHome, clean)
-                : new DeviceDalvikVm(debugPort, timeoutSeconds, sdkJar, localTemp,
-                        clean, deviceRunnerDir);
+                ? new JavaVm(debugPort, timeoutSeconds, sdkJar, localTemp,
+                        javaHome, vmArgs, clean)
+                : new DeviceDalvikVm(debugPort, timeoutSeconds, sdkJar,
+                        localTemp, vmArgs, clean, deviceRunnerDir);
         List<CodeFinder> codeFinders = Arrays.asList(
                 new JtregFinder(localTemp),
                 new JUnitFinder(),
diff --git a/libcore/tools/runner/java/dalvik/runner/DeviceDalvikVm.java b/libcore/tools/runner/java/dalvik/runner/DeviceDalvikVm.java
index d95e948..47db11f 100644
--- a/libcore/tools/runner/java/dalvik/runner/DeviceDalvikVm.java
+++ b/libcore/tools/runner/java/dalvik/runner/DeviceDalvikVm.java
@@ -17,6 +17,7 @@
 package dalvik.runner;
 
 import java.io.File;
+import java.util.List;
 import java.util.logging.Logger;
 
 /**
@@ -36,9 +37,9 @@
 
     private final Adb adb = new Adb();
 
-    DeviceDalvikVm(Integer debugPort, long timeoutSeconds,
-            File sdkJar, File localTemp, boolean clean, String runnerDir) {
-        super(debugPort, timeoutSeconds, sdkJar, localTemp, clean);
+    DeviceDalvikVm(Integer debugPort, long timeoutSeconds, File sdkJar,
+            File localTemp, List<String> additionalVmArgs, boolean clean, String runnerDir) {
+        super(debugPort, timeoutSeconds, sdkJar, localTemp, additionalVmArgs, clean);
 
         this.runnerDir = new File(runnerDir);
         this.testTemp = new File(this.runnerDir, "/tests.tmp");
diff --git a/libcore/tools/runner/java/dalvik/runner/JavaVm.java b/libcore/tools/runner/java/dalvik/runner/JavaVm.java
index c1eab3e..8b53477 100644
--- a/libcore/tools/runner/java/dalvik/runner/JavaVm.java
+++ b/libcore/tools/runner/java/dalvik/runner/JavaVm.java
@@ -17,6 +17,7 @@
 package dalvik.runner;
 
 import java.io.File;
+import java.util.List;
 
 /**
  * A local Java virtual machine like Harmony or the RI.
@@ -25,9 +26,9 @@
 
     private final String javaHome;
 
-    JavaVm(Integer debugPort, long timeoutSeconds, File sdkJar,
-            File localTemp, String javaHome, boolean clean) {
-        super(debugPort, timeoutSeconds, sdkJar, localTemp, clean);
+    JavaVm(Integer debugPort, long timeoutSeconds, File sdkJar, File localTemp,
+            String javaHome, List<String> additionalVmArgs, boolean clean) {
+        super(debugPort, timeoutSeconds, sdkJar, localTemp, additionalVmArgs, clean);
         this.javaHome = javaHome;
     }
 
diff --git a/libcore/tools/runner/java/dalvik/runner/Strings.java b/libcore/tools/runner/java/dalvik/runner/Strings.java
index 741af18..e696841 100644
--- a/libcore/tools/runner/java/dalvik/runner/Strings.java
+++ b/libcore/tools/runner/java/dalvik/runner/Strings.java
@@ -20,8 +20,8 @@
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.InputStreamReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
diff --git a/libcore/tools/runner/java/dalvik/runner/Vm.java b/libcore/tools/runner/java/dalvik/runner/Vm.java
index 52bf5f6..3d66fce 100644
--- a/libcore/tools/runner/java/dalvik/runner/Vm.java
+++ b/libcore/tools/runner/java/dalvik/runner/Vm.java
@@ -19,7 +19,9 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -61,6 +63,7 @@
             = Executors.newFixedThreadPool(1, Threads.daemonThreadFactory());
 
     protected final Integer debugPort;
+    protected final List<String> additionalVmArgs;
     protected final long timeoutSeconds;
     protected final File sdkJar;
     protected final File localTemp;
@@ -70,11 +73,12 @@
     private Classpath testRunnerClasses;
 
     Vm(Integer debugPort, long timeoutSeconds, File sdkJar, File localTemp,
-            boolean clean) {
+            List<String> additionalVmArgs, boolean clean) {
         this.debugPort = debugPort;
         this.timeoutSeconds = timeoutSeconds;
         this.sdkJar = sdkJar;
         this.localTemp = localTemp;
+        this.additionalVmArgs = additionalVmArgs;
         this.clean = clean;
     }
 
@@ -230,6 +234,7 @@
                 .classpath(getRuntimeSupportClasspath())
                 .userDir(testRun.getUserDir())
                 .debugPort(debugPort)
+                .vmArgs(additionalVmArgs)
                 .mainClass(testRun.getTestRunner().getName())
                 .build();
 
@@ -305,7 +310,7 @@
         private Integer debugPort;
         private String mainClass;
         private List<String> vmCommand = Collections.singletonList("java");
-        private List<String> vmArgs = Collections.emptyList();
+        private List<String> vmArgs = new ArrayList<String>();
 
         public VmCommandBuilder vmCommand(String... vmCommand) {
             this.vmCommand = Arrays.asList(vmCommand.clone());
@@ -343,7 +348,11 @@
         }
 
         public VmCommandBuilder vmArgs(String... vmArgs) {
-            this.vmArgs = Arrays.asList(vmArgs.clone());
+            return vmArgs(Arrays.asList(vmArgs));
+        }
+
+        public VmCommandBuilder vmArgs(Collection<String> vmArgs) {
+            this.vmArgs.addAll(vmArgs);
             return this;
         }