1418d20fc407052d4152157f61e7453359f902383Elliott Hughes/* 2418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Copyright (C) 2011 The Android Open Source Project 3418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 4418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5418d20fc407052d4152157f61e7453359f902383Elliott Hughes * you may not use this file except in compliance with the License. 6418d20fc407052d4152157f61e7453359f902383Elliott Hughes * You may obtain a copy of the License at 7418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 8418d20fc407052d4152157f61e7453359f902383Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9418d20fc407052d4152157f61e7453359f902383Elliott Hughes * 10418d20fc407052d4152157f61e7453359f902383Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11418d20fc407052d4152157f61e7453359f902383Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12418d20fc407052d4152157f61e7453359f902383Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13418d20fc407052d4152157f61e7453359f902383Elliott Hughes * See the License for the specific language governing permissions and 14418d20fc407052d4152157f61e7453359f902383Elliott Hughes * limitations under the License. 15418d20fc407052d4152157f61e7453359f902383Elliott Hughes */ 16418d20fc407052d4152157f61e7453359f902383Elliott Hughes 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_REFLECTION_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_REFLECTION_H_ 19418d20fc407052d4152157f61e7453359f902383Elliott Hughes 2068d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers#include "base/mutex.h" 21418d20fc407052d4152157f61e7453359f902383Elliott Hughes#include "jni.h" 226b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#include "primitive.h" 23418d20fc407052d4152157f61e7453359f902383Elliott Hughes 24418d20fc407052d4152157f61e7453359f902383Elliott Hughesnamespace art { 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 26ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom class Class; 27ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom class Object; 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 29c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierclass ArtField; 30e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierclass ArtMethod; 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersunion JValue; 322b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierclass ScopedObjectAccessAlreadyRunnable; 3353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogersclass ShadowFrame; 3400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersmirror::Object* BoxPrimitive(Primitive::Type src_class, const JValue& value) 3690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 37c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierbool UnboxPrimitiveForField(mirror::Object* o, mirror::Class* dst_class, ArtField* f, 3884956ff6c0ff150d86a08157216ded79217d860aIan Rogers JValue* unboxed_value) 3990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 400aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffraybool UnboxPrimitiveForResult(mirror::Object* o, mirror::Class* dst_class, JValue* unboxed_value) 4190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 4200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 430aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas GeoffrayALWAYS_INLINE bool ConvertPrimitiveValue(bool unbox_for_result, 4476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier Primitive::Type src_class, Primitive::Type dst_class, 4576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier const JValue& src, JValue* dst) 4690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 4700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 482b7c4d196c8abe32f4ca633534917da9de53c359Mathieu ChartierJValue InvokeWithVarArgs(const ScopedObjectAccessAlreadyRunnable& soa, jobject obj, jmethodID mid, 492b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartier va_list args) 5090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 5100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 5239b6c24ce68cf05db0f82f454b4401cfb03d675fJeff HaoJValue InvokeWithJValues(const ScopedObjectAccessAlreadyRunnable& soa, jobject obj, jmethodID mid, 5339b6c24ce68cf05db0f82f454b4401cfb03d675fJeff Hao jvalue* args) 5490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 5553b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers 562b7c4d196c8abe32f4ca633534917da9de53c359Mathieu ChartierJValue InvokeVirtualOrInterfaceWithJValues(const ScopedObjectAccessAlreadyRunnable& soa, 5739b6c24ce68cf05db0f82f454b4401cfb03d675fJeff Hao jobject obj, jmethodID mid, jvalue* args) 5890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 5953b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers 602b7c4d196c8abe32f4ca633534917da9de53c359Mathieu ChartierJValue InvokeVirtualOrInterfaceWithVarArgs(const ScopedObjectAccessAlreadyRunnable& soa, 6153b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers jobject obj, jmethodID mid, va_list args) 6290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 6353b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers 64fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier// num_frames is number of frames we look up for access check. 652b7c4d196c8abe32f4ca633534917da9de53c359Mathieu Chartierjobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject method, jobject receiver, 66fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier jobject args, size_t num_frames = 1) 6790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 6853b8b09fc80329539585dcf43657bc5f4ecefdffIan Rogers 69daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu ChartierALWAYS_INLINE bool VerifyObjectIsClass(mirror::Object* o, mirror::Class* c) 7090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 71418d20fc407052d4152157f61e7453359f902383Elliott Hughes 7276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartierbool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_class, 73ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier uint32_t access_flags, mirror::Class** calling_class, size_t num_frames) 7490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 7511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao 76f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartier// This version takes a known calling class. 77f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartierbool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_class, 78f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartier uint32_t access_flags, mirror::Class* calling_class) 7990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 80f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartier 81f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartier// Get the calling class by using a stack visitor, may return null for unattached native threads. 82f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartiermirror::Class* GetCallingClass(Thread* self, size_t num_frames) 8390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 84f36cb5f65cb150151aa40b23937e2b0ad75cc546Mathieu Chartier 85daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiervoid InvalidReceiverError(mirror::Object* o, mirror::Class* c) 8690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 87daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier 8883c81955bfbfe8fbe6daf215ca73e436747e3e60Jeff Haovoid UpdateReference(Thread* self, jobject obj, mirror::Object* result) 8990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 9083c81955bfbfe8fbe6daf215ca73e436747e3e60Jeff Hao 91418d20fc407052d4152157f61e7453359f902383Elliott Hughes} // namespace art 92418d20fc407052d4152157f61e7453359f902383Elliott Hughes 93fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_REFLECTION_H_ 94