/*
 * 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);

/*
 * Temporarily "undo" any breakpoints set in a specific method.  Used
 * during verification.
 *
 * Locks the breakpoint set, and leaves it locked.
 */
void dvmUndoBreakpoints(Method* method);

/*
 * "Redo" the breakpoints cleared by a previous "undo", re-inserting the
 * breakpoint opcodes and updating the "original opcode" values.
 *
 * Unlocks the breakpoint set, which must be held by a previous "undo".
 */
void dvmRedoBreakpoints(Method* method);
#endif

#endif /*_DALVIK_INTERP_INTERP*/
