Add unit test for exercising AbstractMethodErrorStub code.
Change-Id: I6021459a75681c92a40931f591852e974f1ca1a6
diff --git a/build/Android.common.mk b/build/Android.common.mk
index 94b0fbc..ffa2636 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -178,6 +178,7 @@
# subdirectories of test/
TEST_DEX_DIRECTORIES := \
+ AbstractMethod \
AllFields \
CreateMethodDescriptor \
Fibonacci \
diff --git a/src/compiler.cc b/src/compiler.cc
index fb510bb..fa9867d 100644
--- a/src/compiler.cc
+++ b/src/compiler.cc
@@ -17,6 +17,7 @@
typedef void (*ThrowAme)(Method*, Thread*);
void ThrowAbstractMethodError(Method* method, Thread* thread) {
+ LOG(FATAL) << "Unimplemented Exception Handling. Remove this when ThrowException works.";
thread->ThrowNewException("Ljava/lang/AbstractMethodError",
"abstract method \"%s\"",
PrettyMethod(method).c_str());
diff --git a/src/compiler_test.cc b/src/compiler_test.cc
index 884f7a7..2a145f8 100644
--- a/src/compiler_test.cc
+++ b/src/compiler_test.cc
@@ -21,7 +21,7 @@
void AssertStaticIntMethod(jint expected, const ClassLoader* class_loader,
const char* class_name, const char* method, const char* signature,
...) {
- EnsureCompiled(class_loader, class_name, method, signature);
+ EnsureCompiled(class_loader, class_name, method, signature, false);
#if defined(__arm__)
va_list args;
va_start(args, signature);
@@ -35,7 +35,7 @@
void AssertStaticLongMethod(jlong expected, const ClassLoader* class_loader,
const char* class_name, const char* method, const char* signature,
...) {
- EnsureCompiled(class_loader, class_name, method, signature);
+ EnsureCompiled(class_loader, class_name, method, signature, false);
#if defined(__arm__)
va_list args;
va_start(args, signature);
@@ -52,12 +52,16 @@
}
void EnsureCompiled(const ClassLoader* class_loader,
- const char* class_name, const char* method, const char* signature) {
+ const char* class_name, const char* method, const char* signature, bool is_virtual) {
CompileAll(class_loader);
env_ = Thread::Current()->GetJniEnv();
class_ = env_->FindClass(class_name);
CHECK(class_ != NULL) << "Class not found: " << class_name;
- mid_ = env_->GetStaticMethodID(class_, method, signature);
+ if (is_virtual) {
+ mid_ = env_->GetMethodID(class_, method, signature);
+ } else {
+ mid_ = env_->GetStaticMethodID(class_, method, signature);
+ }
CHECK(mid_ != NULL) << "Method not found: " << class_name << "." << method << signature;
}
@@ -168,6 +172,22 @@
AssertStaticIntMethod(55, LoadDex("Fibonacci"), "Fibonacci", "fibonacci", "(I)I", 10);
}
+TEST_F(CompilerTest, DISABLED_AbstractMethodErrorStub) {
+ const ClassLoader* class_loader = LoadDex("AbstractMethod");
+ EnsureCompiled(class_loader, "AbstractMethod", "callme", "()V", true);
+
+ // Create a jobj_ of class "B", NOT class "AbstractMethod".
+ jclass b_class = env_->FindClass("B");
+ jmethodID constructor = env_->GetMethodID(b_class, "<init>", "()V");
+ jobject jobj_ = env_->NewObject(b_class, constructor);
+ ASSERT_TRUE(jobj_ != NULL);
+
+#if defined(__arm__)
+ // Will throw AbstractMethodError exception.
+ env_->CallNonvirtualVoidMethod(jobj_, class_, mid_);
+#endif // __arm__
+}
+
// TODO: need stub for InstanceofNonTrivialFromCode
TEST_F(CompilerTest, InstanceTest) {
CompileDirectMethod(NULL, "java.lang.Object", "<init>", "()V");
diff --git a/test/AbstractMethod/AbstractMethod.java b/test/AbstractMethod/AbstractMethod.java
new file mode 100644
index 0000000..f40e9a9
--- /dev/null
+++ b/test/AbstractMethod/AbstractMethod.java
@@ -0,0 +1,14 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+abstract class AbstractMethod {
+ abstract void callme();
+
+ public AbstractMethod() {
+ }
+}
+
+class B extends AbstractMethod {
+ void callme() {
+ System.out.println("B's implementation of callme");
+ }
+}