Externalize test code

Change-Id: Iab19397c7a72fb9a3ca63bfd0bc4eaf1a98138ba
diff --git a/Android.mk b/Android.mk
index 27b4a72..d23b75e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -42,24 +42,27 @@
   $(foreach file,$(sort $(ART_HOST_TEST_EXECUTABLES)),$(1) $(file) &&) true
 endef
 
+ART_HOST_TEST_DEPENDENCIES   := $(ART_HOST_TEST_EXECUTABLES)   $(ANDROID_HOST_OUT)/framework/core-hostdex.jar   $(ART_TEST_DEX_FILES)
+ART_TARGET_TEST_DEPENDENCIES := $(ART_TARGET_TEST_EXECUTABLES) $(ANDROID_PRODUCT_OUT)/system/framework/core.jar $(ART_TEST_DEX_FILES)
+
 # "mm test-art-host" to build and run all host tests
 .PHONY: test-art-host
-test-art-host: $(ART_HOST_TEST_EXECUTABLES) $(ANDROID_HOST_OUT)/framework/core-hostdex.jar
+test-art-host: $(ART_HOST_TEST_DEPENDENCIES)
 	$(call run-host-tests-with,)
 
 # "mm valgrind-art-host" to build and run all host tests under valgrind.
 .PHONY: valgrind-art-host
-valgrind-art-host: $(ART_HOST_TEST_EXECUTABLES) $(ANDROID_HOST_OUT)/framework/core-hostdex.jar
+valgrind-art-host: $(ART_HOST_TEST_DEPENDENCIES)
 	$(call run-host-tests-with,"valgrind")
 
 # "mm tsan-art-host" to build and run all host tests under tsan.
 .PHONY: tsan-art-host
-tsan-art-host: $(ART_HOST_TEST_EXECUTABLES) $(ANDROID_HOST_OUT)/framework/core-hostdex.jar
+tsan-art-host: $(ART_HOST_TEST_DEPENDENCIES)
 	$(call run-host-tests-with,"tsan")
 
 # "mm test-art-device" to build and run all target tests
 .PHONY: test-art-target
-test-art-target: $(ART_TARGET_TEST_EXECUTABLES) $(ANDROID_PRODUCT_OUT)/system/framework/core.jar
+test-art-target: $(ART_TARGET_TEST_DEPENDENCIES)
 	adb remount
 	adb sync
 	adb shell touch /sdcard/test-art-target
diff --git a/build/Android.common.mk b/build/Android.common.mk
index cab1572..a801889 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -141,3 +141,20 @@
 	$(TEST_COMMON_SRC_FILES) \
 	src/assembler_x86_test.cc \
 	src/managed_register_x86_test.cc
+
+# subdirectories of test/
+TEST_DEX_DIRECTORIES := \
+	AllFields \
+	CreateMethodDescriptor \
+	Fibonacci \
+	IntMath \
+	Interfaces \
+	Main \
+	MyClass \
+	MyClassNatives \
+	Nested \
+	ProtoCompare \
+	ProtoCompare2 \
+	StaticLeafMethods \
+	Statics \
+	XandY
diff --git a/build/Android.test.mk b/build/Android.test.mk
index 22209ec..d940a1d 100644
--- a/build/Android.test.mk
+++ b/build/Android.test.mk
@@ -47,7 +47,6 @@
     ART_TARGET_TEST_EXECUTABLES += $(TARGET_OUT_EXECUTABLES)/$$(LOCAL_MODULE)
   else
     ART_HOST_TEST_EXECUTABLES += $(HOST_OUT_EXECUTABLES)/$$(LOCAL_MODULE)
-    LOCAL_LDFLAGS += -ldl -lpthread
   endif
 endef
 
@@ -55,3 +54,18 @@
 ifeq ($(WITH_HOST_DALVIK),true)
   $(foreach file,$(TEST_HOST_SRC_FILES), $(eval $(call build-art-test,host,$(file))))
 endif
+
+ART_TEST_DEX_FILES :=
+
+# $(1): directory
+define build-art-test-dex
+  include $(CLEAR_VARS)
+  LOCAL_MODULE := art-test-dex-$(1)
+  LOCAL_MODULE_TAGS := optional
+  LOCAL_SRC_FILES := $(call all-java-files-under, test/$(1))
+  # TODO: remove --core-library when separate compilation works
+  LOCAL_DX_FLAGS := --core-library
+  include $(BUILD_JAVA_LIBRARY)
+  ART_TEST_DEX_FILES += $(TARGET_OUT_JAVA_LIBRARIES)/$$(LOCAL_MODULE).jar
+endef
+$(foreach dir,$(TEST_DEX_DIRECTORIES), $(eval $(call build-art-test-dex,$(dir))))
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 8de8ba1..201db45 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -273,7 +273,7 @@
 }
 
 TEST_F(ClassLinkerTest, FindClassNested) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kNestedDex, "kNestedDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("Nested"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
 
   Class* outer = class_linker_->FindClass("LNested;", class_loader);
@@ -328,7 +328,7 @@
   EXPECT_EQ(0U, JavaLangObject->NumStaticFields());
   EXPECT_EQ(0U, JavaLangObject->NumInterfaces());
 
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassDex, "kMyClassDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("MyClass"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   AssertNonExistentClass("LMyClass;");
   Class* MyClass = class_linker_->FindClass("LMyClass;", class_loader);
