132c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray/* 232c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * Copyright (C) 2015 The Android Open Source Project 332c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * 432c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 532c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * you may not use this file except in compliance with the License. 632c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * You may obtain a copy of the License at 732c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * 832c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 932c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * 1032c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 1132c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 1232c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1332c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * See the License for the specific language governing permissions and 1432c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray * limitations under the License. 1532c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray */ 1632c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 1732c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray#include "art_method-inl.h" 1832c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray#include "jni.h" 1932c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray#include "scoped_thread_state_change.h" 2032c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray#include "stack.h" 2132c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray#include "thread.h" 2232c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 2332c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffraynamespace art { 2432c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 2532c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffraynamespace { 2632c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 2705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Markoextern "C" JNIEXPORT jobject JNICALL Java_Main_cloneResolvedMethods(JNIEnv* env, 2805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko jclass, 2905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko jclass cls) { 3032c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray ScopedObjectAccess soa(Thread::Current()); 3105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::Class*>(cls)->GetDexCache(); 3205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t num_methods = dex_cache->NumResolvedMethods(); 3305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod** methods = dex_cache->GetResolvedMethods(); 3405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_EQ(num_methods != 0u, methods != nullptr); 3505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko if (num_methods == 0u) { 3605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return nullptr; 3705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 3805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko jarray array; 3905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko if (sizeof(void*) == 4) { 4005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko array = env->NewIntArray(num_methods); 4105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } else { 4205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko array = env->NewLongArray(num_methods); 4305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 4405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK(array != nullptr); 4505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko mirror::PointerArray* pointer_array = soa.Decode<mirror::PointerArray*>(array); 4605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko for (size_t i = 0; i != num_methods; ++i) { 4705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod* method = mirror::DexCache::GetElementPtrSize(methods, i, sizeof(void*)); 4805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko pointer_array->SetElementPtrSize(i, method, sizeof(void*)); 4905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko } 5005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko return array; 5132c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray} 5232c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 5332c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffrayextern "C" JNIEXPORT void JNICALL Java_Main_restoreResolvedMethods( 5432c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray JNIEnv*, jclass, jclass cls, jobject old_cache) { 5532c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray ScopedObjectAccess soa(Thread::Current()); 5605792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::Class*>(cls)->GetDexCache(); 5705792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t num_methods = dex_cache->NumResolvedMethods(); 5805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod** methods = soa.Decode<mirror::Class*>(cls)->GetDexCache()->GetResolvedMethods(); 5905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_EQ(num_methods != 0u, methods != nullptr); 6032c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray mirror::PointerArray* old = soa.Decode<mirror::PointerArray*>(old_cache); 6105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_EQ(methods != nullptr, old != nullptr); 6205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_EQ(num_methods, static_cast<size_t>(old->GetLength())); 6305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko for (size_t i = 0; i != num_methods; ++i) { 6405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko ArtMethod* method = old->GetElementPtrSize<ArtMethod*>(i, sizeof(void*)); 6505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko mirror::DexCache::SetElementPtrSize(methods, i, method, sizeof(void*)); 6632c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray } 6732c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray} 6832c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 6932c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray} // namespace 7032c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray 7132c9ea5c03b1b22f36233ec6c24eca87c77f9157Nicolas Geoffray} // namespace art 72