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