@@ -451,8 +451,8 @@
 }
 
 TEST_F(ClassLinkerTest, TwoClassLoadersOneClass) {
-  scoped_ptr<DexFile> dex_1(OpenDexFileBase64(kMyClassDex, "kMyClassDex"));
-  scoped_ptr<DexFile> dex_2(OpenDexFileBase64(kMyClassDex, "kMyClassDex"));
+  scoped_ptr<const DexFile> dex_1(OpenTestDexFile("MyClass"));
+  scoped_ptr<const DexFile> dex_2(OpenTestDexFile("MyClass"));
   PathClassLoader* class_loader_1 = AllocPathClassLoader(dex_1.get());
   PathClassLoader* class_loader_2 = AllocPathClassLoader(dex_2.get());
   Class* MyClass_1 = class_linker_->FindClass("LMyClass;", class_loader_1);
@@ -464,7 +464,7 @@
 
 TEST_F(ClassLinkerTest, StaticFields) {
   // TODO: uncomment expectations of initial values when InitializeClass works
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStatics, "kStatics"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("Statics"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* statics = class_linker_->FindClass("LStatics;", class_loader);
   class_linker_->EnsureInitialized(statics);
@@ -534,7 +534,7 @@
 }
 
 TEST_F(ClassLinkerTest, Interfaces) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kInterfacesDex, "kInterfacesDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("Interfaces"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* I = class_linker_->FindClass("LInterfaces$I;", class_loader);
   Class* J = class_linker_->FindClass("LInterfaces$J;", class_loader);
diff --git a/src/common_test.h b/src/common_test.h
index e56a3a0..aa9229e 100644
--- a/src/common_test.h
+++ b/src/common_test.h
@@ -19,407 +19,13 @@
 
 namespace art {
 
-// package java.lang;
-// public class Object {}
-//
-// class MyClass {}
-static const char kMyClassDex[] =
-  "ZGV4CjAzNQA5Nm9IrCVm91COwepff7LhIE23GZIxGjgIAgAAcAAAAHhWNBIAAAAAAAAAAIABAAAG"
-  "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAgAAALAAAAAYAQAA8AAAABwB"
-  "AAAkAQAALwEAAEMBAABRAQAAXgEAAAEAAAACAAAABQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAQAA"
-  "AAAAAAABAAAAAQAAAP////8AAAAABAAAAAAAAABrAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
-  "AAAAAHUBAAAAAAAAAQABAAAAAABhAQAAAQAAAA4AAAABAAEAAQAAAGYBAAAEAAAAcBABAAAADgAG"
-  "PGluaXQ+AAlMTXlDbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAMTXlDbGFzcy5qYXZhAAtPYmpl"
-  "Y3QuamF2YQABVgACAAcOAAUABw4AAAABAAGBgATwAQAAAQAAgIAEhAIACwAAAAAAAAABAAAAAAAA"
-  "AAEAAAAGAAAAcAAAAAIAAAADAAAAiAAAAAMAAAABAAAAlAAAAAUAAAACAAAAoAAAAAYAAAACAAAA"
-  "sAAAAAEgAAACAAAA8AAAAAIgAAAGAAAAHAEAAAMgAAACAAAAYQEAAAAgAAACAAAAawEAAAAQAAAB"
-  "AAAAgAEAAA==";
-
-// class Nested {
-//     class Inner {
-//     }
-// }
-static const char kNestedDex[] =
-  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
-  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
-  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
-  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
-  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
-  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
-  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
-  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
-  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
-  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
-  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
-  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
-  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
-  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
-  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
-  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
-
-// class ProtoCompare {
-//     int m1(short x, int y, long z) { return x + y + (int)z; }
-//     int m2(short x, int y, long z) { return x + y + (int)z; }
-//     int m3(long x, int y, short z) { return (int)x + y + z; }
-//     long m4(long x, int y, short z) { return x + y + z; }
-// }
-static const char kProtoCompareDex[] =
-  "ZGV4CjAzNQBLUetu+TVZ8gsYsCOFoij7ecsHaGSEGA8gAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
-  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
-  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAOAgAAIgIAADUCAAA4AgAAOwIAAD8CAABDAgAARwIA"
-  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
-  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
-  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHACAAAAAAAAAQABAAEAAABLAgAABAAAAHAQ"
-  "BQAAAA4ABwAFAAAAAABQAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWAIAAAUAAACQAAMEhFGw"
-  "EA8AAAAGAAUAAAAAAGACAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGgCAAAFAAAAgXC7UIGCuyAQAAAA"
-  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMADkxQ"
-  "cm90b0NvbXBhcmU7ABJMamF2YS9sYW5nL09iamVjdDsAEVByb3RvQ29tcGFyZS5qYXZhAAFTAAFW"
-  "AAJtMQACbTIAAm0zAAJtNAABAAcOAAIDAAAABw4AAwMAAAAHDgAEAwAAAAcOAAUDAAAABw4AAAAB"
-  "BACAgATEAgEA3AIBAPgCAQCUAwEArAMAAAwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
-  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
-  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAEsCAAAAIAAAAQAAAHACAAAAEAAAAQAAAIwC"
-  "AAA=";
-
-// class ProtoCompare2 {
-//     int m1(short x, int y, long z) { return x + y + (int)z; }
-//     int m2(short x, int y, long z) { return x + y + (int)z; }
-//     int m3(long x, int y, short z) { return (int)x + y + z; }
-//     long m4(long x, int y, short z) { return x + y + z; }
-// }
-static const char kProtoCompare2Dex[] =
-  "ZGV4CjAzNQDVUXj687EpyTTDJZEZPA8dEYnDlm0Ir6YgAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
-  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
-  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAPAgAAIwIAADcCAAA6AgAAPQIAAEECAABFAgAASQIA"
-  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
-  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
-  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHICAAAAAAAAAQABAAEAAABNAgAABAAAAHAQ"
-  "BQAAAA4ABwAFAAAAAABSAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWgIAAAUAAACQAAMEhFGw"
-  "EA8AAAAGAAUAAAAAAGICAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGoCAAAFAAAAgXC7UIGCuyAQAAAA"
-  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMAD0xQ"
-  "cm90b0NvbXBhcmUyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJQcm90b0NvbXBhcmUyLmphdmEAAVMA"
-  "AVYAAm0xAAJtMgACbTMAAm00AAEABw4AAgMAAAAHDgADAwAAAAcOAAQDAAAABw4ABQMAAAAHDgAA"
-  "AAEEAICABMQCAQDcAgEA+AIBAJQDAQCsAwwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
-  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
-  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAE0CAAAAIAAAAQAAAHICAAAAEAAAAQAAAIwC"
-  "AAA=";
-
-// javac MyClass.java && dx --dex --output=MyClass.dex
-//   --core-library MyClass.class java/lang/Object.class && base64 MyClass.dex
-// package java.lang;
-// public class Object {}
-// class MyClass {
-//   native void foo();
-//   native int fooI(int x);
-//   native int fooII(int x, int y);
-//   native double fooDD(double x, double y);
-//   native Object fooIOO(int x, Object y, Object z);
-//   static native Object fooSIOO(int x, Object y, Object z);
-//   static synchronized native Object fooSSIOO(int x, Object y, Object z);
-// }
-static const char kMyClassNativesDex[] =
-  "ZGV4CjAzNQA4WWrpXgdlkoTHR8Yubx4LJO4HbGsX1p1EAwAAcAAAAHhWNBIAAAAAAAAAALACAAAT"
-  "AAAAcAAAAAUAAAC8AAAABQAAANAAAAAAAAAAAAAAAAkAAAAMAQAAAgAAAFQBAACwAQAAlAEAAOIB"
-  "AADqAQAA7QEAAPIBAAD1AQAA+QEAAP4BAAAEAgAADwIAACMCAAAxAgAAPgIAAEECAABGAgAATQIA"
-  "AFMCAABaAgAAYgIAAGsCAAABAAAAAwAAAAcAAAAIAAAACwAAAAIAAAAAAAAAwAEAAAQAAAABAAAA"
-  "yAEAAAUAAAABAAAA0AEAAAYAAAADAAAA2AEAAAsAAAAEAAAAAAAAAAIABAAAAAAAAgAEAAwAAAAC"
-  "AAAADQAAAAIAAQAOAAAAAgACAA8AAAACAAMAEAAAAAIAAwARAAAAAgADABIAAAADAAQAAAAAAAMA"
-  "AAABAAAA/////wAAAAAKAAAAAAAAAH8CAAAAAAAAAgAAAAAAAAADAAAAAAAAAAkAAAAAAAAAiQIA"
-  "AAAAAAABAAEAAAAAAHUCAAABAAAADgAAAAEAAQABAAAAegIAAAQAAABwEAgAAAAOAAIAAAAAAAAA"
-  "AQAAAAEAAAACAAAAAQABAAMAAAABAAMAAwAGPGluaXQ+AAFEAANEREQAAUkAAklJAANJSUkABExJ"
-  "TEwACUxNeUNsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAC09iamVjdC5q"
-  "YXZhAAFWAANmb28ABWZvb0REAARmb29JAAVmb29JSQAGZm9vSU9PAAdmb29TSU9PAAhmb29TU0lP"
-  "TwADAAcOAAEABw4AAAABAAiBgASUAwAAAwUAgIAEqAMGiAIAAaiCCAABgAIAAYACAAGAAgABgAIA"
-  "AYACAAwAAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAABQAAALwAAAADAAAABQAAANAAAAAF"
-  "AAAACQAAAAwBAAAGAAAAAgAAAFQBAAABIAAAAgAAAJQBAAABEAAABAAAAMABAAACIAAAEwAAAOIB"
-  "AAADIAAAAgAAAHUCAAAAIAAAAgAAAH8CAAAAEAAAAQAAALACAAA=";
-
-// class CreateMethodDescriptor {
-//     Float m1(int a, double b, long c, Object d) { return null; }
-//     CreateMethodDescriptor m2(boolean x, short y, char z) { return null; }
-// }
-static const char kCreateMethodDescriptorDex[] =
-  "ZGV4CjAzNQBSU7aKdNXwH+uOpti/mvZ4/Dk8wM8VtNbgAgAAcAAAAHhWNBIAAAAAAAAAAEwCAAAQ"
-  "AAAAcAAAAAoAAACwAAAAAwAAANgAAAAAAAAAAAAAAAQAAAD8AAAAAQAAABwBAACkAQAAPAEAAJQB"
-  "AACcAQAAnwEAALwBAAC/AQAAwgEAAMUBAADfAQAA5gEAAOwBAAD/AQAAEwIAABYCAAAZAgAAHAIA"
-  "ACACAAABAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAKAAAACwAAAAwAAAANAAAACAAAAAQAAAB8AQAA"
-  "BwAAAAUAAACIAQAADAAAAAgAAAAAAAAABAACAAAAAAAEAAEADgAAAAQAAAAPAAAABgACAAAAAAAE"
-  "AAAAAAAAAAYAAAAAAAAAAgAAAAAAAAA6AgAAAAAAAAEAAQABAAAAJAIAAAQAAABwEAMAAAAOAAgA"
-  "BwAAAAAAKQIAAAIAAAASABEABQAEAAAAAAAyAgAAAgAAABIAEQADAAAACQAHAAAAAAAEAAAAAgAB"
-  "AAMABgAGPGluaXQ+AAFDABtDcmVhdGVNZXRob2REZXNjcmlwdG9yLmphdmEAAUQAAUkAAUoAGExD"
-  "cmVhdGVNZXRob2REZXNjcmlwdG9yOwAFTElESkwABExaU0MAEUxqYXZhL2xhbmcvRmxvYXQ7ABJM"
-  "amF2YS9sYW5nL09iamVjdDsAAVMAAVYAAVoAAm0xAAJtMgABAAcOAAIEAAAAAAcOAAMDAAAABw4A"
-  "AAABAgCAgAS8AgEA1AIBAOgCDAAAAAAAAAABAAAAAAAAAAEAAAAQAAAAcAAAAAIAAAAKAAAAsAAA"
-  "AAMAAAADAAAA2AAAAAUAAAAEAAAA/AAAAAYAAAABAAAAHAEAAAEgAAADAAAAPAEAAAEQAAACAAAA"
-  "fAEAAAIgAAAQAAAAlAEAAAMgAAADAAAAJAIAAAAgAAABAAAAOgIAAAAQAAABAAAATAIAAA==";
-
-// class X {}
-// class Y extends X {}
-static const char kXandY[] =
-  "ZGV4CjAzNQAlLMqyB72TxJW4zl5w75F072u4Ig6KvCMEAgAAcAAAAHhWNBIAAAAAAAAAAHwBAAAG"
-  "AAAAcAAAAAQAAACIAAAAAQAAAJgAAAAAAAAAAAAAAAMAAACkAAAAAgAAALwAAAAIAQAA/AAAACwB"
-  "AAA0AQAAOQEAAD4BAABSAQAAVQEAAAEAAAACAAAAAwAAAAQAAAAEAAAAAwAAAAAAAAAAAAAAAAAA"
-  "AAEAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABQAAAAAAAABnAQAAAAAAAAEAAAAAAAAA"
-  "AAAAAAAAAAAFAAAAAAAAAHEBAAAAAAAAAQABAAEAAABdAQAABAAAAHAQAgAAAA4AAQABAAEAAABi"
-  "AQAABAAAAHAQAAAAAA4ABjxpbml0PgADTFg7AANMWTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgAG"
-  "WC5qYXZhAAIABw4AAwAHDgAAAAEAAICABPwBAAABAAGAgASUAgALAAAAAAAAAAEAAAAAAAAAAQAA"
-  "AAYAAABwAAAAAgAAAAQAAACIAAAAAwAAAAEAAACYAAAABQAAAAMAAACkAAAABgAAAAIAAAC8AAAA"
-  "ASAAAAIAAAD8AAAAAiAAAAYAAAAsAQAAAyAAAAIAAABdAQAAACAAAAIAAABnAQAAABAAAAEAAAB8"
-  "AQAA";
-
-// class Statics {
-//   static boolean s0 = true;
-//   static byte s1 = 5;
-//   static char s2 = 'a';
-//   static short s3 = (short) 65000;
-//   static int s4 = 2000000000;
-//   static long s5 = 0x123456789abcdefL;
-//   static float s6 = 0.5f;
-//   static double s7 = 16777217;
-//   static Object s8 = "android";
-//   static Object[] s9 = { "a", "b" };
-// }
-static const char kStatics[] =
-  "ZGV4CjAzNQAYalInXcX4y0OBgb2yCw2/jGzZBSe34zmwAwAAcAAAAHhWNBIAAAAAAAAAABwDAAAc"
-  "AAAAcAAAAAwAAADgAAAAAQAAABABAAAKAAAAHAEAAAMAAABsAQAAAQAAAIQBAAAMAgAApAEAADwC"
-  "AABGAgAATgIAAFECAABUAgAAVwIAAFoCAABdAgAAYAIAAGsCAAB/AgAAggIAAJACAACTAgAAlgIA"
-  "AKsCAACuAgAAtwIAALoCAAC+AgAAwgIAAMYCAADKAgAAzgIAANICAADWAgAA2gIAAN4CAAACAAAA"
-  "AwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAAMAAAADQAAAA4AAAAMAAAACQAAAAAAAAAG"
-  "AAoAEgAAAAYAAAATAAAABgABABQAAAAGAAgAFQAAAAYABAAWAAAABgAFABcAAAAGAAMAGAAAAAYA"
-  "AgAZAAAABgAHABoAAAAGAAsAGwAAAAYAAAAAAAAABgAAAAEAAAAHAAAAAQAAAAYAAAAAAAAABwAA"
-  "AAAAAAALAAAAAAAAAPUCAAAAAAAABAAAAAAAAADiAgAAOAAAABITagMAABJQawABABMAYQBsAAIA"
-  "EwDo/W0AAwAUAACUNXdnAAQAGADvzauJZ0UjAWgABQAVAAA/ZwAGABgAAAAAEAAAcEFoAAcAGgAQ"
-  "AGkACAASICMACwASARoCDwBNAgABGgERAE0BAANpAAkADgABAAEAAQAAAPACAAAEAAAAcBACAAAA"
-  "DgAIPGNsaW5pdD4ABjxpbml0PgABQgABQwABRAABRgABSQABSgAJTFN0YXRpY3M7ABJMamF2YS9s"
-  "YW5nL09iamVjdDsAAVMADFN0YXRpY3MuamF2YQABVgABWgATW0xqYXZhL2xhbmcvT2JqZWN0OwAB"
-  "YQAHYW5kcm9pZAABYgACczAAAnMxAAJzMgACczMAAnM0AAJzNQACczYAAnM3AAJzOAACczkAAgAH"
-  "HS08S0taeEt4SwABAAcOAAoAAgAACAEIAQgBCAEIAQgBCAEIAQgBCACIgASkAwGAgASkBAAAAAwA"
-  "AAAAAAAAAQAAAAAAAAABAAAAHAAAAHAAAAACAAAADAAAAOAAAAADAAAAAQAAABABAAAEAAAACgAA"
-  "ABwBAAAFAAAAAwAAAGwBAAAGAAAAAQAAAIQBAAABIAAAAgAAAKQBAAACIAAAHAAAADwCAAADIAAA"
-  "AgAAAOICAAAAIAAAAQAAAPUCAAAAEAAAAQAAABwDAAA=";
-
-//  class AllFields {
-//    static boolean sZ;
-//    static byte sB;
-//    static char sC;
-//    static double sD;
-//    static float sF;
-//    static int sI;
-//    static long sJ;
-//    static short sS;
-//    static Object sObject;
-//    static Object[] sObjectArray;
-//
-//    boolean iZ;
-//    byte iB;
-//    char iC;
-//    double iD;
-//    float iF;
-//    int iI;
-//    long iJ;
-//    short iS;
-//    Object iObject;
-//    Object[] iObjectArray;
-//  }
-static const char kAllFields[] =
-  "ZGV4CjAzNQCdaMDlt1s2Pw65nbVCJcCcZcmroYXvMF/AAwAAcAAAAHhWNBIAAAAAAAAAACwDAAAi"
-  "AAAAcAAAAAwAAAD4AAAAAQAAACgBAAAUAAAANAEAAAIAAADUAQAAAQAAAOQBAAC8AQAABAIAABwC"
-  "AAAkAgAANAIAADcCAAA6AgAAPQIAAEACAABDAgAARgIAAFMCAABnAgAAagIAAG0CAABwAgAAhQIA"
-  "AIkCAACNAgAAkQIAAJUCAACZAgAAnQIAAKYCAAC0AgAAuAIAALwCAADAAgAAxAIAAMgCAADMAgAA"
-  "0AIAANQCAADdAgAA6wIAAO8CAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAAL"
-  "AAAADAAAAA0AAAALAAAACQAAAAAAAAAGAAAADgAAAAYAAQAPAAAABgACABAAAAAGAAMAEQAAAAYA"
-  "BAASAAAABgAFABMAAAAGAAcAFAAAAAYACwAVAAAABgAIABYAAAAGAAoAFwAAAAYAAAAYAAAABgAB"
-  "ABkAAAAGAAIAGgAAAAYAAwAbAAAABgAEABwAAAAGAAUAHQAAAAYABwAeAAAABgALAB8AAAAGAAgA"
-  "IAAAAAYACgAhAAAABgAAAAAAAAAHAAAAAAAAAAYAAAAAAAAABwAAAAAAAAABAAAAAAAAAPgCAAAA"
-  "AAAAAQABAAEAAADzAgAABAAAAHAQAQAAAA4ABjxpbml0PgAOQWxsRmllbGRzLmphdmEAAUIAAUMA"
-  "AUQAAUYAAUkAAUoAC0xBbGxGaWVsZHM7ABJMamF2YS9sYW5nL09iamVjdDsAAVMAAVYAAVoAE1tM"
-  "amF2YS9sYW5nL09iamVjdDsAAmlCAAJpQwACaUQAAmlGAAJpSQACaUoAB2lPYmplY3QADGlPYmpl"
-  "Y3RBcnJheQACaVMAAmlaAAJzQgACc0MAAnNEAAJzRgACc0kAAnNKAAdzT2JqZWN0AAxzT2JqZWN0"
-  "QXJyYXkAAnNTAAJzWgADAAcOAAoKAQAKCAEIAQgBCAEIAQgBCAEIAQgBCAAAAQABAAEAAQABAAEA"
-  "AQABAAEAAICABIQEAAAMAAAAAAAAAAEAAAAAAAAAAQAAACIAAABwAAAAAgAAAAwAAAD4AAAAAwAA"
-  "AAEAAAAoAQAABAAAABQAAAA0AQAABQAAAAIAAADUAQAABgAAAAEAAADkAQAAASAAAAEAAAAEAgAA"
-  "AiAAACIAAAAcAgAAAyAAAAEAAADzAgAAACAAAAEAAAD4AgAAABAAAAEAAAAsAwAA";
-
-
-// class Main {
-//   public static void main(String args[]) {
-//   }
-// }
-static const char kMainDex[] =
-  "ZGV4CjAzNQAPNypTL1TulODHFdpEa2pP98I7InUu7uQgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
-  "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
-  "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
-  "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
-  "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
-  "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
-  "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgIAE8AEBCYgCDAAA"
-  "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
-  "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
-  "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
-
-// class StaticLeafMethods {
-//   static void nop() {
-//   }
-//   static byte identity(byte x) {
-//     return x;
-//   }
-//   static int identity(int x) {
-//     return x;
-//   }
-//   static int sum(int a, int b) {
-//     return a + b;
-//   }
-//   static int sum(int a, int b, int c) {
-//     return a + b + c;
-//   }
-//   static int sum(int a, int b, int c, int d) {
-//     return a + b + c + d;
-//   }
-//   static int sum(int a, int b, int c, int d, int e) {
-//     return a + b + c + d + e;
-//   }
-//   static double identity(double x) {
-//     return x;
-//   }
-//   static double sum(double a, double b) {
-//     return a + b;
-//   }
-//   static double sum(double a, double b, double c) {
-//     return a + b + c;
-//   }
-//   static double sum(double a, double b, double c, double d) {
-//     return a + b + c + d;
-//   }
-//   static double sum(double a, double b, double c, double d, double e) {
-//     return a + b + c + d + e;
-//   }
-// }
-static const char kStaticLeafMethodsDex[] =
-  "ZGV4CjAzNQD8gEpaFD0w5dM8dsPaCQ3wIh0xaUjfni+IBQAAcAAAAHhWNBIAAAAAAAAAAPQEAAAW"
-  "AAAAcAAAAAYAAADIAAAADAAAAOAAAAAAAAAAAAAAAA4AAABwAQAAAQAAAOABAACIAwAAAAIAAK4D"
-  "AAC2AwAAuQMAAL0DAADAAwAAxAMAAMkDAADPAwAA1gMAAN4DAADhAwAA5QMAAOoDAADwAwAA9wMA"
-  "AP8DAAAUBAAAKAQAAEAEAABDBAAATQQAAFIEAAABAAAAAwAAAAkAAAAPAAAAEAAAABIAAAACAAAA"
-  "AAAAADgDAAAEAAAAAQAAAEADAAAFAAAAAQAAAEgDAAAGAAAAAQAAAFADAAAHAAAAAQAAAFwDAAAI"
-  "AAAAAQAAAGgDAAAKAAAAAgAAAHgDAAALAAAAAgAAAIADAAAMAAAAAgAAAIgDAAANAAAAAgAAAJQD"
-  "AAAOAAAAAgAAAKADAAASAAAABQAAAAAAAAADAAsAAAAAAAMAAAATAAAAAwABABMAAAADAAYAEwAA"
-  "AAMACwAUAAAAAwACABUAAAADAAMAFQAAAAMABAAVAAAAAwAFABUAAAADAAcAFQAAAAMACAAVAAAA"
-  "AwAJABUAAAADAAoAFQAAAAQACwAAAAAAAwAAAAAAAAAEAAAAAAAAABEAAAAAAAAAtwQAAAAAAAAB"
-  "AAEAAQAAAFcEAAAEAAAAcBANAAAADgABAAEAAAAAAFwEAAABAAAADwAAAAIAAgAAAAAAYgQAAAEA"
-  "AAAQAAAAAQABAAAAAABoBAAAAQAAAA8AAAAAAAAAAAAAAG4EAAABAAAADgAAAAYABAAAAAAAcwQA"
-  "AAMAAACrAAIEEAAAAAgABgAAAAAAegQAAAQAAACrAAIEy2AQAAoACAAAAAAAggQAAAUAAACrAAIE"
-  "y2DLgBAAAAAMAAoAAAAAAIsEAAAGAAAAqwACBMtgy4DLoBAAAwACAAAAAACVBAAAAwAAAJAAAQIP"
-  "AAAABAADAAAAAACcBAAABAAAAJAAAQKwMA8ABQAEAAAAAACkBAAABQAAAJAAAQKwMLBADwAAAAYA"
-  "BQAAAAAArQQAAAYAAACQAAECsDCwQLBQDwABAAAAAAAAAAEAAAABAAAAAgAAAAEAAQADAAAAAQAB"
-  "AAEAAAAEAAAAAQABAAEAAQAFAAAAAQABAAEAAQABAAAAAQAAAAIAAAACAAAAAgACAAMAAAACAAIA"
-  "AgAAAAQAAAACAAIAAgACAAUAAAACAAIAAgACAAIABjxpbml0PgABQgACQkIAAUQAAkREAANEREQA"
-  "BEREREQABUREREREAAZEREREREQAAUkAAklJAANJSUkABElJSUkABUlJSUlJAAZJSUlJSUkAE0xT"
-  "dGF0aWNMZWFmTWV0aG9kczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAWU3RhdGljTGVhZk1ldGhvZHMu"
-  "amF2YQABVgAIaWRlbnRpdHkAA25vcAADc3VtAAEABw4ABQEABw4AFwEABw4ACAEABw4AAwAHDgAa"
-  "AgAABw4AHQMAAAAHDgAgBAAAAAAHDgAjBQAAAAAABw4ACwIAAAcOAA4DAAAABw4AEQQAAAAABw4A"
-  "FAUAAAAAAAcOAAAADQAAgIAEgAQBCJgEAQisBAEIwAQBCNQEAQjoBAEIgAUBCJgFAQi0BQEI0AUB"
-  "COgFAQiABgEInAYAAAAMAAAAAAAAAAEAAAAAAAAAAQAAABYAAABwAAAAAgAAAAYAAADIAAAAAwAA"
-  "AAwAAADgAAAABQAAAA4AAABwAQAABgAAAAEAAADgAQAAASAAAA0AAAAAAgAAARAAAAsAAAA4AwAA"
-  "AiAAABYAAACuAwAAAyAAAA0AAABXBAAAACAAAAEAAAC3BAAAABAAAAEAAAD0BAAA";
-
-//class Fibonacci {
-//
-//    static int fibonacci(int n) {
-//        if (n == 0) {
-//            return 0;
-//        }
-//        int x = 1;
-//        int y = 1;
-//        for (int i = 3; i <= n; i++) {
-//            int z = x + y;
-//            x = y;
-//            y = z;
-//        }
-//        return y;
-//    }
-//
-//    public static void main(String[] args) {
-//        try {
-//            if (args.length == 1) {
-//                int x = Integer.parseInt(args[0]);
-//                int y = fibonacci(x); /* to warm up cache */
-//                System.out.printf("fibonacci(%d)=%d\n", x, y);
-//                y = fibonacci(x +1);
-//                System.out.printf("fibonacci(%d)=%d\n", x, y);
-//            }
-//        } catch (NumberFormatException ex) {}
-//    }
-//}
-static const char kFibonacciDex[] =
-  "ZGV4CjAzNQBaslnMUQxaXYgC3gD9FGHjVb8cHZ60G8ckBQAAcAAAAHhWNBIAAAAAAAAAAIQEAAAa"
-  "AAAAcAAAAAsAAADYAAAABgAAAAQBAAABAAAATAEAAAcAAABUAQAAAgAAAIwBAABYAwAAzAEAAPoC"
-  "AAACAwAAEgMAABUDAAAZAwAAHQMAACoDAAAuAwAAMwMAAEoDAABfAwAAggMAAJYDAACqAwAAvgMA"
-  "AMsDAADOAwAA0gMAAOcDAAD8AwAABwQAABoEAAAgBAAAJQQAAC8EAAA3BAAAAgAAAAUAAAAIAAAA"
-  "CQAAAAoAAAALAAAADAAAAA0AAAAPAAAAEQAAABIAAAADAAAAAAAAANwCAAAEAAAAAAAAAOQCAAAH"
-  "AAAAAgAAAOwCAAAGAAAAAwAAANwCAAAPAAAACAAAAAAAAAAQAAAACAAAAPQCAAAHAAIAFgAAAAEA"
-  "BAAAAAAAAQAAABMAAAABAAUAFQAAAAIAAgAYAAAAAwABABcAAAADAAMAGQAAAAUABAAAAAAABQAA"
-  "AAEAAAD/////AAAAAA4AAAAAAAAAaAQAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAByBAAA"
-  "AAAAAAEAAQAAAAAAQAQAAAEAAAAOAAAAAQABAAEAAABFBAAABAAAAHAQBgAAAA4ABQABAAAAAABK"
-  "BAAAEwAAABIROQQEABIADwASMAESARMBAQEwNkH6/7AC2AEBAQEjAQIBMCj4AAAIAAEAAwABAFcE"
-  "AABIAAAAEhEhcDMQQwASAEYABwBxEAQAAAAKAHEQAQAAAAoBYgIAABoDFAASJCNECQASBXEQBQAA"
-  "AAwGTQYEBRIVcRAFAAEADAFNAQQFbjADADIE2AEAAXEQAQABAAoBYgIAABoDFAASJCNECQASBXEQ"
-  "BQAAAAwATQAEBRIQcRAFAAEADAFNAQQAbjADADIEDgANACj+AQAAAEQAAQABAQRGAQAAAAAAAAAB"
-  "AAAABgAAAAIAAAAGAAkAAQAAAAoABjxpbml0PgAORmlib25hY2NpLmphdmEAAUkAAklJAAJJTAAL"
-  "TEZpYm9uYWNjaTsAAkxJAANMTEwAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwATTGphdmEvbGFuZy9J"
-  "bnRlZ2VyOwAhTGphdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb247ABJMamF2YS9sYW5nL09i"
-  "amVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AAtPYmplY3QuamF2"
-  "YQABVgACVkwAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsACWZpYm9u"
-  "YWNjaQARZmlib25hY2NpKCVkKT0lZAoABG1haW4AA291dAAIcGFyc2VJbnQABnByaW50ZgAHdmFs"
-  "dWVPZgADAAcOAAEABw4ADwEABx0tJgJ7HXgcAB4BAAcdPHhLARgPaQEYERwAAAABAAaBgATMAwAA"
-  "AwAAgIAE4AMBCPgDAQmwBA0AAAAAAAAAAQAAAAAAAAABAAAAGgAAAHAAAAACAAAACwAAANgAAAAD"
-  "AAAABgAAAAQBAAAEAAAAAQAAAEwBAAAFAAAABwAAAFQBAAAGAAAAAgAAAIwBAAABIAAABAAAAMwB"
-  "AAABEAAABAAAANwCAAACIAAAGgAAAPoCAAADIAAABAAAAEAEAAAAIAAAAgAAAGgEAAAAEAAAAQAA"
-  "AIQEAAA=";
-
-// class Interfaces {
-//   interface I {
-//     public void i();
-//   }
-//   interface J {
-//     public void j1();
-//     public void j2();
-//   }
-//   class A implements I, J {
-//     public void i() {};
-//     public void j1() {};
-//     public void j2() {};
-//   }
-// }
-static const char kInterfacesDex[] =
-  "ZGV4CjAzNQCRmX4RyqEIAGU0Pzgm7w3FvyUvYlel/coUBQAAcAAAAHhWNBIAAAAAAAAAAFAEAAAW"
-  "AAAAcAAAAAkAAADIAAAAAgAAAOwAAAABAAAABAEAAAkAAAAMAQAABAAAAFQBAABAAwAA1AEAAL4C"
-  "AADGAgAAyQIAAMwCAADdAgAA4AIAAPACAAAAAwAAEAMAAB4DAABCAwAAYgMAAIUDAACZAwAAnAMA"
-  "AKADAACtAwAAsAMAALQDAAC4AwAAvgMAAMYDAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAA"
-  "DAAAAA0AAAANAAAACAAAAAAAAAAOAAAACAAAALgCAAAAAAMAFAAAAAAAAQAAAAAAAAAAABAAAAAA"
-  "AAAAEQAAAAAAAAASAAAAAQAAABAAAAACAAAAEQAAAAIAAAASAAAAAwAAAAAAAAAHAAAAAAAAAAEA"
-  "AAAABgAABwAAAAAAAAADAAAAcAIAABcEAAAAAAAAAgAAAAAGAAAHAAAAAAAAAAMAAACAAgAAHwQA"
-  "AAAAAAAAAAAAAAAAAAcAAACwAgAAAwAAAJACAAArBAAAAAAAAAMAAAAAAAAABwAAAAAAAAADAAAA"
-  "oAIAAEQEAAAAAAAAAgAAAOgDAADuAwAAAgAAAOgDAAD4AwAAAgAAAOgDAAACBAAAAQAAAAsEAAAC"
-  "AAIAAQAAAM0DAAAGAAAAWwEAAHAQCAAAAA4AAQABAAAAAADTAwAAAQAAAA4AAAABAAEAAAAAANgD"
-  "AAABAAAADgAAAAEAAQAAAAAA3QMAAAEAAAAOAAAAAQABAAEAAADiAwAABAAAAHAQCAAAAA4A1AEA"
-  "AAAAAAAAAAAAAAAAAOABAAAAAAAAAAAAAAAAAADsAQAAAAAAAAAAAAAAAAAA+AEAAAAAAAAAAAAA"
-  "AAAAAAIAAAABAAIAAQAAAAMABjxpbml0PgABQQABSQAPSW50ZXJmYWNlcy5qYXZhAAFKAA5MSW50"
-  "ZXJmYWNlcyRBOwAOTEludGVyZmFjZXMkSTsADkxJbnRlcmZhY2VzJEo7AAxMSW50ZXJmYWNlczsA"
-  "IkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9J"
-  "bm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNzZXM7ABJMamF2YS9sYW5n"
-  "L09iamVjdDsAAVYAAlZMAAthY2Nlc3NGbGFncwABaQACajEAAmoyAARuYW1lAAZ0aGlzJDAABXZh"
-  "bHVlAAoBAAcOAAsABw4ADAAHDgANAAcOAAIABw5DAAIEARUYAwIFAg8kCAYTFwICBQIPJAgGExcE"
-  "AgUCDwQAExcBAgYBFRwDGAAYAhgBAAAAAQSBCAAAAAACBYEIAAGBCAAAAQEDAJAgAICABIAEAQGc"
-  "BAEBsAQBAcQEAAABAAeAgATYBAAAEAAAAAAAAAABAAAAAAAAAAEAAAAWAAAAcAAAAAIAAAAJAAAA"
-  "yAAAAAMAAAACAAAA7AAAAAQAAAABAAAABAEAAAUAAAAJAAAADAEAAAYAAAAEAAAAVAEAAAMQAAAE"
-  "AAAA1AEAAAEgAAAFAAAAAAIAAAYgAAAEAAAAcAIAAAEQAAACAAAAsAIAAAIgAAAWAAAAvgIAAAMg"
-  "AAAFAAAAzQMAAAQgAAAFAAAA6AMAAAAgAAAEAAAAFwQAAAAQAAABAAAAUAQAAA==";
-
-static inline DexFile* OpenDexFileBase64(const char* base64,
-                                         const std::string& location) {
+static inline const DexFile* OpenDexFileBase64(const char* base64,
+                                               const std::string& location) {
   CHECK(base64 != NULL);
   size_t length;
   byte* dex_bytes = DecodeBase64(base64, &length);
   CHECK(dex_bytes != NULL);
-  DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length, location);
+  const DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length, location);
   CHECK(dex_file != NULL);
   return dex_file;
 }
@@ -537,7 +143,7 @@
     return std::string("/system/framework/core.jar");
   }
 
-  DexFile* GetLibCoreDex() {
+  const DexFile* GetLibCoreDex() {
     std::string libcore_dex_file_name = GetLibCoreDexFileName();
     return DexFile::OpenZip(libcore_dex_file_name);
   }
@@ -550,6 +156,21 @@
     return PathClassLoader::Alloc(dex_files);
   }
 
+  const DexFile* OpenTestDexFile(const char* name) {
+    CHECK(name != NULL);
+    std::string filename;
+    if (is_host_) {
+      // on the host, just read target dex file
+      filename += getenv("ANDROID_PRODUCT_OUT");
+    }
+    filename += "/system/framework/art-test-dex-";
+    filename += name;
+    filename += ".jar";
+    const DexFile* dex_file = DexFile::OpenZip(filename);
+    CHECK(dex_file != NULL) << "Could not open " << filename;
+    return dex_file;
+  }
+
   bool is_host_;
   scoped_ptr_malloc<char> android_data_;
   std::string art_cache_;
diff --git a/src/compiler_test.cc b/src/compiler_test.cc
index ca357f2..124668e 100644
--- a/src/compiler_test.cc
+++ b/src/compiler_test.cc
@@ -3,7 +3,6 @@
 #include "class_linker.h"
 #include "common_test.h"
 #include "compiler.h"
-#include "compiler_test.h"
 #include "dex_cache.h"
 #include "dex_file.h"
 #include "heap.h"
@@ -17,8 +16,8 @@
 
 class CompilerTest : public CommonTest {
  protected:
-  void CompileDex(const char* base64_dex, const char* base64_name) {
-    dex_file_.reset(OpenDexFileBase64(base64_dex, base64_name));
+  void CompileDex(const char* name) {
+    dex_file_.reset(OpenTestDexFile(name));
     class_linker_->RegisterDexFile(*dex_file_.get());
     std::vector<const DexFile*> class_path;
     class_path.push_back(dex_file_.get());
@@ -60,7 +59,7 @@
 #endif // __arm__
   }
  private:
-  scoped_ptr<DexFile> dex_file_;
+  scoped_ptr<const DexFile> dex_file_;
 };
 
 TEST_F(CompilerTest, CompileDexLibCore) {
@@ -109,131 +108,131 @@
 }
 
 TEST_F(CompilerTest, BasicCodegen) {
-  CompileDex(kFibonacciDex, "kFibonacciDex");
+  CompileDex("Fibonacci");
   AssertStaticIntMethod("Fibonacci", "fibonacci", "(I)I", 55,
                         10);
 }
 
 TEST_F(CompilerTest, StaticFieldTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "staticFieldTest", "(I)I", 1404,
                         404);
 }
 
 TEST_F(CompilerTest, UnopTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "unopTest", "(I)I", 37,
                         38);
 }
 
 TEST_F(CompilerTest, ShiftTest1) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "shiftTest1", "()I", 0);
 }
 
 TEST_F(CompilerTest, ShiftTest2) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "shiftTest2", "()I", 0);
 }
 
 TEST_F(CompilerTest, UnsignedShiftTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "unsignedShiftTest", "()I", 0);
 }
 
 TEST_F(CompilerTest, ConvTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "convTest", "()I", 0);
 }
 
 TEST_F(CompilerTest, CharSubTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "charSubTest", "()I", 0);
 }
 
 TEST_F(CompilerTest, IntOperTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "intOperTest", "(II)I", 0,
                         70000, -3);
 }
 
 TEST_F(CompilerTest, Lit16Test) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "lit16Test", "(I)I", 0,
                         77777);
 }
 
 TEST_F(CompilerTest, Lit8Test) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "lit8Test", "(I)I", 0,
                         -55555);
 }
 
 TEST_F(CompilerTest, IntShiftTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "intShiftTest", "(II)I", 0,
                         0xff00aa01, 8);
 }
 
 TEST_F(CompilerTest, LongOperTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "longOperTest", "(JJ)I", 0,
                         70000000000LL, -3LL);
 }
 
 TEST_F(CompilerTest, LongShiftTest) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticLongMethod("IntMath", "longShiftTest", "(JI)J",
                          0x96deff00aa010000LL, 0xd5aa96deff00aa01LL, 16);
 }
 
 TEST_F(CompilerTest, SwitchTest1) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "switchTest", "(I)I", 1234,
                         1);
 }
 
 TEST_F(CompilerTest, IntCompare) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "testIntCompare", "(IIII)I", 1111,
                         -5, 4, 4, 0);
 }
 
 TEST_F(CompilerTest, LongCompare) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "testLongCompare", "(JJJJ)I", 2222,
                         -5LL, -4294967287LL, 4LL, 8LL);
 }
 
 TEST_F(CompilerTest, FloatCompare) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "testFloatCompare", "(FFFF)I", 3333,
                         -5.0f, 4.0f, 4.0f,
                         (1.0f/0.0f) / (1.0f/0.0f));
 }
 
 TEST_F(CompilerTest, DoubleCompare) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "testDoubleCompare", "(DDDD)I", 4444,
                                     -5.0, 4.0, 4.0,
                                     (1.0/0.0) / (1.0/0.0));
 }
 
 TEST_F(CompilerTest, RecursiveFibonacci) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "fibonacci", "(I)I", 55,
                         10);
 }
 
 #if 0 // Need to complete try/catch block handling
 TEST_F(CompilerTest, ThrowAndCatch) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "throwAndCatch", "()I", 4);
 }
 #endif
 
 TEST_F(CompilerTest, ManyArgs) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "manyArgs",
                         "(IJIJIJIIDFDSICIIBZIIJJIIIII)I", -1,
                         0, 1LL, 2, 3LL, 4, 5LL, 6, 7, 8.0, 9.0f, 10.0,
