Add "class Throwable" and rewrite exception throwing to use JNI.
Change-Id: I79836075337eedfc5923ebff028176615ffd3598
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 7d5a447..ce08b1b 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -243,9 +243,7 @@
EXPECT_EQ(1U, inner->NumDirectMethods());
}
-TEST_F(ClassLinkerTest, FindClass) {
- ClassLinker* linker = class_linker_;
-
+TEST_F(ClassLinkerTest, FindClass_Primitives) {
StringPiece expected = "BCDFIJSZV";
for (int ch = 0; ch < 255; ch++) {
char* s = reinterpret_cast<char*>(&ch);
@@ -256,8 +254,10 @@
AssertPrimitiveClass(descriptor);
}
}
+}
- Class* JavaLangObject = linker->FindSystemClass("Ljava/lang/Object;");
+TEST_F(ClassLinkerTest, FindClass) {
+ Class* JavaLangObject = class_linker_->FindSystemClass("Ljava/lang/Object;");
ASSERT_TRUE(JavaLangObject != NULL);
ASSERT_TRUE(JavaLangObject->GetClass() != NULL);
ASSERT_EQ(JavaLangObject->GetClass(), JavaLangObject->GetClass()->GetClass());
@@ -283,11 +283,10 @@
EXPECT_EQ(0U, JavaLangObject->NumStaticFields());
EXPECT_EQ(0U, JavaLangObject->NumInterfaces());
-
scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassDex, "kMyClassDex"));
PathClassLoader* class_loader = AllocPathClassLoader(dex.get());
AssertNonExistentClass("LMyClass;");
- Class* MyClass = linker->FindClass("LMyClass;", class_loader);
+ Class* MyClass = class_linker_->FindClass("LMyClass;", class_loader);
ASSERT_TRUE(MyClass != NULL);
ASSERT_TRUE(MyClass->GetClass() != NULL);
ASSERT_EQ(MyClass->GetClass(), MyClass->GetClass()->GetClass());
@@ -343,6 +342,14 @@
EXPECT_TRUE(string->GetInstanceField(2)->GetName()->Equals("offset"));
EXPECT_TRUE(string->GetInstanceField(3)->GetName()->Equals("count"));
+ Class* throwable = class_linker_->FindSystemClass( "Ljava/lang/Throwable;");
+ ASSERT_EQ(5U, throwable->NumInstanceFields());
+ EXPECT_TRUE(throwable->GetInstanceField(0)->GetName()->Equals("cause"));
+ EXPECT_TRUE(throwable->GetInstanceField(1)->GetName()->Equals("detailMessage"));
+ EXPECT_TRUE(throwable->GetInstanceField(2)->GetName()->Equals("stackState"));
+ EXPECT_TRUE(throwable->GetInstanceField(3)->GetName()->Equals("stackTrace"));
+ EXPECT_TRUE(throwable->GetInstanceField(4)->GetName()->Equals("suppressedExceptions"));
+
Class* accessible_object = class_linker_->FindSystemClass("Ljava/lang/reflect/AccessibleObject;");
ASSERT_EQ(1U, accessible_object->NumInstanceFields());
EXPECT_TRUE(accessible_object->GetInstanceField(0)->GetName()->Equals("flag"));