1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instanceof, checkcast, etc. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_OO_TYPECHECK 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_OO_TYPECHECK 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* VM startup/shutdown */ 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmInstanceofStartup(void); 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInstanceofShutdown(void); 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* used by dvmInstanceof; don't call */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmInstanceofNonTrivial(const ClassObject* instance, 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const ClassObject* clazz); 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine whether "instance" is an instance of "clazz". 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns 0 (false) if not, 1 (true) if so. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE int dvmInstanceof(const ClassObject* instance, const ClassObject* clazz) 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (instance == clazz) { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (CALC_CACHE_STATS) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project gDvm.instanceofCache->trivial++; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 1; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dvmInstanceofNonTrivial(instance, clazz); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine whether a class implements an interface. 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns 0 (false) if not, 1 (true) if so. 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmImplements(const ClassObject* clazz, const ClassObject* interface); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine whether "sub" is a sub-class of "clazz". 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns 0 (false) if not, 1 (true) if so. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE int dvmIsSubClass(const ClassObject* sub, const ClassObject* clazz) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*printf("###### sub='%s' clazz='%s'\n", sub->name, clazz->name);*/ 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sub == clazz) 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 1; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sub = sub->super; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while (sub != NULL); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine whether or not we can store an object into an array, based 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * on the classes of the two. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns 0 (false) if not, 1 (true) if so. 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCanPutArrayElement(const ClassObject* elemClass, 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const ClassObject* arrayClass); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_OO_TYPECHECK*/ 79