/*
 * 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
#define _DALVIK_OO_RESOLVE

/*
 * "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.)
 */
typedef enum MethodType {
    METHOD_UNKNOWN  = 0,
    METHOD_DIRECT,      // <init>, private
    METHOD_STATIC,      // static
    METHOD_VIRTUAL,     // virtual, super
    METHOD_INTERFACE    // interface
} MethodType;

/*
 * 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.
 */
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.
 */
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.
 */
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.
 */
StaticField* dvmResolveStaticField(const ClassObject* referrer, u4 sfieldIdx);

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

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

#endif /*_DALVIK_OO_RESOLVE*/
