From 57d0accc081c1779edb604ab86e5a4c0cfba16eb Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Tue, 11 Jul 2017 17:41:30 -0700 Subject: Create a class loader context starting from an existing ClassLoader Extend ClassLoaderContext to be able to generate a context from an existing class loader. This will be used in extending the duplicate class check to cover DelegateLastClassLoaders. Most of the functionality is migrated from OatFileManager with some cleanups consisting of extra docs and more conservative checks on the integrity of the class loader chain. Test: m test-art-host Bug: 38138251 Change-Id: If7c18cb75bfc9e6784676f96a666bf13b04c8b8b --- runtime/class_loader_utils.h | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 runtime/class_loader_utils.h (limited to 'runtime/class_loader_utils.h') diff --git a/runtime/class_loader_utils.h b/runtime/class_loader_utils.h new file mode 100644 index 0000000000..d160a511de --- /dev/null +++ b/runtime/class_loader_utils.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_CLASS_LOADER_UTILS_H_ +#define ART_RUNTIME_CLASS_LOADER_UTILS_H_ + +#include "handle_scope.h" +#include "mirror/class_loader.h" +#include "scoped_thread_state_change-inl.h" +#include "well_known_classes.h" + +namespace art { + +// Returns true if the given class loader is either a PathClassLoader or a DexClassLoader. +// (they both have the same behaviour with respect to class lockup order) +static bool IsPathOrDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa, + Handle class_loader) + REQUIRES_SHARED(Locks::mutator_lock_) { + mirror::Class* class_loader_class = class_loader->GetClass(); + return + (class_loader_class == + soa.Decode(WellKnownClasses::dalvik_system_PathClassLoader)) || + (class_loader_class == + soa.Decode(WellKnownClasses::dalvik_system_DexClassLoader)); +} + +static bool IsDelegateLastClassLoader(ScopedObjectAccessAlreadyRunnable& soa, + Handle class_loader) + REQUIRES_SHARED(Locks::mutator_lock_) { + mirror::Class* class_loader_class = class_loader->GetClass(); + return class_loader_class == + soa.Decode(WellKnownClasses::dalvik_system_DelegateLastClassLoader); +} + +} // namespace art + +#endif // ART_RUNTIME_CLASS_LOADER_UTILS_H_ -- cgit v1.2.3-59-g8ed1b