ti_class_loader.cc revision 373a9b5c718a45ac484afcf4fe6ce84f4bb562b3
1eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light/* Copyright (C) 2017 The Android Open Source Project 2eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 4eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * This file implements interfaces from the file jvmti.h. This implementation 5eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * is licensed under the same terms as the file jvmti.h. The 6eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * copyright and license information for the file jvmti.h follows. 7eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 8eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 9eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 10eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 11eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * This code is free software; you can redistribute it and/or modify it 12eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * under the terms of the GNU General Public License version 2 only, as 13eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * published by the Free Software Foundation. Oracle designates this 14eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * particular file as subject to the "Classpath" exception as provided 15eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * by Oracle in the LICENSE file that accompanied this code. 16eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 17eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * This code is distributed in the hope that it will be useful, but WITHOUT 18eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 19eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 20eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * version 2 for more details (a copy is included in the LICENSE file that 21eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * accompanied this code). 22eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 23eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * You should have received a copy of the GNU General Public License version 24eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 2 along with this work; if not, write to the Free Software Foundation, 25eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 26eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * 27eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 28eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * or visit www.oracle.com if you need additional information or have any 29eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light * questions. 30eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light */ 31eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 32eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "ti_class_loader.h" 33eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 34eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include <limits> 35eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 36eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "android-base/stringprintf.h" 37eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 38a1d2f957a21319d1110bebb9a52f46fd1c67ffafAndreas Gampe#include "art_field-inl.h" 39eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "art_jvmti.h" 40eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "base/logging.h" 41eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "dex_file.h" 42eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "dex_file_types.h" 43eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "events-inl.h" 44eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "gc/allocation_listener.h" 45eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "gc/heap.h" 46eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "instrumentation.h" 47eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "jit/jit.h" 48eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "jit/jit_code_cache.h" 49eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "jni_env_ext-inl.h" 50eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "jvmti_allocator.h" 51eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "mirror/class.h" 52eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "mirror/class_ext.h" 53eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "mirror/object.h" 54373a9b5c718a45ac484afcf4fe6ce84f4bb562b3Andreas Gampe#include "nativehelper/scoped_local_ref.h" 55eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "object_lock.h" 56eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "runtime.h" 57eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light#include "transform.h" 58eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 59eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Lightnamespace openjdkjvmti { 60eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 61eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Lightbool ClassLoaderHelper::AddToClassLoader(art::Thread* self, 62eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::ClassLoader> loader, 63eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const art::DexFile* dex_file) { 647916f20d9251773a8543f7f15d76ce21110acf96Alex Light art::ScopedObjectAccessUnchecked soa(self); 651babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::StackHandleScope<3> hs(self); 667916f20d9251773a8543f7f15d76ce21110acf96Alex Light if (art::ClassLinker::IsBootClassLoader(soa, loader.Get())) { 677916f20d9251773a8543f7f15d76ce21110acf96Alex Light art::Runtime::Current()->GetClassLinker()->AppendToBootClassPath(self, *dex_file); 687916f20d9251773a8543f7f15d76ce21110acf96Alex Light return true; 697916f20d9251773a8543f7f15d76ce21110acf96Alex Light } 707916f20d9251773a8543f7f15d76ce21110acf96Alex Light art::Handle<art::mirror::Object> java_dex_file_obj( 717916f20d9251773a8543f7f15d76ce21110acf96Alex Light hs.NewHandle(FindSourceDexFileObject(self, loader))); 72eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light if (java_dex_file_obj.IsNull()) { 73eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return false; 74eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 751babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::Handle<art::mirror::LongArray> old_cookie(hs.NewHandle(GetDexFileCookie(java_dex_file_obj))); 76eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::LongArray> cookie(hs.NewHandle( 771babae0f39c30e699f8580b6c28b4186aecdf690Alex Light AllocateNewDexFileCookie(self, old_cookie, dex_file))); 78eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light if (cookie.IsNull()) { 79eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return false; 80eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 81eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ScopedAssertNoThreadSuspension nts("Replacing cookie fields in j.l.DexFile object"); 82eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light UpdateJavaDexFile(java_dex_file_obj.Get(), cookie.Get()); 83eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return true; 84eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light} 85eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 86eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Lightvoid ClassLoaderHelper::UpdateJavaDexFile(art::ObjPtr<art::mirror::Object> java_dex_file, 87eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ObjPtr<art::mirror::LongArray> new_cookie) { 88eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* internal_cookie_field = java_dex_file->GetClass()->FindDeclaredInstanceField( 89eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light "mInternalCookie", "Ljava/lang/Object;"); 90eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* cookie_field = java_dex_file->GetClass()->FindDeclaredInstanceField( 91eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light "mCookie", "Ljava/lang/Object;"); 92eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(internal_cookie_field != nullptr); 93eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ObjPtr<art::mirror::LongArray> orig_internal_cookie( 94eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light internal_cookie_field->GetObject(java_dex_file)->AsLongArray()); 95eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ObjPtr<art::mirror::LongArray> orig_cookie( 96eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light cookie_field->GetObject(java_dex_file)->AsLongArray()); 97eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light internal_cookie_field->SetObject<false>(java_dex_file, new_cookie); 98eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light if (!orig_cookie.IsNull()) { 99eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light cookie_field->SetObject<false>(java_dex_file, new_cookie); 100eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 101eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light} 102eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 1031babae0f39c30e699f8580b6c28b4186aecdf690Alex Lightart::ObjPtr<art::mirror::LongArray> ClassLoaderHelper::GetDexFileCookie( 1041babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::Handle<art::mirror::Object> java_dex_file_obj) { 105eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // mCookie is nulled out if the DexFile has been closed but mInternalCookie sticks around until 106eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // the object is finalized. Since they always point to the same array if mCookie is not null we 107eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // just use the mInternalCookie field. We will update one or both of these fields later. 108eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* internal_cookie_field = java_dex_file_obj->GetClass()->FindDeclaredInstanceField( 109eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light "mInternalCookie", "Ljava/lang/Object;"); 110eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // TODO Add check that mCookie is either null or same as mInternalCookie 111eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(internal_cookie_field != nullptr); 1121babae0f39c30e699f8580b6c28b4186aecdf690Alex Light return internal_cookie_field->GetObject(java_dex_file_obj.Get())->AsLongArray(); 1131babae0f39c30e699f8580b6c28b4186aecdf690Alex Light} 1141babae0f39c30e699f8580b6c28b4186aecdf690Alex Light 1151babae0f39c30e699f8580b6c28b4186aecdf690Alex Lightart::ObjPtr<art::mirror::LongArray> ClassLoaderHelper::AllocateNewDexFileCookie( 1161babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::Thread* self, 1171babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::Handle<art::mirror::LongArray> cookie, 1181babae0f39c30e699f8580b6c28b4186aecdf690Alex Light const art::DexFile* dex_file) { 1191babae0f39c30e699f8580b6c28b4186aecdf690Alex Light art::StackHandleScope<1> hs(self); 120fa4333dcb481e564f54726b4e6f8153612df835eAndreas Gampe CHECK(cookie != nullptr); 121eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK_GE(cookie->GetLength(), 1); 122eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::LongArray> new_cookie( 123eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light hs.NewHandle(art::mirror::LongArray::Alloc(self, cookie->GetLength() + 1))); 124fa4333dcb481e564f54726b4e6f8153612df835eAndreas Gampe if (new_cookie == nullptr) { 125eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light self->AssertPendingOOMException(); 126eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return nullptr; 127eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 128eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Copy the oat-dex field at the start. 129eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light new_cookie->SetWithoutChecks<false>(0, cookie->GetWithoutChecks(0)); 1301babae0f39c30e699f8580b6c28b4186aecdf690Alex Light // This must match the casts in runtime/native/dalvik_system_DexFile.cc:ConvertDexFilesToJavaArray 131eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light new_cookie->SetWithoutChecks<false>( 1321babae0f39c30e699f8580b6c28b4186aecdf690Alex Light 1, static_cast<int64_t>(reinterpret_cast<uintptr_t>(dex_file))); 133eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light new_cookie->Memcpy(2, cookie.Get(), 1, cookie->GetLength() - 1); 134eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return new_cookie.Get(); 135eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light} 136eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 137eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light// TODO This should return the actual source java.lang.DexFile object for the klass being loaded. 138eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Lightart::ObjPtr<art::mirror::Object> ClassLoaderHelper::FindSourceDexFileObject( 139eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Thread* self, art::Handle<art::mirror::ClassLoader> loader) { 140eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const char* dex_path_list_element_array_name = "[Ldalvik/system/DexPathList$Element;"; 141eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const char* dex_path_list_element_name = "Ldalvik/system/DexPathList$Element;"; 142eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const char* dex_file_name = "Ldalvik/system/DexFile;"; 143eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const char* dex_path_list_name = "Ldalvik/system/DexPathList;"; 144eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light const char* dex_class_loader_name = "Ldalvik/system/BaseDexClassLoader;"; 145eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 146eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(!self->IsExceptionPending()); 147eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::StackHandleScope<5> hs(self); 148eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ClassLinker* class_linker = art::Runtime::Current()->GetClassLinker(); 149eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 150eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::ClassLoader> null_loader(hs.NewHandle<art::mirror::ClassLoader>( 151eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light nullptr)); 152eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::Class> base_dex_loader_class(hs.NewHandle(class_linker->FindClass( 153eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light self, dex_class_loader_name, null_loader))); 154eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 155eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Get all the ArtFields so we can look in the BaseDexClassLoader 156eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* path_list_field = base_dex_loader_class->FindDeclaredInstanceField( 157eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light "pathList", dex_path_list_name); 158eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(path_list_field != nullptr); 159eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 160eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* dex_path_list_element_field = 161eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light class_linker->FindClass(self, dex_path_list_name, null_loader) 162eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light ->FindDeclaredInstanceField("dexElements", dex_path_list_element_array_name); 163eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(dex_path_list_element_field != nullptr); 164eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 165eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ArtField* element_dex_file_field = 166eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light class_linker->FindClass(self, dex_path_list_element_name, null_loader) 167eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light ->FindDeclaredInstanceField("dexFile", dex_file_name); 168eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(element_dex_file_field != nullptr); 169eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 170eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Check if loader is a BaseDexClassLoader 171eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::Class> loader_class(hs.NewHandle(loader->GetClass())); 172eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Currently only base_dex_loader is allowed to actually define classes but if this changes in the 173eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // future we should make sure to support all class loader types. 174eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light if (!loader_class->IsSubClass(base_dex_loader_class.Get())) { 175eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light LOG(ERROR) << "The classloader is not a BaseDexClassLoader which is currently the only " 176eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light << "supported class loader type!"; 177eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return nullptr; 178eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 179eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Start navigating the fields of the loader (now known to be a BaseDexClassLoader derivative) 180eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::Object> path_list( 181eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light hs.NewHandle(path_list_field->GetObject(loader.Get()))); 182fa4333dcb481e564f54726b4e6f8153612df835eAndreas Gampe CHECK(path_list != nullptr); 183eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(!self->IsExceptionPending()); 184eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::Handle<art::mirror::ObjectArray<art::mirror::Object>> dex_elements_list(hs.NewHandle( 185eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light dex_path_list_element_field->GetObject(path_list.Get())-> 186eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light AsObjectArray<art::mirror::Object>())); 187eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(!self->IsExceptionPending()); 188fa4333dcb481e564f54726b4e6f8153612df835eAndreas Gampe CHECK(dex_elements_list != nullptr); 189eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light size_t num_elements = dex_elements_list->GetLength(); 190eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // Iterate over the DexPathList$Element to find the right one 191eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light for (size_t i = 0; i < num_elements; i++) { 192eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ObjPtr<art::mirror::Object> current_element = dex_elements_list->Get(i); 193eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light CHECK(!current_element.IsNull()); 194eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // TODO It would be cleaner to put the art::DexFile into the dalvik.system.DexFile the class 195eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // comes from but it is more annoying because we would need to find this class. It is not 196eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // necessary for proper function since we just need to be in front of the classes old dex file 197eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light // in the path. 198eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light art::ObjPtr<art::mirror::Object> first_dex_file( 199eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light element_dex_file_field->GetObject(current_element)); 200eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light if (!first_dex_file.IsNull()) { 201eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return first_dex_file; 202eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 203eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light } 204eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light return nullptr; 205eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light} 206eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light 207eb98b08b22b83aaaf72afac8e22f0108fe62310dAlex Light} // namespace openjdkjvmti 208