Fill in empty iftable early

Previously it would not get filled in and remain null for some
erroneous classes. This caused crashes for things like
GetIfTableCount.

Added regression test (sample failure):
class_linker_test F 12-15 14:20:09 28771 28771 class-inl.h:532] Check failed: ret != nullptr java.lang.Class<Erroneous>

Bug: 33650297
Bug: 33642884

Test: test-art-host

Change-Id: I506210bad17d6d2c58ca7870165f8a4a514f64fe
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 6565f6b..a66479b 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -2663,6 +2663,8 @@
 
   ObjectLock<mirror::Class> lock(self, klass);
   klass->SetClinitThreadId(self->GetTid());
+  // Make sure we have a valid empty iftable even if there are errors.
+  klass->SetIfTable(GetClassRoot(kJavaLangObject)->GetIfTable());
 
   // Add the newly loaded class to the loaded classes table.
   ObjPtr<mirror::Class> existing = InsertClass(descriptor, klass.Get(), hash);
diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc
index 685677b..b83cf16 100644
--- a/runtime/class_linker_test.cc
+++ b/runtime/class_linker_test.cc
@@ -1175,6 +1175,24 @@
   EXPECT_TRUE(init->IsInitialized());
 }
 
+TEST_F(ClassLinkerTest, ErroneousClass) {
+  ScopedObjectAccess soa(Thread::Current());
+  jobject jclass_loader = LoadMultiDex("ErroneousA", "ErroneousB");
+  StackHandleScope<1> hs(soa.Self());
+  Handle<mirror::ClassLoader> class_loader(
+      hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
+  hs.Self()->AssertNoPendingException();
+  const char* descriptor = "LErroneous;";
+  ObjPtr<mirror::Class> klass = class_linker_->FindClass(soa.Self(), descriptor, class_loader);
+  // Erronenous since we are extending final class.
+  hs.Self()->AssertPendingException();
+  EXPECT_TRUE(klass == nullptr);
+  klass = class_linker_->LookupClass(soa.Self(), descriptor, class_loader.Get());
+  EXPECT_FALSE(klass == nullptr);
+  EXPECT_TRUE(klass->IsErroneous());
+  EXPECT_TRUE(klass->GetIfTable() != nullptr);
+}
+
 TEST_F(ClassLinkerTest, FinalizableBit) {
   ScopedObjectAccess soa(Thread::Current());
   mirror::Class* c;