/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 * Resolve "constant pool" references into pointers to VM structs.
 */
#ifndef DALVIK_OO_RESOLVE_H_
#define DALVIK_OO_RESOLVE_H_

/*
 * "Direct" and "virtual" methods are stored independently.  The type of call
 * used to invoke the method determines which list we search, and whether
 * we travel up into superclasses.
 *
 * (<clinit>, <init>, and methods declared "private" or "static" are stored
 * in the "direct" list.  All others are stored in the "virtual" list.)
 */
enum MethodType {
    METHOD_UNKNOWN  = 0,
    METHOD_DIRECT,      // <init>, private
    METHOD_STATIC,      // static
    METHOD_VIRTUAL,     // virtual, super
    METHOD_INTERFACE    // interface
};

/*
 * Resolve a class, given the referring class and a constant pool index
 * for the DexTypeId.
 *
 * Does not initialize the class.
 *
 * Throws an exception and returns NULL on failure.
 */
extern "C" ClassObject* dvmResolveClass(const ClassObject* referrer,
                                        u4 classIdx,
                                        bool fromUnverifiedConstant);

/*
 * Resolve a direct, static, or virtual method.
 *
 * Can cause the method's class to be initialized if methodType is
 * METHOD_STATIC.
 *
 * Throws an exception and returns NULL on failure.
 */
extern "C" Method* dvmResolveMethod(const ClassObject* referrer, u4 methodIdx,
                                    MethodType methodType);

/*
 * Resolve an interface method.
 *
 * Throws an exception and returns NULL on failure.
 */
Method* dvmResolveInterfaceMethod(const ClassObject* referrer, u4 methodIdx);

/*
 * Resolve an instance field.
 *
 * Throws an exception and returns NULL on failure.
 */
extern "C" InstField* dvmResolveInstField(const ClassObject* referrer,
                                          u4 ifieldIdx);

/*
 * Resolve a static field.
 *
 * Causes the field's class to be initialized.
 *
 * Throws an exception and returns NULL on failure.
 */
extern "C" StaticField* dvmResolveStaticField(const ClassObject* referrer,
                                              u4 sfieldIdx);

/*
 * Resolve a "const-string" reference.
 *
 * Throws an exception and returns NULL on failure.
 */
extern "C" StringObject* dvmResolveString(const ClassObject* referrer, u4 stringIdx);

/*
 * Return debug string constant for enum.
 */
const char* dvmMethodTypeStr(MethodType methodType);

#endif  // DALVIK_OO_RESOLVE_H_