/*
 * 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.
 */

/*
 * Dalvik interpreter public definitions.
 */
#ifndef _DALVIK_INTERP_INTERP
#define _DALVIK_INTERP_INTERP

/*
 * Interpreter entry point.  Call here after setting up the interpreted
 * stack (most code will want to get here via dvmCallMethod().)
 */
void dvmInterpret(Thread* thread, const Method* method, JValue* pResult);

/*
 * Throw an exception for a problem detected by the verifier.
 *
 * This is called from the handler for the throw-verification-error
 * instruction.  "method" is the method currently being executed.
 */
void dvmThrowVerificationError(const Method* method, int kind, int ref);

/*
 * One-time initialization and shutdown.
 */
bool dvmBreakpointStartup(void);
void dvmBreakpointShutdown(void);

/*
 * Breakpoint implementation.
 */
void dvmInitBreakpoints();
void dvmAddBreakAddr(Method* method, unsigned int instrOffset);
void dvmClearBreakAddr(Method* method, unsigned int instrOffset);
bool dvmAddSingleStep(Thread* thread, int size, int depth);
void dvmClearSingleStep(Thread* thread);

#ifdef WITH_DEBUGGER
/*
 * Recover the opcode that was replaced by a breakpoint.
 */
u1 dvmGetOriginalOpCode(const u2* addr);

/*
 * Flush any breakpoints associated with methods in "clazz".
 */
void dvmFlushBreakpoints(ClassObject* clazz);
#endif

#endif /*_DALVIK_INTERP_INTERP*/
