OSDN Git Service

Remove bogus DCHECK.
authorNicolas Geoffray <ngeoffray@google.com>
Tue, 23 Jun 2015 17:16:46 +0000 (18:16 +0100)
committerNicolas Geoffray <ngeoffray@google.com>
Wed, 24 Jun 2015 09:02:22 +0000 (10:02 +0100)
Spotted by running libcore tests with libartd.so. The FindClass
call will throw the exception if the element type is void.

Change-Id: Ic5df7eb6c9934b8e70f7bfdcfe533e5c1ad5c518

runtime/class_linker-inl.h

index df6703c..21b63c6 100644 (file)
@@ -41,7 +41,6 @@ inline mirror::Class* ClassLinker::FindArrayClass(Thread* self, mirror::Class**
       return array_class;
     }
   }
-  DCHECK(!(*element_class)->IsPrimitiveVoid());
   std::string descriptor = "[";
   std::string temp;
   descriptor += (*element_class)->GetDescriptor(&temp);
@@ -49,10 +48,15 @@ inline mirror::Class* ClassLinker::FindArrayClass(Thread* self, mirror::Class**
   Handle<mirror::ClassLoader> class_loader(hs.NewHandle((*element_class)->GetClassLoader()));
   HandleWrapper<mirror::Class> h_element_class(hs.NewHandleWrapper(element_class));
   mirror::Class* array_class = FindClass(self, descriptor.c_str(), class_loader);
-  // Benign races in storing array class and incrementing index.
-  size_t victim_index = find_array_class_cache_next_victim_;
-  find_array_class_cache_[victim_index] = GcRoot<mirror::Class>(array_class);
-  find_array_class_cache_next_victim_ = (victim_index + 1) % kFindArrayCacheSize;
+  if (array_class != nullptr) {
+    // Benign races in storing array class and incrementing index.
+    size_t victim_index = find_array_class_cache_next_victim_;
+    find_array_class_cache_[victim_index] = GcRoot<mirror::Class>(array_class);
+    find_array_class_cache_next_victim_ = (victim_index + 1) % kFindArrayCacheSize;
+  } else {
+    // We should have a NoClassDefFoundError.
+    self->AssertPendingException();
+  }
   return array_class;
 }