diff options
-rw-r--r-- | compiler/dex/type_inference_test.cc | 2 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.cc | 6 | ||||
-rw-r--r-- | compiler/driver/compiler_driver_test.cc | 9 | ||||
-rw-r--r-- | compiler/oat_test.cc | 5 | ||||
-rw-r--r-- | compiler/oat_writer.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/builder.h | 4 | ||||
-rw-r--r-- | compiler/optimizing/gvn_test.cc | 8 | ||||
-rw-r--r-- | compiler/optimizing/licm_test.cc | 4 | ||||
-rw-r--r-- | compiler/optimizing/register_allocator_test.cc | 4 | ||||
-rw-r--r-- | oatdump/oatdump.cc | 4 | ||||
-rw-r--r-- | runtime/class_linker-inl.h | 2 | ||||
-rw-r--r-- | runtime/class_linker.cc | 17 | ||||
-rw-r--r-- | runtime/class_linker_test.cc | 4 | ||||
-rw-r--r-- | runtime/dex_file.cc | 30 | ||||
-rw-r--r-- | runtime/gc/reference_queue_test.cc | 6 | ||||
-rw-r--r-- | runtime/handle.h | 10 | ||||
-rw-r--r-- | runtime/interpreter/unstarted_runtime.cc | 11 | ||||
-rw-r--r-- | runtime/native/java_lang_Class.cc | 3 |
18 files changed, 84 insertions, 47 deletions
diff --git a/compiler/dex/type_inference_test.cc b/compiler/dex/type_inference_test.cc index 528a18cc99..e2c0d32f97 100644 --- a/compiler/dex/type_inference_test.cc +++ b/compiler/dex/type_inference_test.cc @@ -253,7 +253,7 @@ class TypeInferenceTest : public testing::Test { &cu_, cu_.class_loader, cu_.class_linker, *cu_.dex_file, nullptr /* code_item not used */, 0u /* class_def_idx not used */, 0u /* method_index not used */, cu_.access_flags, nullptr /* verified_method not used */, - NullHandle<mirror::DexCache>())); + ScopedNullHandle<mirror::DexCache>())); cu_.mir_graph->current_method_ = 0u; code_item_ = static_cast<DexFile::CodeItem*>( cu_.arena.Alloc(sizeof(DexFile::CodeItem), kArenaAllocMisc)); diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 56839f85f9..5630b08054 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -898,8 +898,10 @@ void CompilerDriver::LoadImageClasses(TimingLogger* timings) { *dex_file, Runtime::Current()->GetLinearAlloc()))); Handle<mirror::Class> klass(hs2.NewHandle( - class_linker->ResolveType(*dex_file, exception_type_idx, dex_cache, - NullHandle<mirror::ClassLoader>()))); + class_linker->ResolveType(*dex_file, + exception_type_idx, + dex_cache, + ScopedNullHandle<mirror::ClassLoader>()))); if (klass.Get() == nullptr) { const DexFile::TypeId& type_id = dex_file->GetTypeId(exception_type_idx); const char* descriptor = dex_file->GetTypeDescriptor(type_id); diff --git a/compiler/driver/compiler_driver_test.cc b/compiler/driver/compiler_driver_test.cc index 86f8b823cc..b6abc6e8de 100644 --- a/compiler/driver/compiler_driver_test.cc +++ b/compiler/driver/compiler_driver_test.cc @@ -149,9 +149,14 @@ TEST_F(CompilerDriverTest, AbstractMethodErrorStub) { jobject class_loader; { ScopedObjectAccess soa(Thread::Current()); - CompileVirtualMethod(NullHandle<mirror::ClassLoader>(), "java.lang.Class", "isFinalizable", + CompileVirtualMethod(ScopedNullHandle<mirror::ClassLoader>(), + "java.lang.Class", + "isFinalizable", "()Z"); - CompileDirectMethod(NullHandle<mirror::ClassLoader>(), "java.lang.Object", "<init>", "()V"); + CompileDirectMethod(ScopedNullHandle<mirror::ClassLoader>(), + "java.lang.Object", + "<init>", + "()V"); class_loader = LoadDex("AbstractMethod"); } ASSERT_TRUE(class_loader != nullptr); diff --git a/compiler/oat_test.cc b/compiler/oat_test.cc index 451aa682d6..7b7d46caa2 100644 --- a/compiler/oat_test.cc +++ b/compiler/oat_test.cc @@ -224,8 +224,9 @@ TEST_F(OatTest, WriteRead) { } const char* descriptor = dex_file.GetClassDescriptor(class_def); - mirror::Class* klass = class_linker->FindClass(soa.Self(), descriptor, - NullHandle<mirror::ClassLoader>()); + mirror::Class* klass = class_linker->FindClass(soa.Self(), + descriptor, + ScopedNullHandle<mirror::ClassLoader>()); const OatFile::OatClass oat_class = oat_dex_file->GetOatClass(i); CHECK_EQ(mirror::Class::Status::kStatusNotReady, oat_class.GetStatus()) << descriptor; diff --git a/compiler/oat_writer.cc b/compiler/oat_writer.cc index 2b2f0e8c26..53ac77b40f 100644 --- a/compiler/oat_writer.cc +++ b/compiler/oat_writer.cc @@ -737,7 +737,7 @@ class OatWriter::InitImageMethodVisitor : public OatDexMethodVisitor { *dex_file_, it.GetMemberIndex(), dex_cache, - NullHandle<mirror::ClassLoader>(), + ScopedNullHandle<mirror::ClassLoader>(), nullptr, invoke_type); if (method == nullptr) { diff --git a/compiler/optimizing/builder.h b/compiler/optimizing/builder.h index ca71c32802..73e85bb5e3 100644 --- a/compiler/optimizing/builder.h +++ b/compiler/optimizing/builder.h @@ -80,7 +80,8 @@ class HGraphBuilder : public ValueObject { can_use_baseline_for_string_init_(true), compilation_stats_(nullptr), interpreter_metadata_(nullptr), - dex_cache_(NullHandle<mirror::DexCache>()) {} + null_dex_cache_(), + dex_cache_(null_dex_cache_) {} bool BuildGraph(const DexFile::CodeItem& code); @@ -371,6 +372,7 @@ class HGraphBuilder : public ValueObject { const uint8_t* interpreter_metadata_; // Dex cache for dex_file_. + ScopedNullHandle<mirror::DexCache> null_dex_cache_; Handle<mirror::DexCache> dex_cache_; DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); diff --git a/compiler/optimizing/gvn_test.cc b/compiler/optimizing/gvn_test.cc index de60cf21aa..78cb7d410a 100644 --- a/compiler/optimizing/gvn_test.cc +++ b/compiler/optimizing/gvn_test.cc @@ -28,7 +28,7 @@ namespace art { TEST(GVNTest, LocalFieldElimination) { ArenaPool pool; ArenaAllocator allocator(&pool); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HGraph* graph = CreateGraph(&allocator); HBasicBlock* entry = new (&allocator) HBasicBlock(graph); @@ -113,7 +113,7 @@ TEST(GVNTest, LocalFieldElimination) { TEST(GVNTest, GlobalFieldElimination) { ArenaPool pool; ArenaAllocator allocator(&pool); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HGraph* graph = CreateGraph(&allocator); HBasicBlock* entry = new (&allocator) HBasicBlock(graph); @@ -196,7 +196,7 @@ TEST(GVNTest, GlobalFieldElimination) { TEST(GVNTest, LoopFieldElimination) { ArenaPool pool; ArenaAllocator allocator(&pool); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HGraph* graph = CreateGraph(&allocator); HBasicBlock* entry = new (&allocator) HBasicBlock(graph); @@ -319,7 +319,7 @@ TEST(GVNTest, LoopFieldElimination) { TEST(GVNTest, LoopSideEffects) { ArenaPool pool; ArenaAllocator allocator(&pool); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; static const SideEffects kCanTriggerGC = SideEffects::CanTriggerGC(); diff --git a/compiler/optimizing/licm_test.cc b/compiler/optimizing/licm_test.cc index 2bb769a430..9ad003cc83 100644 --- a/compiler/optimizing/licm_test.cc +++ b/compiler/optimizing/licm_test.cc @@ -107,7 +107,7 @@ TEST_F(LICMTest, FieldHoisting) { BuildLoop(); // Populate the loop with instructions: set/get field with different types. - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HInstruction* get_field = new (&allocator_) HInstanceFieldGet(parameter_, Primitive::kPrimLong, MemberOffset(10), @@ -134,7 +134,7 @@ TEST_F(LICMTest, NoFieldHoisting) { BuildLoop(); // Populate the loop with instructions: set/get field with same types. - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HInstruction* get_field = new (&allocator_) HInstanceFieldGet(parameter_, Primitive::kPrimLong, MemberOffset(10), diff --git a/compiler/optimizing/register_allocator_test.cc b/compiler/optimizing/register_allocator_test.cc index 080f970756..8706854a6a 100644 --- a/compiler/optimizing/register_allocator_test.cc +++ b/compiler/optimizing/register_allocator_test.cc @@ -472,7 +472,7 @@ static HGraph* BuildIfElseWithPhi(ArenaAllocator* allocator, HInstruction** input2) { HGraph* graph = CreateGraph(allocator); HBasicBlock* entry = new (allocator) HBasicBlock(graph); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; graph->AddBlock(entry); graph->SetEntryBlock(entry); HInstruction* parameter = new (allocator) HParameterValue( @@ -624,7 +624,7 @@ static HGraph* BuildFieldReturn(ArenaAllocator* allocator, HInstruction** field, HInstruction** ret) { HGraph* graph = CreateGraph(allocator); - NullHandle<mirror::DexCache> dex_cache; + ScopedNullHandle<mirror::DexCache> dex_cache; HBasicBlock* entry = new (allocator) HBasicBlock(graph); graph->AddBlock(entry); graph->SetEntryBlock(entry); diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 58331296bf..bad928e9e8 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -2380,7 +2380,7 @@ class ImageDumper { static int DumpImage(Runtime* runtime, const char* image_location, OatDumperOptions* options, std::ostream* os) { // Dumping the image, no explicit class loader. - NullHandle<mirror::ClassLoader> null_class_loader; + ScopedNullHandle<mirror::ClassLoader> null_class_loader; options->class_loader_ = &null_class_loader; ScopedObjectAccess soa(Thread::Current()); @@ -2439,7 +2439,7 @@ static int DumpOatWithRuntime(Runtime* runtime, OatFile* oat_file, OatDumperOpti static int DumpOatWithoutRuntime(OatFile* oat_file, OatDumperOptions* options, std::ostream* os) { CHECK(oat_file != nullptr && options != nullptr); // No image = no class loader. - NullHandle<mirror::ClassLoader> null_class_loader; + ScopedNullHandle<mirror::ClassLoader> null_class_loader; options->class_loader_ = &null_class_loader; OatDumper oat_dumper(*oat_file, *options); diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index a5d10b265f..ea1afa8203 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -30,7 +30,7 @@ namespace art { inline mirror::Class* ClassLinker::FindSystemClass(Thread* self, const char* descriptor) { - return FindClass(self, descriptor, NullHandle<mirror::ClassLoader>()); + return FindClass(self, descriptor, ScopedNullHandle<mirror::ClassLoader>()); } inline mirror::Class* ClassLinker::FindArrayClass(Thread* self, mirror::Class** element_class) { diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index b9228f5945..d998d99539 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -1439,8 +1439,12 @@ bool ClassLinker::FindClassInPathClassLoader(ScopedObjectAccessAlreadyRunnable& if (klass != nullptr) { *result = EnsureResolved(self, descriptor, klass); } else { - *result = DefineClass(self, descriptor, hash, NullHandle<mirror::ClassLoader>(), - *pair.first, *pair.second); + *result = DefineClass(self, + descriptor, + hash, + ScopedNullHandle<mirror::ClassLoader>(), + *pair.first, + *pair.second); } if (*result == nullptr) { CHECK(self->IsExceptionPending()) << descriptor; @@ -1565,7 +1569,11 @@ mirror::Class* ClassLinker::FindClass(Thread* self, // The boot class loader, search the boot class path. ClassPathEntry pair = FindInClassPath(descriptor, hash, boot_class_path_); if (pair.second != nullptr) { - return DefineClass(self, descriptor, hash, NullHandle<mirror::ClassLoader>(), *pair.first, + return DefineClass(self, + descriptor, + hash, + ScopedNullHandle<mirror::ClassLoader>(), + *pair.first, *pair.second); } else { // The boot class loader is searched ahead of the application class loader, failures are @@ -5459,7 +5467,8 @@ bool ClassLinker::LinkInterfaceMethods( auto method_array(hs2.NewHandle(iftable->GetMethodArray(i))); ArraySlice<ArtMethod> input_virtual_methods; - Handle<mirror::PointerArray> input_vtable_array = NullHandle<mirror::PointerArray>(); + ScopedNullHandle<mirror::PointerArray> null_handle; + Handle<mirror::PointerArray> input_vtable_array(null_handle); int32_t input_array_length = 0; // TODO Cleanup Needed: In the presence of default methods this optimization is rather dirty diff --git a/runtime/class_linker_test.cc b/runtime/class_linker_test.cc index 387ac0aee2..59a43ee206 100644 --- a/runtime/class_linker_test.cc +++ b/runtime/class_linker_test.cc @@ -855,7 +855,7 @@ TEST_F(ClassLinkerTest, ValidateBoxedTypes) { // Validate that the "value" field is always the 0th field in each of java.lang's box classes. // This lets UnboxPrimitive avoid searching for the field by name at runtime. ScopedObjectAccess soa(Thread::Current()); - NullHandle<mirror::ClassLoader> class_loader; + ScopedNullHandle<mirror::ClassLoader> class_loader; mirror::Class* c; c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Boolean;", class_loader); EXPECT_STREQ("value", c->GetIFieldsPtr()->At(0).GetName()); @@ -1101,7 +1101,7 @@ TEST_F(ClassLinkerTest, ClassRootDescriptors) { TEST_F(ClassLinkerTest, ValidatePredefinedClassSizes) { ScopedObjectAccess soa(Thread::Current()); - NullHandle<mirror::ClassLoader> class_loader; + ScopedNullHandle<mirror::ClassLoader> class_loader; mirror::Class* c; c = class_linker_->FindClass(soa.Self(), "Ljava/lang/Class;", class_loader); diff --git a/runtime/dex_file.cc b/runtime/dex_file.cc index 880d3e0dea..bc8ba97a22 100644 --- a/runtime/dex_file.cc +++ b/runtime/dex_file.cc @@ -1383,8 +1383,11 @@ mirror::Class* DexFile::GetDeclaringClass(Handle<mirror::Class> klass) const { if (annotation_item == nullptr) { return nullptr; } - mirror::Object* obj = GetAnnotationValue( - klass, annotation_item, "value", NullHandle<mirror::Class>(), kDexAnnotationType); + mirror::Object* obj = GetAnnotationValue(klass, + annotation_item, + "value", + ScopedNullHandle<mirror::Class>(), + kDexAnnotationType); if (obj == nullptr) { return nullptr; } @@ -1410,8 +1413,11 @@ mirror::Class* DexFile::GetEnclosingClass(Handle<mirror::Class> klass) const { return nullptr; } AnnotationValue annotation_value; - if (!ProcessAnnotationValue( - klass, &annotation, &annotation_value, NullHandle<mirror::Class>(), kAllRaw)) { + if (!ProcessAnnotationValue(klass, + &annotation, + &annotation_value, + ScopedNullHandle<mirror::Class>(), + kAllRaw)) { return nullptr; } if (annotation_value.type_ != kDexAnnotationMethod) { @@ -1439,7 +1445,7 @@ mirror::Object* DexFile::GetEnclosingMethod(Handle<mirror::Class> klass) const { return nullptr; } return GetAnnotationValue( - klass, annotation_item, "value", NullHandle<mirror::Class>(), kDexAnnotationMethod); + klass, annotation_item, "value", ScopedNullHandle<mirror::Class>(), kDexAnnotationMethod); } bool DexFile::GetInnerClass(Handle<mirror::Class> klass, mirror::String** name) const { @@ -1457,8 +1463,11 @@ bool DexFile::GetInnerClass(Handle<mirror::Class> klass, mirror::String** name) return false; } AnnotationValue annotation_value; - if (!ProcessAnnotationValue( - klass, &annotation, &annotation_value, NullHandle<mirror::Class>(), kAllObjects)) { + if (!ProcessAnnotationValue(klass, + &annotation, + &annotation_value, + ScopedNullHandle<mirror::Class>(), + kAllObjects)) { return false; } if (annotation_value.type_ != kDexAnnotationNull && @@ -1484,8 +1493,11 @@ bool DexFile::GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags) c return false; } AnnotationValue annotation_value; - if (!ProcessAnnotationValue( - klass, &annotation, &annotation_value, NullHandle<mirror::Class>(), kAllRaw)) { + if (!ProcessAnnotationValue(klass, + &annotation, + &annotation_value, + ScopedNullHandle<mirror::Class>(), + kAllRaw)) { return false; } if (annotation_value.type_ != kDexAnnotationInt) { diff --git a/runtime/gc/reference_queue_test.cc b/runtime/gc/reference_queue_test.cc index ab921d95f1..dc23afed1d 100644 --- a/runtime/gc/reference_queue_test.cc +++ b/runtime/gc/reference_queue_test.cc @@ -35,7 +35,7 @@ TEST_F(ReferenceQueueTest, EnqueueDequeue) { ASSERT_EQ(queue.GetLength(), 0U); auto ref_class = hs.NewHandle( Runtime::Current()->GetClassLinker()->FindClass(self, "Ljava/lang/ref/WeakReference;", - NullHandle<mirror::ClassLoader>())); + ScopedNullHandle<mirror::ClassLoader>())); ASSERT_TRUE(ref_class.Get() != nullptr); auto ref1(hs.NewHandle(ref_class->AllocObject(self)->AsReference())); ASSERT_TRUE(ref1.Get() != nullptr); @@ -65,11 +65,11 @@ TEST_F(ReferenceQueueTest, Dump) { queue.Dump(LOG(INFO)); auto weak_ref_class = hs.NewHandle( Runtime::Current()->GetClassLinker()->FindClass(self, "Ljava/lang/ref/WeakReference;", - NullHandle<mirror::ClassLoader>())); + ScopedNullHandle<mirror::ClassLoader>())); ASSERT_TRUE(weak_ref_class.Get() != nullptr); auto finalizer_ref_class = hs.NewHandle( Runtime::Current()->GetClassLinker()->FindClass(self, "Ljava/lang/ref/FinalizerReference;", - NullHandle<mirror::ClassLoader>())); + ScopedNullHandle<mirror::ClassLoader>())); ASSERT_TRUE(finalizer_ref_class.Get() != nullptr); auto ref1(hs.NewHandle(weak_ref_class->AllocObject(self)->AsReference())); ASSERT_TRUE(ref1.Get() != nullptr); diff --git a/runtime/handle.h b/runtime/handle.h index f939ec5018..5b3bb60dfa 100644 --- a/runtime/handle.h +++ b/runtime/handle.h @@ -64,7 +64,7 @@ class Handle : public ValueObject { ALWAYS_INLINE jobject ToJObject() const SHARED_REQUIRES(Locks::mutator_lock_) { if (UNLIKELY(reference_->AsMirrorPtr() == nullptr)) { - // Special case so that we work with NullHandles. + // Special case so that we work with null handles. return nullptr; } return reinterpret_cast<jobject>(reference_); @@ -147,12 +147,12 @@ class MutableHandle : public Handle<T> { template<size_t kNumReferences> friend class StackHandleScope; }; -// A special case of Handle that only holds references to null. +// A special case of Handle that only holds references to null. Invalid when if it goes out of +// scope. Example: Handle<T> h = ScopedNullHandle<T> will leave h being undefined. template<class T> -class NullHandle : public Handle<T> { +class ScopedNullHandle : public Handle<T> { public: - NullHandle() : Handle<T>(&null_ref_) { - } + ScopedNullHandle() : Handle<T>(&null_ref_) {} private: StackReference<mirror::Object> null_ref_; diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc index 92b6e4fe0d..60ad0cbb10 100644 --- a/runtime/interpreter/unstarted_runtime.cc +++ b/runtime/interpreter/unstarted_runtime.cc @@ -128,8 +128,13 @@ void UnstartedRuntime::UnstartedClassForName( } StackHandleScope<1> hs(self); Handle<mirror::String> h_class_name(hs.NewHandle(class_name)); - UnstartedRuntimeFindClass(self, h_class_name, NullHandle<mirror::ClassLoader>(), result, - "Class.forName", true, false); + UnstartedRuntimeFindClass(self, + h_class_name, + ScopedNullHandle<mirror::ClassLoader>(), + result, + "Class.forName", + true, + false); CheckExceptionGenerateClassNotFound(self); } @@ -704,7 +709,7 @@ void UnstartedRuntime::UnstartedSecurityGetSecurityPropertiesReader( Handle<mirror::Class> h_class(hs.NewHandle( runtime->GetClassLinker()->FindClass(self, "Ljava/io/StringReader;", - NullHandle<mirror::ClassLoader>()))); + ScopedNullHandle<mirror::ClassLoader>()))); if (h_class.Get() == nullptr) { AbortTransactionOrFail(self, "Could not find StringReader class"); return; diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index 14d284e003..19774811bc 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -653,7 +653,8 @@ static jobject Class_newInstance(JNIEnv* env, jobject javaThis) { } } auto* constructor = klass->GetDeclaredConstructor( - soa.Self(), NullHandle<mirror::ObjectArray<mirror::Class>>()); + soa.Self(), + ScopedNullHandle<mirror::ObjectArray<mirror::Class>>()); if (UNLIKELY(constructor == nullptr)) { soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;", "%s has no zero argument constructor", |