@@ -242,13 +241,13 @@
 }
 
 TEST_F(CompilerTest, VirtualCall) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "staticCall", "(I)I", 6,
                         3);
 }
 
 TEST_F(CompilerTest, TestIGetPut) {
-  CompileDex(kIntMathDex, "kIntMathDex");
+  CompileDex("IntMath");
   AssertStaticIntMethod("IntMath", "testIGetPut", "(I)I", 333,
                         111);
 }
diff --git a/src/compiler_test.h b/src/compiler_test.h
deleted file mode 100644
index 9df88a0..0000000
--- a/src/compiler_test.h
+++ /dev/null
@@ -1,1041 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-#include <dirent.h>
-#include <dlfcn.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include "base64.h"
-#include "heap.h"
-#include "thread.h"
-#include "stringprintf.h"
-#include "class_linker.h"
-#include "dex_file.h"
-
-#include "unicode/uclean.h"
-#include "unicode/uvernum.h"
-
-#include "gtest/gtest.h"
-
-namespace art {
-
-//class IntMath {
-//
-//    public static boolean mBoolean1, mBoolean2;
-//    public static byte mByte1, mByte2;
-//    public static char mChar1, mChar2;
-//    public static short mShort1, mShort2;
-//    public static int mInt1, mInt2;
-//    public static float mFloat1, mFloat2;
-//    public static long mLong1, mLong2;
-//    public static double mDouble1, mDouble2;
-//    public static volatile long mVolatileLong1, mVolatileLong2;
-//
-//
-//    private int foo_;
-//
-//    public IntMath(int stuff) {
-//        foo_ = stuff;
-//    }
-//
-//    public IntMath() {
-//        foo_ = 123;
-//    }
-//
-//    static int staticFieldTest(int x) {
-//        mBoolean1 = true;
-//        mBoolean2 = false;
-//        mByte1 = 127;
-//        mByte2 = -128;
-//        mChar1 = 32767;
-//        mChar2 = 65535;
-//        mShort1 = 32767;
-//        mShort2 = -32768;
-//        mInt1 = 65537;
-//        mInt2 = -65537;
-//        mFloat1 = 3.1415f;
-//        mFloat2 = -1.0f / 0.0f;                // -inf
-//        mLong1 = 1234605616436508552L;     // 0x1122334455667788
-//        mLong2 = -1234605616436508552L;
-//        mDouble1 = 3.1415926535;
-//        mDouble2 = 1.0 / 0.0;               // +inf
-//        mVolatileLong1 = mLong1 - 1;
-//        mVolatileLong2 = mLong2 + 1;
-//
-//        if (!mBoolean1) { return 10; }
-//        if (mBoolean2) { return 11; }
-//        if (mByte1 != 127) { return 12; }
-//        if (mByte2 != -128) { return 13; }
-//        if (mChar1 != 32767) { return 14; }
-//        if (mChar2 != 65535) { return 15; }
-//        if (mShort1 != 32767) { return 16; }
-//        if (mShort2 != -32768) { return 17; }
-//        if (mInt1 != 65537) { return 18; }
-//        if (mInt2 != -65537) { return 19; }
-//        if (!(mFloat1 > 3.141f && mFloat1 < 3.142f)) { return 20; }
-//        if (mFloat2 >= mFloat1) { return 21; }
-//        if (mLong1 != 1234605616436508552L) { return 22; }
-//        if (mLong2 != -1234605616436508552L) { return 23; }
-//        if (!(mDouble1 > 3.141592653 && mDouble1 < 3.141592654)) { return 24; }
-//        if (mDouble2 <= mDouble1) { return 25; }
-//        if (mVolatileLong1 != 1234605616436508551L) { return 26; }
-//        if (mVolatileLong2 != -1234605616436508551L) { return 27; }
-//
-//        return 1000 + x;
-//    }
-//
-//    /*
-//     * Try to cause some unary operations.
-//     */
-//    static int unopTest(int x) {
-//        x = -x;
-//        x ^= 0xffffffff;
-//        return x;
-//    }
-//
-//    static int shiftTest1() {
-//        final int[] mBytes = {
-//            0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
-//        };
-//        long l;
-//        int i1, i2;
-//
-//        if (mBytes[0] != 0x11) return 20;
-//        if (mBytes[1] != 0x22) return 21;
-//        if (mBytes[2] != 0x33) return 22;
-//        if (mBytes[3] != 0x44) return 23;
-//        if (mBytes[4] != 0x88) return 24;
-//        if (mBytes[5] != 0x99) return 25;
-//        if (mBytes[6] != 0xaa) return 26;
-//        if (mBytes[7] != 0xbb) return 27;
-//
-//        i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
-//        i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
-//        l = i1 | ((long)i2 << 32);
-//
-//        if (i1 != 0x44332211) { return 0x80000000 | i1; }
-//        if (i2 != 0xbbaa9988) { return 2; }
-//        if (l != 0xbbaa998844332211L) { return 3; }
-//
-//        l = (long)mBytes[0]
-//            | (long)mBytes[1] << 8
-//            | (long)mBytes[2] << 16
-//            | (long)mBytes[3] << 24
-//            | (long)mBytes[4] << 32
-//            | (long)mBytes[5] << 40
-//            | (long)mBytes[6] << 48
-//            | (long)mBytes[7] << 56;
-//
-//        if (l != 0xbbaa998844332211L) { return 4; }
-//        return 0;
-//    }
-//
-//    static int shiftTest2() {
-//
-//        long    a = 0x11;
-//        long    b = 0x22;
-//        long    c = 0x33;
-//        long    d = 0x44;
-//        long    e = 0x55;
-//        long    f = 0x66;
-//        long    g = 0x77;
-//        long    h = 0x88;
-//
-//        long    result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
-//                         (e << 24) | (f << 16) | (g <<  8) | h);
-//
-//        if (result != 0x1122334455667788L) { return 1; }
-//        return 0;
-//    }
-//
-//    static int unsignedShiftTest() {
-//        byte b = -4;
-//        short s = -4;
-//        char c = 0xfffc;
-//        int i = -4;
-//
-//        b >>>= 4;
-//        s >>>= 4;
-//        c >>>= 4;
-//        i >>>= 4;
-//
-//        if ((int) b != -1) { return 1; }
-//        if ((int) s != -1) { return 2; }
-//        if ((int) c != 0x0fff) { return 3; }
-//        if (i != 268435455) { return 4; }
-//        return 0;
-//    }
-//
-//    static int convTest() {
-//
-//        float f;
-//        double d;
-//        int i;
-//        long l;
-//
-//        /* int --> long */
-//        i = 7654;
-//        l = (long) i;
-//        if (l != 7654L) { return 1; }
-//
-//        i = -7654;
-//        l = (long) i;
-//        if (l != -7654L) { return 2; }
-//
-//        /* long --> int (with truncation) */
-//        l = 5678956789L;
-//        i = (int) l;
-//        if (i != 1383989493) { return 3; }
-//
-//        l = -5678956789L;
-//        i = (int) l;
-//        if (i != -1383989493) { return 4; }
-//        return 0;
-//    }
-//
-//    static int charSubTest() {
-//
-//        char char1 = 0x00e9;
-//        char char2 = 0xffff;
-//        int i;
-//
-//        /* chars are unsigned-expanded to ints before subtraction */
-//        i = char1 - char2;
-//        if (i != 0xffff00ea) { return 1; }
-//        return 0;
-//    }
-//
-//    /*
-//     * We pass in the arguments and return the results so the compiler
-//     * doesn't do the math for us.  (x=70000, y=-3)
-//     */
-//    static int intOperTest(int x, int y) {
-//        int[] results = new int[10];
-//
-//        /* this seems to generate "op-int" instructions */
-//        results[0] = x + y;
-//        results[1] = x - y;
-//        results[2] = x * y;
-//        results[3] = x * x;
-//        results[4] = x / y;
-//        results[5] = x % -y;
-//        results[6] = x & y;
-//        results[7] = x | y;
-//        results[8] = x ^ y;
-//
-//        /* this seems to generate "op-int/2addr" instructions */
-//        results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
-//
-//        /* check this edge case while we're here (div-int/2addr) */
-//        int minInt = -2147483648;
-//        int negOne = -results[5];
-//        int plusOne = 1;
-//        int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
-//
-//        if (result != minInt) { return 1;};
-//        if (results[0] != 69997) { return 2;};
-//        if (results[1] != 70003) { return 3;};
-//        if (results[2] != -210000) { return 4;};
-//        if (results[3] != 605032704) { return 5;};
-//        if (results[4] != -23333) { return 6;};
-//        if (results[5] != 1) { return 7;};
-//        if (results[6] != 70000) { return 8;};
-//        if (results[7] != -3) { return 9;};
-//        if (results[8] != -70003) { return 10;};
-//        if (results[9] != 70000) { return 11;};
-//
-//        return 0;
-//    }
-//
-//    /*
-//     * More operations, this time with 16-bit constants.  (x=77777)
-//     */
-//    static int lit16Test(int x) {
-//
-//        int[] results = new int[8];
-//
-//        /* try to generate op-int/lit16" instructions */
-//        results[0] = x + 1000;
-//        results[1] = 1000 - x;
-//        results[2] = x * 1000;
-//        results[3] = x / 1000;
-//        results[4] = x % 1000;
-//        results[5] = x & 1000;
-//        results[6] = x | -1000;
-//        results[7] = x ^ -1000;
-//
-//        if (results[0] != 78777) { return 1; }
-//        if (results[1] != -76777) { return 2; }
-//        if (results[2] != 77777000) { return 3; }
-//        if (results[3] != 77) { return 4; }
-//        if (results[4] != 777) { return 5; }
-//        if (results[5] != 960) { return 6; }
-//        if (results[6] != -39) { return 7; }
-//        if (results[7] != -76855) { return 8; }
-//        return 0;
-//    }
-//
-//    /*
-//     * More operations, this time with 8-bit constants.  (x=-55555)
-//     */
-//    static int lit8Test(int x) {
-//
-//        int[] results = new int[8];
-//
-//        /* try to generate op-int/lit8" instructions */
-//        results[0] = x + 10;
-//        results[1] = 10 - x;
-//        results[2] = x * 10;
-//        results[3] = x / 10;
-//        results[4] = x % 10;
-//        results[5] = x & 10;
-//        results[6] = x | -10;
-//        results[7] = x ^ -10;
-//        int minInt = -2147483648;
-//        int result = minInt / -1;
-//        if (result != minInt) {return 1; }
-//        if (results[0] != -55545) {return 2; }
-//        if (results[1] != 55565) {return 3; }
-//        if (results[2] != -555550) {return 4; }
-//        if (results[3] != -5555) {return 5; }
-//        if (results[4] != -5) {return 6; }
-//        if (results[5] != 8) {return 7; }
-//        if (results[6] != -1) {return 8; }
-//        if (results[7] != 55563) {return 9; }
-//        return 0;
-//    }
-//
-//
-//    /*
-//     * Shift some data.  (value=0xff00aa01, dist=8)
-//     */
-//    static int intShiftTest(int value, int dist) {
-//        int results[] = new int[4];
-//        results[0] = value << dist;
-//        results[1] = value >> dist;
-//        results[2] = value >>> dist;
-//        results[3] = (((value << dist) >> dist) >>> dist) << dist;
-//        if (results[0] != 0x00aa0100) {return 1; }
-//        if (results[1] != 0xffff00aa) {return 2; }
-//        if (results[2] != 0x00ff00aa) {return 3; }
-//        if (results[3] != 0xaa00) {return 4; }
-//        return 0;
-//    }
-//
-//    /*
-//     * We pass in the arguments and return the results so the compiler
-//     * doesn't do the math for us.  (x=70000000000, y=-3)
-//     */
-//    static int longOperTest(long x, long y) {
-//        long[] results = new long[10];
-//
-//        /* this seems to generate "op-long" instructions */
-//        results[0] = x + y;
-//        results[1] = x - y;
-//        results[2] = x * y;
-//        results[3] = x * x;
-//        results[4] = x / y;
-//        results[5] = x % -y;
-//        results[6] = x & y;
-//        results[7] = x | y;
-//        results[8] = x ^ y;
-//        /* this seems to generate "op-long/2addr" instructions */
-//        results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
-//        /* check this edge case while we're here (div-long/2addr) */
-//        long minLong = -9223372036854775808L;
-//        long negOne = -results[5];
-//        long plusOne = 1;
-//        long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
-//        if (result != minLong) { return 1; }
-//        if (results[0] != 69999999997L) { return 2; }
-//        if (results[1] != 70000000003L) { return 3; }
-//        if (results[2] != -210000000000L) { return 4; }
-//        if (results[3] != -6833923606740729856L) { return 5; }    // overflow
-//        if (results[4] != -23333333333L) { return 6; }
-//        if (results[5] != 1) { return 7; }
-//        if (results[6] != 70000000000L) { return 8; }
-//        if (results[7] != -3) { return 9; }
-//        if (results[8] != -70000000003L) { return 10; }
-//        if (results[9] != 70000000000L) { return 11; }
-//        if (results.length != 10) { return 12; }
-//        return 0;
-//    }
-//
-//    /*
-//     * Shift some data.  (value=0xd5aa96deff00aa01, dist=16)
-//     */
-//    static long longShiftTest(long value, int dist) {
-//        long results[] = new long[4];
-//        results[0] = value << dist;
-//        results[1] = value >> dist;
-//        results[2] = value >>> dist;
-//        results[3] = (((value << dist) >> dist) >>> dist) << dist;
-//        if (results[0] != 0x96deff00aa010000L) { return results[0]; }
-//        if (results[1] != 0xffffd5aa96deff00L) { return results[1]; }
-//        if (results[2] != 0x0000d5aa96deff00L) { return results[2]; }
-//        if (results[3] != 0xffff96deff000000L) { return results[3]; }
-//        if (results.length != 4) { return 5; }
-//
-//        return results[0];      // test return-long
-//    }
-//
-//    static int switchTest(int a) {
-//        int res = 1234;
-//
-//        switch (a) {
-//            case -1: res = 1; return res;
-//            case 0: res = 2; return res;
-//            case 1: /*correct*/ break;
-//            case 2: res = 3; return res;
-//            case 3: res = 4; return res;
-//            case 4: res = 5; return res;
-//            default: res = 6; return res;
-//        }
-//        switch (a) {
-//            case 3: res = 7; return res;
-//            case 4: res = 8; return res;
-//            default: /*correct*/ break;
-//        }
-//
-//        a = 0x12345678;
-//
-//        switch (a) {
-//            case 0x12345678: /*correct*/ break;
-//            case 0x12345679: res = 9; return res;
-//            default: res = 1; return res;
-//        }
-//        switch (a) {
-//            case 57: res = 10; return res;
-//            case -6: res = 11; return res;
-//            case 0x12345678: /*correct*/ break;
-//            case 22: res = 12; return res;
-//            case 3: res = 13; return res;
-//            default: res = 14; return res;
-//        }
-//        switch (a) {
-//            case -6: res = 15; return res;
-//            case 3: res = 16; return res;
-//            default: /*correct*/ break;
-//        }
-//
-//        a = -5;
-//        switch (a) {
-//            case 12: res = 17; return res;
-//            case -5: /*correct*/ break;
-//            case 0: res = 18; return res;
-//            default: res = 19; return res;
-//        }
-//
-//        switch (a) {
-//            default: /*correct*/ break;
-//        }
-//        return res;
-//    }
-//    /*
-//     * Test the integer comparisons in various ways.
-//     */
-//    static int testIntCompare(int minus, int plus, int plus2, int zero) {
-//        int res = 1111;
-//
-//        if (minus > plus)
-//            return 1;
-//        if (minus >= plus)
-//            return 2;
-//        if (plus < minus)
-//            return 3;
-//        if (plus <= minus)
-//            return 4;
-//        if (plus == minus)
-//            return 5;
-//        if (plus != plus2)
-//            return 6;
-//
-//        /* try a branch-taken */
-//        if (plus != minus) {
-//            res = res;
-//        } else {
-//            return 7;
-//        }
-//
-//        if (minus > 0)
-//            return 8;
-//        if (minus >= 0)
-//            return 9;
-//        if (plus < 0)
-//            return 10;
-//        if (plus <= 0)
-//            return 11;
-//        if (plus == 0)
-//            return 12;
-//        if (zero != 0)
-//            return 13;
-//
-//        if (zero == 0) {
-//            res = res;
-//        } else {
-//            return 14;
-//        }
-//        return res;
-//    }
-//
-//    /*
-//     * Test cmp-long.
-//     *
-//     * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
-//     */
-//    static int testLongCompare(long minus, long alsoMinus, long plus,
-//        long alsoPlus) {
-//        int res = 2222;
-//
-//        if (minus > plus)
-//            return 2;
-//        if (plus < minus)
-//            return 3;
-//        if (plus == minus)
-//            return 4;
-//
-//        if (plus >= plus+1)
-//            return 5;
-//        if (minus >= minus+1)
-//            return 6;
-//
-//        /* try a branch-taken */
-//        if (plus != minus) {
-//            res = res;
-//        } else {
-//            return 7;
-//        }
-//
-//        /* compare when high words are equal but low words differ */
-//        if (plus > alsoPlus)
-//            return 8;
-//        if (alsoPlus < plus)
-//            return 9;
-//        if (alsoPlus == plus)
-//            return 10;
-//
-//        /* high words are equal, low words have apparently different signs */
-//        if (minus < alsoMinus)      // bug!
-//            return 11;
-//        if (alsoMinus > minus)
-//            return 12;
-//        if (alsoMinus == minus)
-//            return 13;
-//
-//        return res;
-//    }
-//
-//    /*
-//     * Test cmpl-float and cmpg-float.
-//     */
-//    static int testFloatCompare(float minus, float plus, float plus2,
-//        float nan) {
-//
-//        int res = 3333;
-//        if (minus > plus)
-//            res = 1;
-//        if (plus < minus)
-//            res = 2;
-//        if (plus == minus)
-//            res = 3;
-//        if (plus != plus2)
-//            res = 4;
-//
-//        if (plus <= nan)
-//            res = 5;
-//        if (plus >= nan)
-//            res = 6;
-//        if (minus <= nan)
-//            res = 7;
-//        if (minus >= nan)
-//            res = 8;
-//        if (nan >= plus)
-//            res = 9;
-//        if (nan <= plus)
-//            res = 10;
-//
-//        if (nan == nan)
-//            res = 1212;
-//
-//        return res;
-//    }
-//
-//    static int testDoubleCompare(double minus, double plus, double plus2,
-//        double nan) {
-//
-//        int res = 4444;
-//
-//        if (minus > plus)
-//            return 1;
-//        if (plus < minus)
-//            return 2;
-//        if (plus == minus)
-//            return 3;
-//        if (plus != plus2)
-//            return 4;
-//
-//        if (plus <= nan)
-//            return 5;
-//        if (plus >= nan)
-//            return 6;
-//        if (minus <= nan)
-//            return 7;
-//        if (minus >= nan)
-//            return 8;
-//        if (nan >= plus)
-//            return 9;
-//        if (nan <= plus)
-//            return 10;
-//
-//        if (nan == nan)
-//            return 11;
-//        return res;
-//    }
-//
-//    static int fibonacci(int n) {
-//        if (n == 0) {
-//            return 0;
-//        } else if (n == 1) {
-//            return 1;
-//        } else {
-//            return fibonacci(n - 1) + fibonacci(n - 2);
-//        }
-//    }
-//
-///*
-//    static void throwNullPointerException() {
-//        throw new NullPointerException("first throw");
-//    }
-//
-//    static int throwAndCatch() {
-//        try {
-//            throwNullPointerException();
-//            return 1;
-//        } catch (NullPointerException npe) {
-//            return 0;
-//        }
-//    }
-//*/
-//
-//    static int manyArgs(int a0, long a1, int a2, long a3, int a4, long a5,
-//        int a6, int a7, double a8, float a9, double a10, short a11, int a12,
-//        char a13, int a14, int a15, byte a16, boolean a17, int a18, int a19,
-//        long a20, long a21, int a22, int a23, int a24, int a25, int a26)
-//    {
-//        if (a0 != 0) return 0;
-//        if (a1 !=  1L) return 1;
-//        if (a2 != 2) return 2;
-//        if (a3 != 3L) return 3;
-//        if (a4 != 4) return 4;
-//        if (a5 != 5L) return 5;
-//        if (a6 != 6) return 6;
-//        if (a7 != 7) return 7;
-//        if (a8 != 8.0) return 8;
-//        if (a9 !=  9.0f) return 9;
-//        if (a10 != 10.0) return 10;
-//        if (a11 != (short)11) return 11;
-//        if (a12 != 12) return 12;
-//        if (a13 != (char)13) return 13;
-//        if (a14 != 14) return 14;
-//        if (a15 != 15) return 15;
-//        if (a16 != (byte)-16) return 16;
-//        if (a17 !=  true) return 17;
-//        if (a18 != 18) return 18;
-//        if (a19 != 19) return 19;
-//        if (a20 !=  20L) return 20;
-//        if (a21 != 21L) return 21;
-//        if (a22 != 22) return 22;
-//        if (a23 != 23) return 23;
-//        if (a24 != 24) return 24;
-//        if (a25 != 25) return 25;
-//        if (a26 != 26) return 26;
-//        return -1;
-//    }
-//
-//    int virtualCall(int a)
-//    {
-//        return a * 2;
-//    }
-//
-//    void setFoo(int a)
-//    {
-//        foo_ = a;
-//    }
-//
-//    int getFoo()
-//    {
-//        return foo_;
-//    }
-//
-//    static int staticCall(int a)
-//    {
-//        IntMath foo = new IntMath();
-//        return foo.virtualCall(a);
-//    }
-//
-//   static int testIGetPut(int a)
-//    {
-//        IntMath foo = new IntMath(99);
-//        IntMath foo123 = new IntMath();
-//        int z  = foo.getFoo();
-//        z += a;
-//        z += foo123.getFoo();
-//        foo.setFoo(z);
-//        return foo.getFoo();
-//    }
-//
-//    public static void main(String[] args) {
-//        int res = unopTest(38);
-//        if (res == 37) {
-//            System.out.printf("unopTest PASSED\n");
-//        } else {
-//            System.out.printf("unopTest FAILED: %d\n", res);
-//        }
-//        res = shiftTest1();
-//        if (res == 0) {
-//            System.out.printf("shiftTest1 PASSED\n");
-//        } else {
-//            System.out.printf("shiftTest1 FAILED: %d\n", res);
-//        }
-//        res = shiftTest2();
-//        if (res == 0) {
-//            System.out.printf("shiftTest2 PASSED\n");
-//        } else {
-//            System.out.printf("shiftTest2 FAILED: %d\n", res);
-//        }
-//        res = unsignedShiftTest();
-//        if (res == 0) {
-//            System.out.printf("unsignedShiftTest PASSED\n");
-//        } else {
-//            System.out.printf("unsignedShiftTest FAILED: %d\n", res);
-//        }
-//        res = convTest();
-//        if (res == 0) {
-//            System.out.printf("convTest PASSED\n");
-//        } else {
-//            System.out.printf("convTest FAILED: %d\n", res);
-//        }
-//        res = charSubTest();
-//        if (res == 0) {
-//            System.out.printf("charSubTest PASSED\n");
-//        } else {
-//            System.out.printf("charSubTest FAILED: %d\n", res);
-//        }
-//        res = intOperTest(70000, -3);
-//        if (res == 0) {
-//            System.out.printf("intOperTest PASSED\n");
-//        } else {
-//            System.out.printf("intOperTest FAILED: %d\n", res);
-//        }
-//        res = longOperTest(70000000000L, -3L);
-//        if (res == 0) {
-//            System.out.printf("longOperTest PASSED\n");
-//        } else {
-//            System.out.printf("longOperTest FAILED: %d\n", res);
-//        }
-//        long lres = longShiftTest(0xd5aa96deff00aa01L, 16);
-//        if (lres == 0x96deff00aa010000L) {
-//            System.out.printf("longShiftTest PASSED\n");
-//        } else {
-//            System.out.printf("longShiftTest FAILED: %d\n", res);
-//        }
-//
-//        res = switchTest(1);
-//        if (res == 1234) {
-//            System.out.printf("switchTest PASSED\n");
-//        } else {
-//            System.out.printf("switchTest FAILED: %d\n", res);
-//        }
-//
-//        res = testIntCompare(-5, 4, 4, 0);
-//        if (res == 1111) {
-//            System.out.printf("testIntCompare PASSED\n");
-//        } else {
-//            System.out.printf("testIntCompare FAILED: %d\n", res);
-//        }
-//
-//        res = testLongCompare(-5L, -4294967287L, 4L, 8L);
-//        if (res == 2222) {
-//            System.out.printf("testLongCompare PASSED\n");
-//        } else {
-//            System.out.printf("testLongCompare FAILED: %d\n", res);
-//        }
-//
-//        res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
-//        if (res == 3333) {
-//            System.out.printf("testFloatCompare PASSED\n");
-//        } else {
-//            System.out.printf("testFloatCompare FAILED: %d\n", res);
-//        }
-//
-//        res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
-//        if (res == 4444) {
-//            System.out.printf("testDoubleCompare PASSED\n");
-//        } else {
-//            System.out.printf("testDoubleCompare FAILED: %d\n", res);
-//        }
-//
-//        res = fibonacci(10);
-//        if (res == 55) {
-//            System.out.printf("fibonacci PASSED\n");
-//        } else {
-//            System.out.printf("fibonacci FAILED: %d\n", res);
-//        }
-//
-///*
-//        res = throwAndCatch();
-//        if (res == 0) {
-//            System.out.printf("throwAndCatch PASSED\n");
-//        } else {
-//            System.out.printf("throwAndCatch FAILED: %d\n", res);
-//        }
-//*/
-//
-//        res = manyArgs(0, 1L, 2, 3L, 4, 5L, 6, 7, 8.0, 9.0f, 10.0,
-//                      (short)11, 12, (char)13, 14, 15, (byte)-16, true, 18,
-//                      19, 20L, 21L, 22, 23, 24, 25, 26);
-//        if (res == -1) {
-//            System.out.printf("manyArgs PASSED\n");
-//        } else {
-//            System.out.printf("manyArgs FAILED: %d\n", res);
-//        }
-//
-//        res = staticCall(3);
-//        if (res == 6) {
-//            System.out.printf("virtualCall PASSED\n");
-//        } else {
-//            System.out.printf("virtualCall FAILED: %d\n", res);
-//        }
-//
-//        res = testIGetPut(111);
-//        if (res == 333) {
-//            System.out.printf("testGetPut PASSED\n");
-//        } else {
-//            System.out.printf("testGetPut FAILED: %d\n", res);
-//        }
-//
-//        res = staticFieldTest(404);
-//        if (res == 1404) {
-//            System.out.printf("staticFieldTest PASSED\n");
-//        } else {
-//            System.out.printf("staticFieldTest FAILED: %d\n", res);
-//        }
-//    }
-//}
-static const char kIntMathDex[] =
-"ZGV4CjAzNQDNfScpnt+aCE7GCvHI7Jifma1Cw1Zt40LcLwAAcAAAAHhWNBIAAAAAAAAAADwvAAC+"
-"AAAAcAAAABMAAABoAwAADwAAALQDAAAUAAAAaAQAAB8AAAAIBQAAAgAAAAAGAACcKQAAQAYAAEYh"
-"AABOIQAAUSEAAFQhAABXIQAAWiEAAF0hAABkIQAAayEAAG8hAAB0IQAAeyEAAJkhAACeIQAApSEA"
-"ALMhAAC2IQAAuyEAAL8hAADKIQAAzyEAAOYhAAD7IQAADyIAACMiAAA3IgAARCIAAEciAABKIgAA"
-"TiIAAFIiAABVIgAAWSIAAF0iAAByIgAAhyIAAIoiAACOIgAAkiIAAJciAACcIgAAoSIAAKYiAACr"
-"IgAAsCIAALUiAAC6IgAAvyIAAMQiAADIIgAAzSIAANIiAADXIgAA3CIAAOEiAADmIgAA6yIAAO8i"
-"AADzIgAA9yIAAPsiAAD/IgAAAyMAAAcjAAASIwAAHCMAACIjAAAlIwAAKCMAAC8jAAA2IwAAQyMA"
-"AFwjAABxIwAAeyMAAJEjAACjIwAApiMAAKwjAACvIwAAsiMAAL0jAADUIwAA5yMAAOwjAAD0IwAA"
-"+iMAAP0jAAAFJAAACCQAAAskAAAPJAAAEyQAACAkAAA5JAAATiQAAFwkAABfJAAAaiQAAHQkAACC"
-"JAAAnCQAALIkAADBJAAA3CQAAPMkAAD5JAAABCUAAA8lAAAXJQAAHyUAACclAAAvJQAANyUAAEEl"
-"AABLJQAAVCUAAF0lAABkJQAAayUAAHMlAAB7JQAAhCUAAI0lAACdJQAArSUAALMlAAC9JQAA0yUA"
-"AOUlAADtJQAA9iUAAP0lAAAAJgAABSYAAA0mAAASJgAAGCYAAB8mAAAoJgAAMCYAADUmAAA9JgAA"
-"RiYAAEkmAABRJgAAXSYAAHUmAACJJgAAlSYAAK0mAADBJgAAzSYAAN4mAAD7JgAAFCcAABsnAAAn"
-"JwAAPycAAFMnAABmJwAAhScAAKAnAACyJwAA0CcAAOonAAACKAAAFigAACMoAAAzKAAATygAAGco"
-"AAB4KAAAlSgAAK4oAAC0KAAAvigAANQoAADmKAAA+SgAABgpAAAzKQAAOikAAEMpAABQKQAAaSkA"
-"AH4pAACBKQAAhCkAAIcpAAABAAAAAgAAAAMAAAAEAAAABQAAAA8AAAASAAAAFAAAABUAAAAWAAAA"
-"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"
-"AQAKJRMBJQACACUAMxDEAWIBEwAaArEAEgMjMxEAbjAcACEDcQAPAAAACiU5JccBYgETABoCkwAS"
-"AyMzEQBuMBwAIQNxABAAAAAKJTklygFiARMAGgKWABIDIzMRAG4wHAAhA3EAGgAAAAolOSXNAWIB"
-"EwAaArQAEgMjMxEAbjAcACEDcQADAAAACiU5JdABYgETABoCSwASAyMzEQBuMBwAIQNxAAIAAAAK"
-"JTkl0wFiARMAGgJIABIDIzMRAG4wHAAhAxQBcBEBABLScSAGACEACiU5JdIBYgETABoCXgASAyMz"
-"EQBuMBwAIQMYAQA8U0wQAAAAFgP9/3FACgAhQwolOSXOAWIBEwAaAmUAEgMjMxEAbjAcACEDGAEB"
-"qgD/3paq1RMDEABxMAsAIQMLIxgBAAABqgD/3pYxASMBOQHDAWIBEwAaAmgAEgMjMxEAbjAcACED"
-"EhFxEBMAAQAKJRMB0gQCACUAMxDBAWIBEwAaAp4AEgMjMxEAbjAcACEDErESQhJDEgRxQBcAIUMK"
-"JRMBVwQCACUAMxC8AWIBEwAaAqoAEgMjMxEAbjAcACEDFgH7/xgDCQAAAP////8WBQQAFgcIAHcI"
-"GAABAAolEwGuCAIAJQAzELABYgETABoCrQASAyMzEQBuMBwAIQMVAaDAFQKAQBUDgEAVBMB/cUAV"
-"ACFDCiUTAQUNAgAlADMQpwFiARMAGgKkABIDIzMRAG4wHAAhAxkBFMAZAxBAGQUQQBkH+H93CBQA"
-"AQAKJRMBXBECACUAMxCeAWIBEwAaAqEAEgMjMxEAbjAcACEDEwEKAHEQBAABAAolEwE3AAIAJQAz"
-"EJsBYgETABoCUgASAyMzEQBuMBwAIQMSARYCAQASJBYFAwASRxYIBQASahJ7GQwgQBUOEEEZDyRA"
-"ExELABMSDAATEw0AExQOABMVDwATFvD/ExcBABMYEgATGRMAFhoUABYcFQATHhYAEx8XABMgGAAT"
-"IRkAEyIaAHciDQABAAolEvECACUAMxBqAWIBEwAaAoAAEgMjMxEAbjAcACEDEjFxEBEAAQAKJRJh"
-"AgAlADMQaQFiARMAGgK5ABIDIzMRAG4wHAAhAxMBbwBxEBYAAQAKJRMBTQECACUAMxBmAWIBEwAa"
-"AqYAEgMjMxEAbjAcACEDEwGUAXEQEgABAAolEwF8BQIAJQAzEGMBYgETABoCmgASAyMzEQBuMBwA"
-"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"
-"oRISFBMUEACjFAoUoRISFBMUCACjFAwUoRISFKEQEg4YEoh3ZlVEMyIRMRIQEjgSBQATEgEADxIT"
-"EgAAKP0AAAMAAQACAAAAJCwAAAoAAAAiAAYAcBAAAAAAbiAbACAACgEPAQoAAQAAAAAAMCwAACgB"
-"AAATCH8AEweA/xMGAIAUBf///v8TBP9/EhBqAAEAEgBqAAIAawgDAGsHBABsBAUAFAD//wAAbAAG"
-"AG0EDwBtBhAAFAABAAEAZwALAGcFDAAUAFYOSUBnAAkAFQCA/2cACgAYAIh3ZlVEMyIRaAANABgA"
-"eIiZqrvM3e5oAA4AGABEF0FU+yEJQGgABwAZAPB/aAAIAGEADQAWAgEAvCBoABEAYQAOABYCAQC7"
-"IGgAEgBjAAEAOQAFABMACgAPAGMAAgA4AAUAEwALACj5ZAADADKABQATAAwAKPJkAAQAMnAFABMA"
-"DQAo62UABQAyQAUAEwAOACjkZQAGABQB//8AADIQBQATAA8AKNpmAA8AMkAFABMAEAAo02YAEAAy"
-"YAUAEwARACjMYAALABQBAQABADIQBQATABIAKMJgAAwAMlAFABMAEwAou2AACQAUASUGSUAtAAAB"
-"PQALAGAACQAUAYcWSUAuAAABOgAFABMAFAAopmAACgBgAQkALQAAAToABQATABUAKJthAA0AGAKI"
-"d2ZVRDMiETEAAAI4AAUAEwAWACiNYQAOABgCeIiZqrvM3e4xAAACOAAGABMAFwApAH//YQAHABgC"
-"OOkvVPshCUAvAAACPQANAGEABwAYAlBFUlT7IQlAMAAAAjoABgATABgAKQBl/2EACABhAgcAMAAA"
-"AjwABgATABkAKQBZ/2EAEQAYAod3ZlVEMyIRMQAAAjgABgATABoAKQBK/2EAEgAYAnmImaq7zN3u"
-"MQAAAjgABgATABsAKQA7/9CQ6AMpADf/AwABAAAAAABkLAAAsAAAABMA0gQrAmAAAAASYAEBDwES"
-"EAEBKP0SIAEBKPoSMAEBKPcSQAEBKPQSUAEBKPErAlsAAAAUAnhWNBIrAl0AAAASEAEBKOUScAEB"
-"KOITAAgAAQEo3hMACQABASjaLAJUAAAAEwAOAAEBKNMTAAoAAQEozxMACwABASjLEwAMAAEBKMcT"
-"AA0AAQEowywCUwAAABKyLAJZAAAAEwATAAEBKLgTAA8AAQEotBMAEAABASiwEwARAAEBKKwTABIA"
-"AQEoqAEBKKYAAQYA/////wYAAAAJAAAAFQAAAAwAAAAPAAAAEgAAAAABAgADAAAADAAAAA8AAAAA"
-"AQIAeFY0EhEAAAANAAAAAAIFAPr///8DAAAAFgAAADkAAAB4VjQSCwAAABMAAAAPAAAABwAAABcA"
-"AAAAAgIA+v///wMAAAALAAAADwAAAAACAwD7////AAAAAAwAAAAXAAAAEwAAAA8AAAAKAAgAAAAA"
-"AHMtAABIAAAAEwBcES8BAgQ9AQQAEhAPADABBAI7AQQAEiAo+i8BBAI5AQQAEjAo9C8BBAY4AQQA"
-"EkAo7jABBAg8AQQAElAo6C8BBAg6AQQAEmAo4jABAgg8AQQAEnAo3C8BAgg6AQUAEwAIACjVLwEI"
-"BDoBBQATAAkAKM4wAQgEPAEFABMACgAoxy8BCAg5AcT/EwALACjABgAEAAAAAAClLQAAPgAAABMA"
-"BQ0tAQIDPQEDABIQLgEDAjsBAwASIC0BAwI5AQMAEjAtAQMEOAEDABJALgEDBTwBAwASUC0BAwU6"
-"AQMAEmAuAQIFPAEDABJwLQECBToBBAATAAgALQEFAzoBBAATAAkALgEFAzwBBAATAAoALQEFBTkB"
-"BAATALwEDwAFAAEAAgAAAM8tAAAeAAAAIgAGABMDYwBwIAEAMAAiAQYAcBAAAAEAbhAFAAAACgKw"
-"Qm4QBQABAAoDsDJuIA4AIABuEAUAAAAKAw8DBgAEAAAAAADpLQAAQwAAABMAVwQ3MgQAEhEPATQy"
-"BAASISj8NSMEABIxKPg2IwQAEkEo9DMjBAASUSjwMkMEABJhKOwyIwcAPQIHABMBCAAo5RJxKOM6"
-"AgUAEwEJACjeOwMFABMBCgAo2TwDBQATAQsAKNQ5AwUAEwEMACjPOAUFABMBDQAoyjkFBAABASjG"
-"EwEOACjDAAANAAgAAAAAAB4uAABYAAAAFgMBABMArggxAQUJPQEEABIhDwExAQkFOwEEABIxKPox"
-"AQkFOQEEABJBKPSbAQkDMQEJAToBBAASUSjsmwEFAzEBBQE6AQQAEmEo5DEBCQU4AQkAMQEJCz0B"
-"BwATAQgAKNkScSjXMQELCTsBBQATAQkAKNAxAQsJOQEFABMBCgAoyTEBBQc7AQUAEwELACjCMQEH"
-"BT0BBQATAQwAKLsxAQcFOQEFABMBDQAotAEBKLIBAAEAAAAAAE8uAAAEAAAAewDfAAD/DwAHAAAA"
-"AAAAAFguAAAjAAAAEwb/DxL1FAT///8PEsASwxQB/P8AABLCjUCPQ45h4gICBDJQBAASFA8EMlME"
-"ABIkKPwyYQQAEjQo+DJCBAASRCj0EgQo8gAAAgABAAAAAAB8LgAAAwAAAFIQAAAPAAAAAgACAAAA"
-"AACCLgAAAwAAAFkBAAAOAAAAAwACAAAAAACKLgAAAwAAANoAAgIPAAAABAAAAAIAAgACAAIABAAA"
-"AAMAAwADAAMAAQAAAAQAAAACAAAABAAEAAQAAAAEAAQABAAEABsAAAAEAAUABAAFAAQABQAEAAQA"
-"AgADAAIADAAEAAEABAAEAAAADgAEAAQABQAFAAQABAAEAAQABAAAAAIAAAAFAAUABAAAAAUABQAF"
-"AAUAAgAAAAUABAACAAAACgARAAEAAAASAAY8aW5pdD4AAUIAAUMAAUQAAUYAAUkABUlEREREAAVJ"
-"RkZGRgACSUkAA0lJSQAFSUlJSUkAHElJSklKSUpJSURGRFNJQ0lJQlpJSUpKSUlJSUkAA0lKSgAF"
-"SUpKSkoADEludE1hdGguamF2YQABSgADSkpJAAJMSQAJTEludE1hdGg7AANMTEwAFUxqYXZhL2lv"
-"L1ByaW50U3RyZWFtOwATTGphdmEvbGFuZy9JbnRlZ2VyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJM"
-"amF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwALT2JqZWN0LmphdmEAAVMAAVYA"
-"AlZJAAJWTAABWgACW0kAAltKABNbTGphdmEvbGFuZy9PYmplY3Q7ABNbTGphdmEvbGFuZy9TdHJp"
-"bmc7AAFhAAJhMAACYTEAA2ExMAADYTExAANhMTIAA2ExMwADYTE0AANhMTUAA2ExNgADYTE3AANh"
-"MTgAA2ExOQACYTIAA2EyMAADYTIxAANhMjIAA2EyMwADYTI0AANhMjUAA2EyNgACYTMAAmE0AAJh"
-"NQACYTYAAmE3AAJhOAACYTkACWFsc29NaW51cwAIYWxzb1BsdXMABGFyZ3MAAWIAAWMABWNoYXIx"
-"AAVjaGFyMgALY2hhclN1YlRlc3QAF2NoYXJTdWJUZXN0IEZBSUxFRDogJWQKABNjaGFyU3ViVGVz"
-"dCBQQVNTRUQKAAhjb252VGVzdAAUY29udlRlc3QgRkFJTEVEOiAlZAoAEGNvbnZUZXN0IFBBU1NF"
-"RAoAAWQABGRpc3QAAWUAAWYACWZpYm9uYWNjaQAVZmlib25hY2NpIEZBSUxFRDogJWQKABFmaWJv"
-"bmFjY2kgUEFTU0VECgADZm9vAAZmb28xMjMABGZvb18AAWcABmdldEZvbwABaAABaQACaTEAAmky"
-"AAtpbnRPcGVyVGVzdAAXaW50T3BlclRlc3QgRkFJTEVEOiAlZAoAE2ludE9wZXJUZXN0IFBBU1NF"
-"RAoADGludFNoaWZ0VGVzdAABbAAJbGl0MTZUZXN0AAhsaXQ4VGVzdAAMbG9uZ09wZXJUZXN0ABhs"
-"b25nT3BlclRlc3QgRkFJTEVEOiAlZAoAFGxvbmdPcGVyVGVzdCBQQVNTRUQKAA1sb25nU2hpZnRU"
-"ZXN0ABlsb25nU2hpZnRUZXN0IEZBSUxFRDogJWQKABVsb25nU2hpZnRUZXN0IFBBU1NFRAoABGxy"
-"ZXMACW1Cb29sZWFuMQAJbUJvb2xlYW4yAAZtQnl0ZTEABm1CeXRlMgAGbUJ5dGVzAAZtQ2hhcjEA"
-"Bm1DaGFyMgAIbURvdWJsZTEACG1Eb3VibGUyAAdtRmxvYXQxAAdtRmxvYXQyAAVtSW50MQAFbUlu"
-"dDIABm1Mb25nMQAGbUxvbmcyAAdtU2hvcnQxAAdtU2hvcnQyAA5tVm9sYXRpbGVMb25nMQAObVZv"
-"bGF0aWxlTG9uZzIABG1haW4ACG1hbnlBcmdzABRtYW55QXJncyBGQUlMRUQ6ICVkCgAQbWFueUFy"
-"Z3MgUEFTU0VECgAGbWluSW50AAdtaW5Mb25nAAVtaW51cwABbgADbmFuAAZuZWdPbmUAA291dAAE"
-"cGx1cwAFcGx1czIAB3BsdXNPbmUABnByaW50ZgADcmVzAAZyZXN1bHQAB3Jlc3VsdHMAAXMABnNl"
-"dEZvbwAKc2hpZnRUZXN0MQAWc2hpZnRUZXN0MSBGQUlMRUQ6ICVkCgASc2hpZnRUZXN0MSBQQVNT"
-"RUQKAApzaGlmdFRlc3QyABZzaGlmdFRlc3QyIEZBSUxFRDogJWQKABJzaGlmdFRlc3QyIFBBU1NF"
-"RAoACnN0YXRpY0NhbGwAD3N0YXRpY0ZpZWxkVGVzdAAbc3RhdGljRmllbGRUZXN0IEZBSUxFRDog"
-"JWQKABdzdGF0aWNGaWVsZFRlc3QgUEFTU0VECgAFc3R1ZmYACnN3aXRjaFRlc3QAFnN3aXRjaFRl"
-"c3QgRkFJTEVEOiAlZAoAEnN3aXRjaFRlc3QgUEFTU0VECgARdGVzdERvdWJsZUNvbXBhcmUAHXRl"
-"c3REb3VibGVDb21wYXJlIEZBSUxFRDogJWQKABl0ZXN0RG91YmxlQ29tcGFyZSBQQVNTRUQKABB0"
-"ZXN0RmxvYXRDb21wYXJlABx0ZXN0RmxvYXRDb21wYXJlIEZBSUxFRDogJWQKABh0ZXN0RmxvYXRD"
-"b21wYXJlIFBBU1NFRAoAFnRlc3RHZXRQdXQgRkFJTEVEOiAlZAoAEnRlc3RHZXRQdXQgUEFTU0VE"
-"CgALdGVzdElHZXRQdXQADnRlc3RJbnRDb21wYXJlABp0ZXN0SW50Q29tcGFyZSBGQUlMRUQ6ICVk"
-"CgAWdGVzdEludENvbXBhcmUgUEFTU0VECgAPdGVzdExvbmdDb21wYXJlABt0ZXN0TG9uZ0NvbXBh"
-"cmUgRkFJTEVEOiAlZAoAF3Rlc3RMb25nQ29tcGFyZSBQQVNTRUQKAAR0aGlzAAh1bm9wVGVzdAAU"
-"dW5vcFRlc3QgRkFJTEVEOiAlZAoAEHVub3BUZXN0IFBBU1NFRAoAEXVuc2lnbmVkU2hpZnRUZXN0"
-"AB11bnNpZ25lZFNoaWZ0VGVzdCBGQUlMRUQ6ICVkCgAZdW5zaWduZWRTaGlmdFRlc3QgUEFTU0VE"
-"CgAFdmFsdWUAB3ZhbHVlT2YAC3ZpcnR1YWxDYWxsABd2aXJ0dWFsQ2FsbCBGQUlMRUQ6ICVkCgAT"
-"dmlydHVhbENhbGwgUEFTU0VECgABeAABeQABegAEemVybwADAAcOABQABw48SwAQAZwBBw48LQCx"
-"AQAHDi0DAEUCPwMBRgItAwJaBWkAnAEABw4tAwBaBR4DAWEGAg53AnQdLR6JWh55Wh54AL8EAYUB"
-"Bx0tIRovAMABArsBvAEHWU0DBI8BEEtLS0taWlpaa+MtAwCCAQU8AwGHAQUeAwKLAQVbAwOOAQUC"
-"DCwCdR2WlpaWlmm0lsPTAKQCArYBTgdZLQMAjwEQS0tLeHsalpalAOoBAbsBB1lNAwCPARBLS0tL"
-"S1paW38CeR2WloeHlpbDAIYCAbsBB1lNAwKPARBLS0tLS1paWi0DAIIBBS0DAY4BBTUCeB2WlpaH"
-"eJaWwwC1AgK7AbwBBw5NAwiPARFaWlpaWmlaWmriLQMAgwEGSwMChwEGLQMEiwEGaQMGjgEGAgxZ"
-"AnUd4eHh4eG08MP/AREPlgDbAgK2AU4HWS0DAI8BEUtLS3jXAnsd4eHhagCbBQFCBw5pAyWNAQVp"
-"qEstqEstqEstqEstqEstqIctqLQtqLQDI2oGlqlaaamHaanwaanDaanDaalpaQIOpAE1EVqpWlqp"
-"aWmpaWmoAv1+HQUjARMUARMUARMUARMUARMUARMUARMUARMUBiMBExUBExUBExUBExUBExUBExUC"
-"EgETDgETFQETFQETFQDcBBslJjE5Ojs8PT4/JygpKissLS4vMDIzNDU2NzgHDgIbOwJmHYdah1qH"
-"WlqWlpaWlpaWlpaWpaWlpaWlpaWlAEwAB1l9AwRvEAIbhgJmHZaWlpalpaYBEg8DAFsFARUPAwFc"
-"BXkDAmEGllrEATgX0gJfLAByAAcOLQMAJAYtAwJDBi0DBEQGLQMGTQYtAwhPBi0DClAGLQMMVwYu"
-"Aw5ZBgEqEQMQjgEGtACLBQEkBw5aAwBUBwAZAbsBB7M8PC0tLVotLVotWkt4eHhLeHkCE2gCbh14"
-"eHh4pXh4pXgBFQ+04fABGg/D8PEA6gIBJAcOLgMAjQEFQgIoLAUAAwGNAQUCUh0FAQYAAQIFAAYB"
-"HgUBBgABAgUABgEfBQEGAAECBQAGAR4FAQYAAQIFAAYBHgUBBgABAgUABgEgBQEGAEE9PgECBQAG"
-"AQJ2HQUBBgABAgUABgEeBQEGAAEDBQAGASUFAQYAAQMFAAYBIAUBBgBBAQMFAAYBAnsdBQEGAAED"
-"BQAGAR4FAQYAAQMFAAYBHwUBBgABAwUABgEeBQEGAAEDBQAGASAFAQYAQR4/AQMFAAYBAnYdBQEG"
-"AAEDBQAGAR4FAQYAAQMFAAYBIwUBBgABAwUABgEfBQEGAAEDBQAGAQEBBQEGACQFAAYBAlEdARAX"
-"josBFharAKEEBIQBiQGKAYYBBw4uAwCNAQVLAhcdBQACah0GAEstSy1LLkstSy1LLUs8SzxLPUsA"
-"gQQEhAGJAYoBhgEHDi0DAI0BBUseSx5LHksfSx5LHkseSy1LLUsuSy4AkQUBJAcOeAMAVAdaAwFV"
-"B0sDAr0BBR5aPAChAwSEAYkBigG+AQcOLgMAjQEFLQIlHQJcHS0tLS0tLS0tLS8yLTcxLTwtPC08"
-"LTwtPUAbANMDBIQBQIkBQQcsLgMAjQEFSwIiHQJfHUstSy5pLWkvUUsCezsySzxLPks8SzxLTABG"
-"AbsBBw4eLQCDAQAHaB4DAEMBHgMDkAENPAMBRAIfAwJaBR4eHi4/GktLSwCGBQAHDgCBBQEkBw4t"
-"APwEASQHDgAAAAEAHoGABMAMEgEZAwEJAQkBCQEJAQkBCQEJAQkBCQEJAQkBCQEJAQkBCQEJAUkB"
-"SQACAIGABNQMAYGABPQMAQiQDQEIwA0BCLQOAgjwDgEI4BEBCPASAQjsFAEI9BYBCOAaAQmoHAEI"
-"qCkCCIgtAQiMMQEIsDIBCNQyAQi0NwEIpDoBCMQ7AQjQPAEInD0BCLQ+AQj0PwEIjEAFAORACQD8"
-"QA0AlEEAAAANAAAAAAAAAAEAAAAAAAAAAQAAAL4AAABwAAAAAgAAABMAAABoAwAAAwAAAA8AAAC0"
-"AwAABAAAABQAAABoBAAABQAAAB8AAAAIBQAABgAAAAIAAAAABgAAASAAAB0AAABABgAAARAAAAsA"
-"AACsIAAAAiAAAL4AAABGIQAAAyAAAB0AAACNKQAAACAAAAIAAACRLgAAABAAAAEAAAA8LwAA";
-}  // namespace art
diff --git a/src/dex_file.cc b/src/dex_file.cc
index 01eb099..231b4be 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -54,7 +54,7 @@
 DexFile::PtrCloser::PtrCloser(byte* addr) : addr_(addr) {}
 DexFile::PtrCloser::~PtrCloser() { delete[] addr_; }
 
