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 {}
