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