-DexFile* DexFile::OpenFile(const std::string& filename) {
+const DexFile* DexFile::OpenFile(const std::string& filename) {
   int fd = open(filename.c_str(), O_RDONLY);  // TODO: scoped_fd
   if (fd == -1) {
     PLOG(ERROR) << "open(\"" << filename << "\", O_RDONLY) failed";
@@ -137,7 +137,7 @@
 };
 
 // Open classes.dex from within a .zip, .jar, .apk, ...
-DexFile* DexFile::OpenZip(const std::string& filename) {
+const DexFile* DexFile::OpenZip(const std::string& filename) {
 
   // First, look for a ".dex" alongside the jar file.  It will have
   // the same name/path except for the extension.
@@ -153,7 +153,7 @@
                                 ".dex");
   // Example adjacent_dex_filename = dir/foo.dex
   if (OS::FileExists(adjacent_dex_filename.c_str())) {
-    DexFile* adjacent_dex_file = DexFile::OpenFile(adjacent_dex_filename);
+    const DexFile* adjacent_dex_file = DexFile::OpenFile(adjacent_dex_filename);
     if (adjacent_dex_file != NULL) {
       // We don't verify anything in this case, because we aren't in
       // the cache and typically the file is in the readonly /system
@@ -200,7 +200,7 @@
 
   while (true) {
     if (OS::FileExists(cache_path.c_str())) {
-      DexFile* cached_dex_file = DexFile::OpenFile(cache_path);
+      const DexFile* cached_dex_file = DexFile::OpenFile(cache_path);
       if (cached_dex_file != NULL) {
         return cached_dex_file;
       }
@@ -294,14 +294,14 @@
   // NOTREACHED
 }
 
-DexFile* DexFile::OpenPtr(byte* ptr, size_t length, const std::string& location) {
+const DexFile* DexFile::OpenPtr(byte* ptr, size_t length, const std::string& location) {
   CHECK(ptr != NULL);
   DexFile::Closer* closer = new PtrCloser(ptr);
   return Open(ptr, length, location, closer);
 }
 
-DexFile* DexFile::Open(const byte* dex_bytes, size_t length,
-                       const std::string& location, Closer* closer) {
+const DexFile* DexFile::Open(const byte* dex_bytes, size_t length,
+                             const std::string& location, Closer* closer) {
   scoped_ptr<DexFile> dex_file(new DexFile(dex_bytes, length, location, closer));
   if (!dex_file->Init()) {
     return NULL;
diff --git a/src/dex_file.h b/src/dex_file.h
index 4fb1442..bbc3f81 100644
--- a/src/dex_file.h
+++ b/src/dex_file.h
@@ -317,17 +317,17 @@
                                         const ClassPath& class_path);
 
   // Opens a .dex file from the file system.
-  static DexFile* OpenFile(const std::string& filename);
+  static const DexFile* OpenFile(const std::string& filename);
 
   // Opens a .jar, .zip, or .apk file from the file system.
-  static DexFile* OpenZip(const std::string& filename);
+  static const DexFile* OpenZip(const std::string& filename);
 
   // Opens a .dex file from a new allocated pointer.  location is used
   // to identify the source, for example "/system/framework/core.jar"
   // or "contrived-test-42". When initializing a ClassLinker from an
   // image, the location is used to match DexCaches the image to their
   // corresponding DexFiles.N
-  static DexFile* OpenPtr(byte* ptr, size_t length, const std::string& location);
+  static const DexFile* OpenPtr(byte* ptr, size_t length, const std::string& location);
 
   // Closes a .dex file.
   virtual ~DexFile();
@@ -830,8 +830,11 @@
     byte* addr_;
   };
 
-  // Opens a .dex file at a the given address.
-  static DexFile* Open(const byte* dex_file, size_t length, const std::string& location, Closer* closer);
+  // Opens a .dex file at the given address.
+  static const DexFile* Open(const byte* dex_file,
+                             size_t length,
+                             const std::string& location,
+                             Closer* closer);
 
   DexFile(const byte* addr, size_t length, const std::string& location, Closer* closer)
       : base_(addr),
diff --git a/src/dex_file_test.cc b/src/dex_file_test.cc
index 37c601c..96d0477 100644
--- a/src/dex_file_test.cc
+++ b/src/dex_file_test.cc
@@ -5,17 +5,44 @@
 #include "scoped_ptr.h"
 
 #include <stdio.h>
-#include "gtest/gtest.h"
 
 namespace art {
 
-TEST(DexFileTest, Open) {
-  scoped_ptr<const DexFile> dex(OpenDexFileBase64(kNestedDex, "kNestedDex"));
+class DexFileTest : public CommonTest {};
+
+TEST_F(DexFileTest, Open) {
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("Nested"));
   ASSERT_TRUE(dex != NULL);
 }
 
-TEST(DexFileTest, Header) {
-  scoped_ptr<const DexFile> raw(OpenDexFileBase64(kNestedDex, "kNestedDex"));
+// Although this is the same content logically as the Nested test dex,
+// the DexFileHeader test is sensitive to subtle changes in the
+// contents due to the checksum etc, so we embed the exact input here.
+//
+// class Nested {
+//     class Inner {
+//     }
+// }
+static const char kRawDex[] =
+  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
+  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
+  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
+  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
+  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
+  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
+  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
+  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
+  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
+  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
+  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
+  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
+  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
+  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
+  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
+  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
+
+TEST_F(DexFileTest, Header) {
+  scoped_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, "kRawDex"));
   ASSERT_TRUE(raw != NULL);
 
   const DexFile::Header& header = raw->GetHeader();
@@ -42,8 +69,8 @@
   EXPECT_EQ(320U, header.data_off_);
 }
 
-TEST(DexFileTest, ClassDefs) {
-  scoped_ptr<const DexFile> raw(OpenDexFileBase64(kNestedDex, "kNestedDex"));
+TEST_F(DexFileTest, ClassDefs) {
+  scoped_ptr<const DexFile> raw(OpenTestDexFile("Nested"));
   ASSERT_TRUE(raw != NULL);
   EXPECT_EQ(2U, raw->NumClassDefs());
 
@@ -54,8 +81,8 @@
   EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
 }
 
-TEST(DexFileTest, CreateMethodDescriptor) {
-  scoped_ptr<const DexFile> raw(OpenDexFileBase64(kCreateMethodDescriptorDex, "kCreateMethodDescriptorDex"));
+TEST_F(DexFileTest, CreateMethodDescriptor) {
+  scoped_ptr<const DexFile> raw(OpenTestDexFile("CreateMethodDescriptor"));
   ASSERT_TRUE(raw != NULL);
   EXPECT_EQ(1U, raw->NumClassDefs());
 
diff --git a/src/dex_verifier_test.cc b/src/dex_verifier_test.cc
index f1d99e6..a9da38f 100644
--- a/src/dex_verifier_test.cc
+++ b/src/dex_verifier_test.cc
@@ -2,13 +2,11 @@
 
 #include "class_linker.h"
 #include "common_test.h"
-#include "compiler_test.h"
 #include "dex_file.h"
 #include "dex_verifier.h"
 #include "scoped_ptr.h"
 
 #include <stdio.h>
-#include "gtest/gtest.h"
 
 namespace art {
 
@@ -40,8 +38,8 @@
 }
 
 TEST_F(DexVerifierTest, IntMath) {
-  const DexFile* dex = OpenDexFileBase64(kIntMathDex, "kIntMathDex");
-  PathClassLoader* class_loader = AllocPathClassLoader(dex);
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("IntMath"));
+  PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* klass = class_linker_->FindClass("LIntMath;", class_loader);
   ASSERT_TRUE(DexVerify::VerifyClass(klass));
 }
diff --git a/src/exception_test.cc b/src/exception_test.cc
index a1a101d..f2701dd 100644
--- a/src/exception_test.cc
+++ b/src/exception_test.cc
@@ -94,7 +94,7 @@
     return DexFile::CatchHandlerItem();
   }
 
-  scoped_ptr<DexFile> dex_;
+  scoped_ptr<const DexFile> dex_;
 
   Method* method_f_;
   Method* method_g_;
diff --git a/src/image_test.cc b/src/image_test.cc
index 54c2c75..bd30e71 100644
--- a/src/image_test.cc
+++ b/src/image_test.cc
@@ -51,7 +51,7 @@
   // lucky by pointers that happen to work referencing the earlier
   // dex.
   delete java_lang_dex_file_.release();
-  scoped_ptr<DexFile> dex(GetLibCoreDex());
+  scoped_ptr<const DexFile> dex(GetLibCoreDex());
   ASSERT_TRUE(dex != NULL);
 
   std::vector<const DexFile*> boot_class_path;
diff --git a/src/jni_compiler_test.cc b/src/jni_compiler_test.cc
index 4611b3c..ce0bb51 100644
--- a/src/jni_compiler_test.cc
+++ b/src/jni_compiler_test.cc
@@ -21,7 +21,7 @@
  protected:
   virtual void SetUp() {
     CommonTest::SetUp();
-    dex_.reset(OpenDexFileBase64(kMyClassNativesDex, "kMyClassNativesDex"));
+    dex_.reset(OpenTestDexFile("MyClassNatives"));
     class_loader_ = AllocPathClassLoader(dex_.get());
     Thread::Current()->SetClassLoaderOverride(class_loader_);
   }
@@ -65,7 +65,7 @@
   static jclass jklass_;
   static jobject jobj_;
  protected:
-  scoped_ptr<DexFile> dex_;
+  scoped_ptr<const DexFile> dex_;
   PathClassLoader* class_loader_;
   Assembler jni_asm;
   JniCompiler jni_compiler;
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index fc51db0..c66bb42 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -621,7 +621,7 @@
 
 
 TEST_F(JniInternalTest, GetPrimitiveField_SetPrimitiveField) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kAllFields, "kAllFields"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("AllFields"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Thread::Current()->SetClassLoaderOverride(class_loader);
 
@@ -650,7 +650,7 @@
 }
 
 TEST_F(JniInternalTest, GetObjectField_SetObjectField) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kAllFields, "kAllFields"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("AllFields"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Thread::Current()->SetClassLoaderOverride(class_loader);
 
@@ -806,7 +806,7 @@
 
 #if defined(__arm__)
 TEST_F(JniInternalTest, StaticMainMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kMainDex, "kMainDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("Main"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -832,7 +832,7 @@
 }
 
 TEST_F(JniInternalTest, StaticNopMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -857,7 +857,7 @@
 }
 
 TEST_F(JniInternalTest, StaticIdentityByteMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -903,7 +903,7 @@
 }
 
 TEST_F(JniInternalTest, StaticIdentityIntMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -949,7 +949,7 @@
 }
 
 TEST_F(JniInternalTest, StaticIdentityDoubleMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -996,7 +996,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumIntIntMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1054,7 +1054,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumIntIntIntMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1119,7 +1119,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumIntIntIntIntMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1190,7 +1190,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumIntIntIntIntIntMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1268,7 +1268,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumDoubleDoubleMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1327,7 +1327,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1379,7 +1379,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
@@ -1436,7 +1436,7 @@
 }
 
 TEST_F(JniInternalTest, StaticSumDoubleDoubleDoubleDoubleDoubleMethod) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kStaticLeafMethodsDex, "kStaticLeafMethodsDex"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("StaticLeafMethods"));
 
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   ASSERT_TRUE(class_loader != NULL);
diff --git a/src/object_test.cc b/src/object_test.cc
index 8979e8d..a862f71 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -201,7 +201,7 @@
 }
 
 TEST_F(ObjectTest, StaticFieldFromCode) {
-  // pretend we are trying to call 'new String' from Object.toString
+  // pretend we are trying to access 'String.ASCII' from String.<clinit>
   Class* java_lang_String = class_linker_->FindSystemClass("Ljava/lang/String;");
   Method* clinit = java_lang_String->FindDirectMethod("<clinit>", "()V");
   uint32_t field_idx = FindFieldIdxByDescriptorAndName(*java_lang_dex_file_.get(),
@@ -215,8 +215,9 @@
 
   Field::SetObjStaticFromCode(field_idx, clinit, NULL);
   EXPECT_EQ(NULL, Field::GetObjStaticFromCode(field_idx, clinit));
-  
+
   // TODO: more exhaustive tests of all 6 cases of Field::*FromCode
+  // TODO: test should not assume private internals such as String.ASCII field.
 }
 
 TEST_F(ObjectTest, String) {
@@ -273,9 +274,9 @@
 TEST_F(ObjectTest, DescriptorCompare) {
   ClassLinker* linker = class_linker_;
 
-  scoped_ptr<DexFile> proto1_dex_file(OpenDexFileBase64(kProtoCompareDex, "kProtoCompareDex"));
+  scoped_ptr<const DexFile> proto1_dex_file(OpenTestDexFile("ProtoCompare"));
   PathClassLoader* class_loader_1 = AllocPathClassLoader(proto1_dex_file.get());
-  scoped_ptr<DexFile> proto2_dex_file(OpenDexFileBase64(kProtoCompare2Dex, "kProtoCompare2Dex"));
+  scoped_ptr<const DexFile> proto2_dex_file(OpenTestDexFile("ProtoCompare2"));
   PathClassLoader* class_loader_2 = AllocPathClassLoader(proto2_dex_file.get());
 
   Class* klass1 = linker->FindClass("LProtoCompare;", class_loader_1);
@@ -322,7 +323,7 @@
 }
 
 TEST_F(ObjectTest, InstanceOf) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kXandY, "kXandY"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("XandY"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* X = class_linker_->FindClass("LX;", class_loader);
   Class* Y = class_linker_->FindClass("LY;", class_loader);
@@ -349,7 +350,7 @@
 }
 
 TEST_F(ObjectTest, IsAssignableFrom) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kXandY, "kXandY"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("XandY"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* X = class_linker_->FindClass("LX;", class_loader);
   Class* Y = class_linker_->FindClass("LY;", class_loader);
@@ -361,7 +362,7 @@
 }
 
 TEST_F(ObjectTest, IsAssignableFromArray) {
-  scoped_ptr<DexFile> dex(OpenDexFileBase64(kXandY, "kXandY"));
+  scoped_ptr<const DexFile> dex(OpenTestDexFile("XandY"));
   PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
   Class* X = class_linker_->FindClass("LX;", class_loader);
   Class* Y = class_linker_->FindClass("LY;", class_loader);
diff --git a/src/runtime.cc b/src/runtime.cc
index 2443cc6..33b372b 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -165,7 +165,7 @@
   }
 }
 
-DexFile* Open(const std::string& filename) {
+const DexFile* Open(const std::string& filename) {
   if (filename.size() < 4) {
     LOG(WARNING) << "Ignoring short classpath entry '" << filename << "'";
     return NULL;
@@ -184,7 +184,7 @@
   std::vector<std::string> parsed;
   ParseClassPath(boot_class_path_cstr, parsed);
   for (size_t i = 0; i < parsed.size(); ++i) {
-    DexFile* dex_file = Open(parsed[i]);
+    const DexFile* dex_file = Open(parsed[i]);
     if (dex_file != NULL) {
       boot_class_path_vector.push_back(dex_file);
     }
diff --git a/test/AllFields/AllFields.java b/test/AllFields/AllFields.java
new file mode 100644
index 0000000..86b8841
--- /dev/null
+++ b/test/AllFields/AllFields.java
@@ -0,0 +1,25 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class AllFields {
+    static boolean sZ;
+    static byte sB;
+    static char sC;
+    static double sD;
+    static float sF;
+    static int sI;
+    static long sJ;
+    static short sS;
+    static Object sObject;
+    static Object[] sObjectArray;
+
+    boolean iZ;
+    byte iB;
+    char iC;
+    double iD;
+    float iF;
+    int iI;
+    long iJ;
+    short iS;
+    Object iObject;
+    Object[] iObjectArray;
+}
diff --git a/test/CreateMethodDescriptor/CreateMethodDescriptor.java b/test/CreateMethodDescriptor/CreateMethodDescriptor.java
new file mode 100644
index 0000000..aa1f3de
--- /dev/null
+++ b/test/CreateMethodDescriptor/CreateMethodDescriptor.java
@@ -0,0 +1,6 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class CreateMethodDescriptor {
+    Float m1(int a, double b, long c, Object d) { return null; }
+    CreateMethodDescriptor m2(boolean x, short y, char z) { return null; }
+}
diff --git a/test/Fibonacci/Fibonacci.java b/test/Fibonacci/Fibonacci.java
new file mode 100644
index 0000000..5137205
--- /dev/null
+++ b/test/Fibonacci/Fibonacci.java
@@ -0,0 +1,30 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Fibonacci {
+
+    static int fibonacci(int n) {
+        if (n == 0) {
+            return 0;
+        }
+        int x = 1;
+        int y = 1;
+        for (int i = 3; i <= n; i++) {
+            int z = x + y;
+            x = y;
+            y = z;
+        }
+        return y;
+    }
+
+    public static void main(String[] args) {
+        try {
+            if (args.length == 1) {
+                int x = Integer.parseInt(args[0]);
+                int y = fibonacci(x); /* to warm up cache */
+                System.out.printf("fibonacci(%d)=%d\n", x, y);
+                y = fibonacci(x +1);
+                System.out.printf("fibonacci(%d)=%d\n", x, y);
+            }
+        } catch (NumberFormatException ex) {}
+    }
+}
diff --git a/test/IntMath/IntMath.java b/test/IntMath/IntMath.java
new file mode 100644
index 0000000..c13a79a
--- /dev/null
+++ b/test/IntMath/IntMath.java
@@ -0,0 +1,805 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class IntMath {
+
+    public static boolean mBoolean1, mBoolean2;
+    public static byte mByte1, mByte2;
+    public static char mChar1, mChar2;
+    public static short mShort1, mShort2;
+    public static int mInt1, mInt2;
+    public static float mFloat1, mFloat2;
+    public static long mLong1, mLong2;
+    public static double mDouble1, mDouble2;
+    public static volatile long mVolatileLong1, mVolatileLong2;
+
+
+    private int foo_;
+
+    public IntMath(int stuff) {
+        foo_ = stuff;
+    }
+
+    public IntMath() {
+        foo_ = 123;
+    }
+
+    static int staticFieldTest(int x) {
+        mBoolean1 = true;
+        mBoolean2 = false;
+        mByte1 = 127;
+        mByte2 = -128;
+        mChar1 = 32767;
+        mChar2 = 65535;
+        mShort1 = 32767;
+        mShort2 = -32768;
+        mInt1 = 65537;
+        mInt2 = -65537;
+        mFloat1 = 3.1415f;
+        mFloat2 = -1.0f / 0.0f;                // -inf
+        mLong1 = 1234605616436508552L;     // 0x1122334455667788
+        mLong2 = -1234605616436508552L;
+        mDouble1 = 3.1415926535;
+        mDouble2 = 1.0 / 0.0;               // +inf
+        mVolatileLong1 = mLong1 - 1;
+        mVolatileLong2 = mLong2 + 1;
+
+        if (!mBoolean1) { return 10; }
+        if (mBoolean2) { return 11; }
+        if (mByte1 != 127) { return 12; }
+        if (mByte2 != -128) { return 13; }
+        if (mChar1 != 32767) { return 14; }
+        if (mChar2 != 65535) { return 15; }
+        if (mShort1 != 32767) { return 16; }
+        if (mShort2 != -32768) { return 17; }
+        if (mInt1 != 65537) { return 18; }
+        if (mInt2 != -65537) { return 19; }
+        if (!(mFloat1 > 3.141f && mFloat1 < 3.142f)) { return 20; }
+        if (mFloat2 >= mFloat1) { return 21; }
+        if (mLong1 != 1234605616436508552L) { return 22; }
+        if (mLong2 != -1234605616436508552L) { return 23; }
+        if (!(mDouble1 > 3.141592653 && mDouble1 < 3.141592654)) { return 24; }
+        if (mDouble2 <= mDouble1) { return 25; }
+        if (mVolatileLong1 != 1234605616436508551L) { return 26; }
+        if (mVolatileLong2 != -1234605616436508551L) { return 27; }
+
+        return 1000 + x;
+    }
+
+    /*
+     * Try to cause some unary operations.
+     */
+    static int unopTest(int x) {
+        x = -x;
+        x ^= 0xffffffff;
+        return x;
+    }
+
+    static int shiftTest1() {
+        final int[] mBytes = {
+            0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
+        };
+        long l;
+        int i1, i2;
+
+        if (mBytes[0] != 0x11) return 20;
+        if (mBytes[1] != 0x22) return 21;
+        if (mBytes[2] != 0x33) return 22;
+        if (mBytes[3] != 0x44) return 23;
+        if (mBytes[4] != 0x88) return 24;
+        if (mBytes[5] != 0x99) return 25;
+        if (mBytes[6] != 0xaa) return 26;
+        if (mBytes[7] != 0xbb) return 27;
+
+        i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
+        i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
+        l = i1 | ((long)i2 << 32);
+
+        if (i1 != 0x44332211) { return 0x80000000 | i1; }
+        if (i2 != 0xbbaa9988) { return 2; }
+        if (l != 0xbbaa998844332211L) { return 3; }
+
+        l = (long)mBytes[0]
+                | (long)mBytes[1] << 8
+                | (long)mBytes[2] << 16
+                | (long)mBytes[3] << 24
+                | (long)mBytes[4] << 32
+                | (long)mBytes[5] << 40
+                | (long)mBytes[6] << 48
+                | (long)mBytes[7] << 56;
+
+        if (l != 0xbbaa998844332211L) { return 4; }
+        return 0;
+    }
+
+    static int shiftTest2() {
+
+        long    a = 0x11;
+        long    b = 0x22;
+        long    c = 0x33;
+        long    d = 0x44;
+        long    e = 0x55;
+        long    f = 0x66;
+        long    g = 0x77;
+        long    h = 0x88;
+
+        long    result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
+                          (e << 24) | (f << 16) | (g <<  8) | h);
+
+        if (result != 0x1122334455667788L) { return 1; }
+        return 0;
+    }
+
+    static int unsignedShiftTest() {
+        byte b = -4;
+        short s = -4;
+        char c = 0xfffc;
+        int i = -4;
+
+        b >>>= 4;
+        s >>>= 4;
+        c >>>= 4;
+        i >>>= 4;
+
+        if ((int) b != -1) { return 1; }
+        if ((int) s != -1) { return 2; }
+        if ((int) c != 0x0fff) { return 3; }
+        if (i != 268435455) { return 4; }
+        return 0;
+    }
+
+    static int convTest() {
+
+        float f;
+        double d;
+        int i;
+        long l;
+
+        /* int --> long */
+        i = 7654;
+        l = (long) i;
+        if (l != 7654L) { return 1; }
+
+        i = -7654;
+        l = (long) i;
+        if (l != -7654L) { return 2; }
+
+        /* long --> int (with truncation) */
+        l = 5678956789L;
+        i = (int) l;
+        if (i != 1383989493) { return 3; }
+
+        l = -5678956789L;
+        i = (int) l;
+        if (i != -1383989493) { return 4; }
+        return 0;
+    }
+
+    static int charSubTest() {
+
+        char char1 = 0x00e9;
+        char char2 = 0xffff;
+        int i;
+
+        /* chars are unsigned-expanded to ints before subtraction */
+        i = char1 - char2;
+        if (i != 0xffff00ea) { return 1; }
+        return 0;
+    }
+
+    /*
+     * We pass in the arguments and return the results so the compiler
+     * doesn't do the math for us.  (x=70000, y=-3)
+     */
+    static int intOperTest(int x, int y) {
+        int[] results = new int[10];
+
+        /* this seems to generate "op-int" instructions */
+        results[0] = x + y;
+        results[1] = x - y;
+        results[2] = x * y;
+        results[3] = x * x;
+        results[4] = x / y;
+        results[5] = x % -y;
+        results[6] = x & y;
+        results[7] = x | y;
+        results[8] = x ^ y;
+
+        /* this seems to generate "op-int/2addr" instructions */
+        results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
+
+        /* check this edge case while we're here (div-int/2addr) */
+        int minInt = -2147483648;
+        int negOne = -results[5];
+        int plusOne = 1;
+        int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
+
+        if (result != minInt) { return 1;};
+        if (results[0] != 69997) { return 2;};
+        if (results[1] != 70003) { return 3;};
+        if (results[2] != -210000) { return 4;};
+        if (results[3] != 605032704) { return 5;};
+        if (results[4] != -23333) { return 6;};
+        if (results[5] != 1) { return 7;};
+        if (results[6] != 70000) { return 8;};
+        if (results[7] != -3) { return 9;};
+        if (results[8] != -70003) { return 10;};
+        if (results[9] != 70000) { return 11;};
+
+        return 0;
+    }
+
+    /*
+     * More operations, this time with 16-bit constants.  (x=77777)
+     */
+    static int lit16Test(int x) {
+
+        int[] results = new int[8];
+
+        /* try to generate op-int/lit16" instructions */
+        results[0] = x + 1000;
+        results[1] = 1000 - x;
+        results[2] = x * 1000;
+        results[3] = x / 1000;
+        results[4] = x % 1000;
+        results[5] = x & 1000;
+        results[6] = x | -1000;
+        results[7] = x ^ -1000;
+
+        if (results[0] != 78777) { return 1; }
+        if (results[1] != -76777) { return 2; }
+        if (results[2] != 77777000) { return 3; }
+        if (results[3] != 77) { return 4; }
+        if (results[4] != 777) { return 5; }
+        if (results[5] != 960) { return 6; }
+        if (results[6] != -39) { return 7; }
+        if (results[7] != -76855) { return 8; }
+        return 0;
+    }
+
+    /*
+     * More operations, this time with 8-bit constants.  (x=-55555)
+     */
+    static int lit8Test(int x) {
+
+        int[] results = new int[8];
+
+        /* try to generate op-int/lit8" instructions */
+        results[0] = x + 10;
+        results[1] = 10 - x;
+        results[2] = x * 10;
+        results[3] = x / 10;
+        results[4] = x % 10;
+        results[5] = x & 10;
+        results[6] = x | -10;
+        results[7] = x ^ -10;
+        int minInt = -2147483648;
+        int result = minInt / -1;
+        if (result != minInt) {return 1; }
+        if (results[0] != -55545) {return 2; }
+        if (results[1] != 55565) {return 3; }
+        if (results[2] != -555550) {return 4; }
+        if (results[3] != -5555) {return 5; }
+        if (results[4] != -5) {return 6; }
+        if (results[5] != 8) {return 7; }
+        if (results[6] != -1) {return 8; }
+        if (results[7] != 55563) {return 9; }
+        return 0;
+    }
+
+
+    /*
+     * Shift some data.  (value=0xff00aa01, dist=8)
+     */
+    static int intShiftTest(int value, int dist) {
+        int results[] = new int[4];
+        results[0] = value << dist;
+        results[1] = value >> dist;
+        results[2] = value >>> dist;
+        results[3] = (((value << dist) >> dist) >>> dist) << dist;
+        if (results[0] != 0x00aa0100) {return 1; }
+        if (results[1] != 0xffff00aa) {return 2; }
+        if (results[2] != 0x00ff00aa) {return 3; }
+        if (results[3] != 0xaa00) {return 4; }
+        return 0;
+    }
+
+    /*
+     * We pass in the arguments and return the results so the compiler
+     * doesn't do the math for us.  (x=70000000000, y=-3)
+     */
+    static int longOperTest(long x, long y) {
+        long[] results = new long[10];
+
+        /* this seems to generate "op-long" instructions */
+        results[0] = x + y;
+        results[1] = x - y;
+        results[2] = x * y;
+        results[3] = x * x;
+        results[4] = x / y;
+        results[5] = x % -y;
+        results[6] = x & y;
+        results[7] = x | y;
+        results[8] = x ^ y;
+        /* this seems to generate "op-long/2addr" instructions */
+        results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
+        /* check this edge case while we're here (div-long/2addr) */
+        long minLong = -9223372036854775808L;
+        long negOne = -results[5];
+        long plusOne = 1;
+        long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
+        if (result != minLong) { return 1; }
+        if (results[0] != 69999999997L) { return 2; }
+        if (results[1] != 70000000003L) { return 3; }
+        if (results[2] != -210000000000L) { return 4; }
+        if (results[3] != -6833923606740729856L) { return 5; }    // overflow
+        if (results[4] != -23333333333L) { return 6; }
+        if (results[5] != 1) { return 7; }
+        if (results[6] != 70000000000L) { return 8; }
+        if (results[7] != -3) { return 9; }
+        if (results[8] != -70000000003L) { return 10; }
+        if (results[9] != 70000000000L) { return 11; }
+        if (results.length != 10) { return 12; }
+        return 0;
+    }
+
+    /*
+     * Shift some data.  (value=0xd5aa96deff00aa01, dist=16)
+     */
+    static long longShiftTest(long value, int dist) {
+        long results[] = new long[4];
+        results[0] = value << dist;
+        results[1] = value >> dist;
+        results[2] = value >>> dist;
+        results[3] = (((value << dist) >> dist) >>> dist) << dist;
+        if (results[0] != 0x96deff00aa010000L) { return results[0]; }
+        if (results[1] != 0xffffd5aa96deff00L) { return results[1]; }
+        if (results[2] != 0x0000d5aa96deff00L) { return results[2]; }
+        if (results[3] != 0xffff96deff000000L) { return results[3]; }
+        if (results.length != 4) { return 5; }
+
+        return results[0];      // test return-long
+    }
+
+    static int switchTest(int a) {
+        int res = 1234;
+
+        switch (a) {
+            case -1: res = 1; return res;
+            case 0: res = 2; return res;
+            case 1: /*correct*/ break;
+            case 2: res = 3; return res;
+            case 3: res = 4; return res;
+            case 4: res = 5; return res;
+            default: res = 6; return res;
+        }
+        switch (a) {
+            case 3: res = 7; return res;
+            case 4: res = 8; return res;
+            default: /*correct*/ break;
+        }
+
+        a = 0x12345678;
+
+        switch (a) {
+            case 0x12345678: /*correct*/ break;
+            case 0x12345679: res = 9; return res;
+            default: res = 1; return res;
+        }
+        switch (a) {
+            case 57: res = 10; return res;
+            case -6: res = 11; return res;
+            case 0x12345678: /*correct*/ break;
+            case 22: res = 12; return res;
+            case 3: res = 13; return res;
+            default: res = 14; return res;
+        }
+        switch (a) {
+            case -6: res = 15; return res;
+            case 3: res = 16; return res;
+            default: /*correct*/ break;
+        }
+
+        a = -5;
+        switch (a) {
+            case 12: res = 17; return res;
+            case -5: /*correct*/ break;
+            case 0: res = 18; return res;
+            default: res = 19; return res;
+        }
+
+        switch (a) {
+            default: /*correct*/ break;
+        }
+        return res;
+    }
+    /*
+     * Test the integer comparisons in various ways.
+     */
+    static int testIntCompare(int minus, int plus, int plus2, int zero) {
+        int res = 1111;
+
+        if (minus > plus)
+            return 1;
+        if (minus >= plus)
+            return 2;
+        if (plus < minus)
+            return 3;
+        if (plus <= minus)
+            return 4;
+        if (plus == minus)
+            return 5;
+        if (plus != plus2)
+            return 6;
+
+        /* try a branch-taken */
+        if (plus != minus) {
+            res = res;
+        } else {
+            return 7;
+        }
+
+        if (minus > 0)
+            return 8;
+        if (minus >= 0)
+            return 9;
+        if (plus < 0)
+            return 10;
+        if (plus <= 0)
+            return 11;
+        if (plus == 0)
+            return 12;
+        if (zero != 0)
+            return 13;
+
+        if (zero == 0) {
+            res = res;
+        } else {
+            return 14;
+        }
+        return res;
+    }
+
+    /*
+     * Test cmp-long.
+     *
+     * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
+     */
+    static int testLongCompare(long minus, long alsoMinus, long plus,
+                               long alsoPlus) {
+        int res = 2222;
+
+        if (minus > plus)
+            return 2;
+        if (plus < minus)
+            return 3;
+        if (plus == minus)
+            return 4;
+
+        if (plus >= plus+1)
+            return 5;
+        if (minus >= minus+1)
+            return 6;
+
+        /* try a branch-taken */
+        if (plus != minus) {
+            res = res;
+        } else {
+            return 7;
+        }
+
+        /* compare when high words are equal but low words differ */
+        if (plus > alsoPlus)
+            return 8;
+        if (alsoPlus < plus)
+            return 9;
+        if (alsoPlus == plus)
+            return 10;
+
+        /* high words are equal, low words have apparently different signs */
+        if (minus < alsoMinus)      // bug!
+            return 11;
+        if (alsoMinus > minus)
+            return 12;
+        if (alsoMinus == minus)
+            return 13;
+
+        return res;
+    }
+
+    /*
+     * Test cmpl-float and cmpg-float.
+     */
+    static int testFloatCompare(float minus, float plus, float plus2,
+                                float nan) {
+
+        int res = 3333;
+        if (minus > plus)
+            res = 1;
+        if (plus < minus)
+            res = 2;
+        if (plus == minus)
+            res = 3;
+        if (plus != plus2)
+            res = 4;
+
+        if (plus <= nan)
+            res = 5;
+        if (plus >= nan)
+            res = 6;
+        if (minus <= nan)
+            res = 7;
+        if (minus >= nan)
+            res = 8;
+        if (nan >= plus)
+            res = 9;
+        if (nan <= plus)
+            res = 10;
+
+        if (nan == nan)
+            res = 1212;
+
+        return res;
+    }
+
+    static int testDoubleCompare(double minus, double plus, double plus2,
+                                 double nan) {
+
+        int res = 4444;
+
+        if (minus > plus)
+            return 1;
+        if (plus < minus)
+            return 2;
+        if (plus == minus)
+            return 3;
+        if (plus != plus2)
+            return 4;
+
+        if (plus <= nan)
+            return 5;
+        if (plus >= nan)
+            return 6;
+        if (minus <= nan)
+            return 7;
+        if (minus >= nan)
+            return 8;
+        if (nan >= plus)
+            return 9;
+        if (nan <= plus)
+            return 10;
+
+        if (nan == nan)
+            return 11;
+        return res;
+    }
+
+    static int fibonacci(int n) {
+        if (n == 0) {
+            return 0;
+        } else if (n == 1) {
+            return 1;
+        } else {
+            return fibonacci(n - 1) + fibonacci(n - 2);
+        }
+    }
+
+    /*
+      static void throwNullPointerException() {
+      throw new NullPointerException("first throw");
+      }
+
+      static int throwAndCatch() {
+      try {
+      throwNullPointerException();
+      return 1;
+      } catch (NullPointerException npe) {
+      return 0;
+      }
+      }
+    */
+
+    static int manyArgs(int a0, long a1, int a2, long a3, int a4, long a5,
+                        int a6, int a7, double a8, float a9, double a10, short a11, int a12,
+                        char a13, int a14, int a15, byte a16, boolean a17, int a18, int a19,
+                        long a20, long a21, int a22, int a23, int a24, int a25, int a26)
+    {
+        if (a0 != 0) return 0;
+        if (a1 !=  1L) return 1;
+        if (a2 != 2) return 2;
+        if (a3 != 3L) return 3;
+        if (a4 != 4) return 4;
+        if (a5 != 5L) return 5;
+        if (a6 != 6) return 6;
+        if (a7 != 7) return 7;
+        if (a8 != 8.0) return 8;
+        if (a9 !=  9.0f) return 9;
+        if (a10 != 10.0) return 10;
+        if (a11 != (short)11) return 11;
+        if (a12 != 12) return 12;
+        if (a13 != (char)13) return 13;
+        if (a14 != 14) return 14;
+        if (a15 != 15) return 15;
+        if (a16 != (byte)-16) return 16;
+        if (a17 !=  true) return 17;
+        if (a18 != 18) return 18;
+        if (a19 != 19) return 19;
+        if (a20 !=  20L) return 20;
+        if (a21 != 21L) return 21;
+        if (a22 != 22) return 22;
+        if (a23 != 23) return 23;
+        if (a24 != 24) return 24;
+        if (a25 != 25) return 25;
+        if (a26 != 26) return 26;
+        return -1;
+    }
+
+    int virtualCall(int a)
+    {
+        return a * 2;
+    }
+
+    void setFoo(int a)
+    {
+        foo_ = a;
+    }
+
+    int getFoo()
+    {
+        return foo_;
+    }
+
+    static int staticCall(int a)
+    {
+        IntMath foo = new IntMath();
+        return foo.virtualCall(a);
+    }
+
+    static int testIGetPut(int a)
+    {
+        IntMath foo = new IntMath(99);
+        IntMath foo123 = new IntMath();
+        int z  = foo.getFoo();
+        z += a;
+        z += foo123.getFoo();
+        foo.setFoo(z);
+        return foo.getFoo();
+    }
+
+    public static void main(String[] args) {
+        int res = unopTest(38);
+        if (res == 37) {
+            System.out.printf("unopTest PASSED\n");
+        } else {
+            System.out.printf("unopTest FAILED: %d\n", res);
+        }
+        res = shiftTest1();
+        if (res == 0) {
+            System.out.printf("shiftTest1 PASSED\n");
+        } else {
+            System.out.printf("shiftTest1 FAILED: %d\n", res);
+        }
+        res = shiftTest2();
+        if (res == 0) {
+            System.out.printf("shiftTest2 PASSED\n");
+        } else {
+            System.out.printf("shiftTest2 FAILED: %d\n", res);
+        }
+        res = unsignedShiftTest();
+        if (res == 0) {
+            System.out.printf("unsignedShiftTest PASSED\n");
+        } else {
+            System.out.printf("unsignedShiftTest FAILED: %d\n", res);
+        }
+        res = convTest();
+        if (res == 0) {
+            System.out.printf("convTest PASSED\n");
+        } else {
+            System.out.printf("convTest FAILED: %d\n", res);
+        }
+        res = charSubTest();
+        if (res == 0) {
+            System.out.printf("charSubTest PASSED\n");
+        } else {
+            System.out.printf("charSubTest FAILED: %d\n", res);
+        }
+        res = intOperTest(70000, -3);
+        if (res == 0) {
+            System.out.printf("intOperTest PASSED\n");
+        } else {
+            System.out.printf("intOperTest FAILED: %d\n", res);
+        }
+        res = longOperTest(70000000000L, -3L);
+        if (res == 0) {
+            System.out.printf("longOperTest PASSED\n");
+        } else {
+            System.out.printf("longOperTest FAILED: %d\n", res);
+        }
+        long lres = longShiftTest(0xd5aa96deff00aa01L, 16);
+        if (lres == 0x96deff00aa010000L) {
+            System.out.printf("longShiftTest PASSED\n");
+        } else {
+            System.out.printf("longShiftTest FAILED: %d\n", res);
+        }
+
+        res = switchTest(1);
+        if (res == 1234) {
+            System.out.printf("switchTest PASSED\n");
+        } else {
+            System.out.printf("switchTest FAILED: %d\n", res);
+        }
+
+        res = testIntCompare(-5, 4, 4, 0);
+        if (res == 1111) {
+            System.out.printf("testIntCompare PASSED\n");
+        } else {
+            System.out.printf("testIntCompare FAILED: %d\n", res);
+        }
+
+        res = testLongCompare(-5L, -4294967287L, 4L, 8L);
+        if (res == 2222) {
+            System.out.printf("testLongCompare PASSED\n");
+        } else {
+            System.out.printf("testLongCompare FAILED: %d\n", res);
+        }
+
+        res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
+        if (res == 3333) {
+            System.out.printf("testFloatCompare PASSED\n");
+        } else {
+            System.out.printf("testFloatCompare FAILED: %d\n", res);
+        }
+
+        res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
+        if (res == 4444) {
+            System.out.printf("testDoubleCompare PASSED\n");
+        } else {
+            System.out.printf("testDoubleCompare FAILED: %d\n", res);
+        }
+
+        res = fibonacci(10);
+        if (res == 55) {
+            System.out.printf("fibonacci PASSED\n");
+        } else {
+            System.out.printf("fibonacci FAILED: %d\n", res);
+        }
+
+        /*
+          res = throwAndCatch();
+          if (res == 0) {
+          System.out.printf("throwAndCatch PASSED\n");
+          } else {
+          System.out.printf("throwAndCatch FAILED: %d\n", res);
+          }
+        */
+
+        res = manyArgs(0, 1L, 2, 3L, 4, 5L, 6, 7, 8.0, 9.0f, 10.0,
+                       (short)11, 12, (char)13, 14, 15, (byte)-16, true, 18,
+                       19, 20L, 21L, 22, 23, 24, 25, 26);
+        if (res == -1) {
+            System.out.printf("manyArgs PASSED\n");
+        } else {
+            System.out.printf("manyArgs FAILED: %d\n", res);
+        }
+
+        res = staticCall(3);
+        if (res == 6) {
+            System.out.printf("virtualCall PASSED\n");
+        } else {
+            System.out.printf("virtualCall FAILED: %d\n", res);
+        }
+
+        res = testIGetPut(111);
+        if (res == 333) {
+            System.out.printf("testGetPut PASSED\n");
+        } else {
+            System.out.printf("testGetPut FAILED: %d\n", res);
+        }
+
+        res = staticFieldTest(404);
+        if (res == 1404) {
+            System.out.printf("staticFieldTest PASSED\n");
+        } else {
+            System.out.printf("staticFieldTest FAILED: %d\n", res);
+        }
+    }
+}
diff --git a/test/IntMath/java/lang/Object.java b/test/IntMath/java/lang/Object.java
new file mode 100644
index 0000000..67e54e3
--- /dev/null
+++ b/test/IntMath/java/lang/Object.java
@@ -0,0 +1,5 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+// TODO: remove this when separate compilation works
+package java.lang;
+public class Object {}
diff --git a/test/Interfaces/Interfaces.java b/test/Interfaces/Interfaces.java
new file mode 100644
index 0000000..0b72e92
--- /dev/null
+++ b/test/Interfaces/Interfaces.java
@@ -0,0 +1,16 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Interfaces {
+    interface I {
+        public void i();
+    }
+    interface J {
+        public void j1();
+        public void j2();
+    }
+    class A implements I, J {
+        public void i() {};
+        public void j1() {};
+        public void j2() {};
+    }
+}
diff --git a/test/Main/Main.java b/test/Main/Main.java
new file mode 100644
index 0000000..757d513
--- /dev/null
+++ b/test/Main/Main.java
@@ -0,0 +1,6 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Main {
+    public static void main(String args[]) {
+    }
+}
diff --git a/test/MyClass/MyClass.java b/test/MyClass/MyClass.java
new file mode 100644
index 0000000..7a0ccbc
--- /dev/null
+++ b/test/MyClass/MyClass.java
@@ -0,0 +1,3 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class MyClass {}
diff --git a/test/MyClassNatives/MyClassNatives.java b/test/MyClassNatives/MyClassNatives.java
new file mode 100644
index 0000000..5203e4a
--- /dev/null
+++ b/test/MyClassNatives/MyClassNatives.java
@@ -0,0 +1,11 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class MyClass {
+    native void foo();
+    native int fooI(int x);
+    native int fooII(int x, int y);
+    native double fooDD(double x, double y);
+    native Object fooIOO(int x, Object y, Object z);
+    static native Object fooSIOO(int x, Object y, Object z);
+    static synchronized native Object fooSSIOO(int x, Object y, Object z);
+}
diff --git a/test/Nested/Nested.java b/test/Nested/Nested.java
new file mode 100644
index 0000000..73d9e8a
--- /dev/null
+++ b/test/Nested/Nested.java
@@ -0,0 +1,6 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Nested {
+    class Inner {
+    }
+}
diff --git a/test/ProtoCompare/ProtoCompare.java b/test/ProtoCompare/ProtoCompare.java
new file mode 100644
index 0000000..988e07a
--- /dev/null
+++ b/test/ProtoCompare/ProtoCompare.java
@@ -0,0 +1,8 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class ProtoCompare {
+    int m1(short x, int y, long z) { return x + y + (int)z; }
+    int m2(short x, int y, long z) { return x + y + (int)z; }
+    int m3(long x, int y, short z) { return (int)x + y + z; }
+    long m4(long x, int y, short z) { return x + y + z; }
+}
diff --git a/test/ProtoCompare2/ProtoCompare2.java b/test/ProtoCompare2/ProtoCompare2.java
new file mode 100644
index 0000000..60d1746
--- /dev/null
+++ b/test/ProtoCompare2/ProtoCompare2.java
@@ -0,0 +1,8 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class ProtoCompare2 {
+    int m1(short x, int y, long z) { return x + y + (int)z; }
+    int m2(short x, int y, long z) { return x + y + (int)z; }
+    int m3(long x, int y, short z) { return (int)x + y + z; }
+    long m4(long x, int y, short z) { return x + y + z; }
+}
diff --git a/test/StaticLeafMethods/StaticLeafMethods.java b/test/StaticLeafMethods/StaticLeafMethods.java
new file mode 100644
index 0000000..72aed85
--- /dev/null
+++ b/test/StaticLeafMethods/StaticLeafMethods.java
@@ -0,0 +1,39 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class StaticLeafMethods {
+    static void nop() {
+    }
+    static byte identity(byte x) {
+        return x;
+    }
+    static int identity(int x) {
+        return x;
+    }
+    static int sum(int a, int b) {
+        return a + b;
+    }
+    static int sum(int a, int b, int c) {
+        return a + b + c;
+    }
+    static int sum(int a, int b, int c, int d) {
+        return a + b + c + d;
+    }
+    static int sum(int a, int b, int c, int d, int e) {
+        return a + b + c + d + e;
+    }
+    static double identity(double x) {
+        return x;
+    }
+    static double sum(double a, double b) {
+        return a + b;
+    }
+    static double sum(double a, double b, double c) {
+        return a + b + c;
+    }
+    static double sum(double a, double b, double c, double d) {
+        return a + b + c + d;
+    }
+    static double sum(double a, double b, double c, double d, double e) {
+        return a + b + c + d + e;
+    }
+}
diff --git a/test/Statics/Statics.java b/test/Statics/Statics.java
new file mode 100644
index 0000000..c38447b
--- /dev/null
+++ b/test/Statics/Statics.java
@@ -0,0 +1,14 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Statics {
+    static boolean s0 = true;
+    static byte s1 = 5;
+    static char s2 = 'a';
+    static short s3 = (short) 65000;
+    static int s4 = 2000000000;
+    static long s5 = 0x123456789abcdefL;
+    static float s6 = 0.5f;
+    static double s7 = 16777217;
+    static Object s8 = "android";
+    static Object[] s9 = { "a", "b" };
+}
diff --git a/test/XandY/X.java b/test/XandY/X.java
new file mode 100644
index 0000000..7104ff8
--- /dev/null
+++ b/test/XandY/X.java
@@ -0,0 +1,3 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class X {}
diff --git a/test/XandY/Y.java b/test/XandY/Y.java
new file mode 100644
index 0000000..a40c3ec
--- /dev/null
+++ b/test/XandY/Y.java
@@ -0,0 +1,3 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+class Y extends X {}