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 */
16d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFadden
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Exception handling.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_EXCEPTION_H_
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_EXCEPTION_H_
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
249807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * Create a Throwable and throw an exception in the current thread (where
259807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * "throwing" just means "set the thread's exception pointer").
269807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein *
279807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * "msg" and/or "cause" may be NULL.
289807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein *
299807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * If we have a bad exception hierarchy -- something in Throwable.<init>
309807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * is missing -- then every attempt to throw an exception will result
319807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * in another exception.  Exceptions are generally allowed to "chain"
329807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * to other exceptions, so it's hard to auto-detect this problem.  It can
339807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * only happen if the system classes are broken, so it's probably not
349807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * worth spending cycles to detect it.
359807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein *
369807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * We do have one case to worry about: if the classpath is completely
379807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * wrong, we'll go into a death spin during startup because we can't find
389807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * the initial class and then we can't find NoClassDefFoundError.  We have
399807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * to handle this case.
4074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
410b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornsteinvoid dvmThrowChainedException(ClassObject* exceptionClass,
4274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* msg, Object* cause);
430b8b293f228b3d341054bc1fad8a92d6e533b4ddDan BornsteinINLINE void dvmThrowException(ClassObject* exceptionClass,
4474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* msg)
4574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
460b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein    dvmThrowChainedException(exceptionClass, msg, NULL);
4774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
4874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
4974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
500b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein * Like dvmThrowException, but takes printf-style args for the message.
516d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein */
520b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornsteinvoid dvmThrowExceptionFmtV(ClassObject* exceptionClass,
536d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    const char* fmt, va_list args);
540b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornsteinvoid dvmThrowExceptionFmt(ClassObject* exceptionClass,
556d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    const char* fmt, ...)
566d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein#if defined(__GNUC__)
576d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    __attribute__ ((format(printf, 2, 3)))
586d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein#endif
596d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    ;
600b8b293f228b3d341054bc1fad8a92d6e533b4ddDan BornsteinINLINE void dvmThrowExceptionFmt(ClassObject* exceptionClass,
616d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    const char* fmt, ...)
626d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein{
636d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    va_list args;
646d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    va_start(args, fmt);
650b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein    dvmThrowExceptionFmtV(exceptionClass, fmt, args);
666d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein    va_end(args);
676d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein}
686d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein
696d167a4b02f310700a55fc9a24fccce999e0fdf2Dan Bornstein/*
700b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein * Like dvmThrowChainedException, but take a class object
719807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * instead of a name and turn the given message into the
729807b4e9412a6ce6863688c84a36ce294028ff04Dan Bornstein * human-readable form for a descriptor.
7374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
740b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornsteinvoid dvmThrowChainedExceptionWithClassMessage(
75a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein    ClassObject* exceptionClass, const char* messageDescriptor,
76a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein    Object* cause);
7774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
7874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
790b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein * Like dvmThrowException, but take a class object instead of a name
8074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * and turn the given message into the human-readable form for a descriptor.
8174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
820b8b293f228b3d341054bc1fad8a92d6e533b4ddDan BornsteinINLINE void dvmThrowExceptionWithClassMessage(
83a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein    ClassObject* exceptionClass, const char* messageDescriptor)
84a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein{
850b8b293f228b3d341054bc1fad8a92d6e533b4ddDan Bornstein    dvmThrowChainedExceptionWithClassMessage(exceptionClass,
86a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein            messageDescriptor, NULL);
87a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein}
8874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
8974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
9074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Return the exception being thrown in the current thread, or NULL if
9174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * no exception is pending.
9274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
9374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE Object* dvmGetException(Thread* self) {
9474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return self->exception;
9574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
9674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
9774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
9874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Set the exception being thrown in the current thread.
9974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
10074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmSetException(Thread* self, Object* exception)
10174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
10274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    assert(exception != NULL);
10374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    self->exception = exception;
10474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
10574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
10674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
10774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Clear the pending exception.
10874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
10974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * (We use this rather than "set(null)" because we may need to have special
11074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * fixups here for StackOverflowError stuff.  Calling "clear" in the code
11174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * makes it obvious.)
1120016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes */
11374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmClearException(Thread* self) {
11474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    self->exception = NULL;
11574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
11674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
11774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
11874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Clear the pending exception.  Used by the optimization and verification
11974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * code, which has to run with "initializing" set to avoid going into a
12074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * death-spin if the "class not found" exception can't be found.
12174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
12274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmClearOptException(Thread* self);
12374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
12474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
12574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns "true" if an exception is pending.  Use this if you have a
12674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * "self" pointer.
12774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
12874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE bool dvmCheckException(Thread* self) {
12974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (self->exception != NULL);
13074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
13174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
13274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
13374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns "true" if this is a "checked" exception, i.e. it's a subclass
13474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * of Throwable (assumed) but not a subclass of RuntimeException or Error.
13574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
13674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinbool dvmIsCheckedException(const Object* exception);
13774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
13874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
13974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Wrap the now-pending exception in a different exception.
14074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
14174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * If something fails, an (unchecked) exception related to that failure
14274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * will be pending instead.
14374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
14474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmWrapException(const char* newExcepStr);
14574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
14674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
14774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Get the "cause" field from an exception.
14874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
14974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns NULL if the field is null or uninitialized.
15074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
15174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinObject* dvmGetExceptionCause(const Object* exception);
15274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
15374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
15474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print the exception stack trace on stderr.  Calls the exception's
15574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * print function.
15674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
15774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmPrintExceptionStackTrace(void);
15874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
15974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
16074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print the exception stack trace to the log file.  The exception stack
16174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * trace is computed within the VM.
16274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
16374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmLogExceptionStackTrace(void);
16474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
16574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
16674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Search for a catch block that matches "exception".
16774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
16874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * "*newFrame" gets a copy of the new frame pointer.
16974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
17074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * If "doUnroll" is set, we unroll "thread"s stack as we go (and update
17130bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee * self->interpSave.curFrame with the same value as in *newFrame).
17274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
17374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns the offset to the catch code on success, or -1 if we couldn't
17474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * find a catcher.
17574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
176d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" int dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
17774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    bool doUnroll, void** newFrame);
17874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
17974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
18074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Support for saving exception stack traces and converting them to
18174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * usable form.  Use the "FillIn" function to generate a compact array
18274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * that represents the stack frames, then "GetStackTrace" to convert it
18374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * to an array of StackTraceElement objects.
18474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
18574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Don't call the "Internal" form of the function directly.
18674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
1876b1f9f877b70fcc5375fa33a445ac84777757eb2Brian Carlstromvoid* dvmFillInStackTraceInternal(Thread* thread, bool wantObject, size_t* pCount);
18874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/* return an [I for use by interpreted code */
18974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE Object* dvmFillInStackTrace(Thread* thread) {
19074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (Object*) dvmFillInStackTraceInternal(thread, true, NULL);
19174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
19274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinArrayObject* dvmGetStackTrace(const Object* stackState);
19374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/* return an int* and array count; caller must free() the return value */
1946b1f9f877b70fcc5375fa33a445ac84777757eb2Brian CarlstromINLINE int* dvmFillInStackTraceRaw(Thread* thread, size_t* pCount) {
19574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (int*) dvmFillInStackTraceInternal(thread, false, pCount);
19674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
1976b1f9f877b70fcc5375fa33a445ac84777757eb2Brian CarlstromArrayObject* dvmGetStackTraceRaw(const int* intVals, size_t stackDepth);
1986b1f9f877b70fcc5375fa33a445ac84777757eb2Brian Carlstromvoid dvmFillStackTraceElements(const int* intVals, size_t stackDepth, ArrayObject* steArray);
19974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
20074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
20174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print a formatted version of a raw stack trace to the log file.
20274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
20374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmLogRawStackTrace(const int* intVals, int stackDepth);
204d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
205d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
206d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an AbstractMethodError in the current thread, with the given detail
207d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
208d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
209d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowAbstractMethodError(const char* msg);
210d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
211d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
212d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an ArithmeticException in the current thread, with the given detail
213d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
214d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
215d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowArithmeticException(const char* msg);
216d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
21763644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes/*
21874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw an ArrayIndexOutOfBoundsException in the current thread,
21947f58250c5177adba475b0b11a36151ac0ce9ab9Dan Bornstein * using the given array length and index in the detail message.
22074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
221d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowArrayIndexOutOfBoundsException(int length, int index);
22274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
22374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
22463644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes * Throw an ArrayStoreException in the current thread, using the given classes'
22561f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * names in the detail message, indicating that an object of the given type
22661f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * can't be stored into an array of the given type.
22761f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein */
228d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowArrayStoreExceptionIncompatibleElement(ClassObject* objectType, ClassObject* arrayType);
22961f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein
23061f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein/*
23161f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * Throw an ArrayStoreException in the current thread, using the given
23261f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * class name and argument label in the detail message, indicating
23361f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * that it is not an array.
23461f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein */
23561f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornsteinvoid dvmThrowArrayStoreExceptionNotArray(ClassObject* actual, const char* label);
23661f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein
23761f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein/*
23861f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * Throw an ArrayStoreException in the current thread, using the given
23961f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * classes' names in the detail message, indicating that the arrays
24061f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * aren't compatible (for copying contents).
24161f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein */
24261f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornsteinvoid dvmThrowArrayStoreExceptionIncompatibleArrays(ClassObject* source, ClassObject* destination);
24361f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein
24461f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein/*
24561f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * Throw an ArrayStoreException in the current thread, using the given
24661f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * index and classes' names in the detail message, indicating that the
24761f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * object at the given index and of the given type cannot be stored
24861f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein * into an array of the given type.
24963644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes */
25061f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornsteinvoid dvmThrowArrayStoreExceptionIncompatibleArrayElement(s4 index, ClassObject* objectType,
25161f4c7e40b885ccb0a55d9553f07a888469621dcDan Bornstein        ClassObject* arrayType);
2520016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes
253c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes/**
254c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * Throw a ClassCastException in the current thread, using the given classes'
255c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * names in the detail message.
256c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes */
257d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowClassCastException(ClassObject* actual, ClassObject* desired);
258c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes
259d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
26070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a ClassCircularityError in the current thread, with the
26170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * human-readable form of the given descriptor as the detail message.
26270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
26370b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowClassCircularityError(const char* descriptor);
26470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
26570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
26670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a ClassFormatError in the current thread, with the given
26770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * detail message.
26870b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
26970b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowClassFormatError(const char* msg);
27070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
27170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
272d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a ClassNotFoundException in the current thread, with the given
2739b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * class name as the detail message.
2749b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein */
2759b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornsteinvoid dvmThrowClassNotFoundException(const char* name);
2769b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein
2779b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein/**
2789b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * Throw a ClassNotFoundException in the current thread, with the given
2799b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * cause, and the given class name as the detail message.
2809b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein */
2819b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornsteinvoid dvmThrowChainedClassNotFoundException(const char* name, Object* cause);
2829b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein
2839b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein/*
2849b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * Throw the VM-spec-mandated error when an exception is thrown during
2859b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * class initialization. Unlike other helper functions, this automatically
2869b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornstein * wraps the current thread's pending exception.
287d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
2889b598e34e2401bda77fca9c8f3a5c50e882e6d68Dan Bornsteinvoid dvmThrowExceptionInInitializerError(void);
289d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
290d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
291d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a FileNotFoundException in the current thread, with the given
292d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
293d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
294d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowFileNotFoundException(const char* msg);
295d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
296d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
297d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IOException in the current thread, with the given
298d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
299d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
300d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIOException(const char* msg);
301d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
302d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
303d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessError in the current thread, with the
304d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
305d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
306d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessError(const char* msg);
307d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
308d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
309d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessException in the current thread, with the
310d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
311d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
312d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessException(const char* msg);
313d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
314d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
315d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalArgumentException in the current thread, with the
316d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
317d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
318d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalArgumentException(const char* msg);
319d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
320d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
321d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalMonitorStateException in the current thread, with
322d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
323d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
324d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalMonitorStateException(const char* msg);
325d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
326d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
327d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalStateException in the current thread, with
328d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
329d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
330d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalStateException(const char* msg);
331d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
332d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
333d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalThreadStateException in the current thread, with
334d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
335d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
336d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalThreadStateException(const char* msg);
337d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
338d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
33970b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an IncompatibleClassChangeError in the current thread,
34070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
34170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
34270b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowIncompatibleClassChangeError(const char* msg);
34370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
34470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
34570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an IncompatibleClassChangeError in the current thread, with the
34670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * human-readable form of the given descriptor as the detail message.
34770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
34870b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowIncompatibleClassChangeErrorWithClassMessage(
34970b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein        const char* descriptor);
35070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
35170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
352bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein * Throw an InstantiationException in the current thread, with
353bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein * the human-readable form of the given class as the detail message,
354bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein * with optional extra detail appended to the message.
355bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein */
356bc606f5e72b16f3759f5d414c7444204908718aaDan Bornsteinvoid dvmThrowInstantiationException(ClassObject* clazz,
357bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein        const char* extraDetail);
358bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein
359bc606f5e72b16f3759f5d414c7444204908718aaDan Bornstein/**
360d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InternalError in the current thread, with the given
361d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
362d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
363d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowInternalError(const char* msg);
364d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
365d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
366d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InterruptedException in the current thread, with the given
367d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
368d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
369d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowInterruptedException(const char* msg);
370d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
371d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
37270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a LinkageError in the current thread, with the
37370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * given detail message.
37470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
37570b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowLinkageError(const char* msg);
37670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
37770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
378d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NegativeArraySizeException in the current thread, with the
3792c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein * given number as the detail message.
380d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
381d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowNegativeArraySizeException(s4 size);
382d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
383d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
384d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoClassDefFoundError in the current thread, with the
385d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * human-readable form of the given descriptor as the detail message.
386d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
387d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowNoClassDefFoundError(const char* descriptor);
388d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
389d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
390a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein * Throw a NoClassDefFoundError in the current thread, with the given
391a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein * cause, and the human-readable form of the given descriptor as the
392a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein * detail message.
393a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein */
394a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornsteinvoid dvmThrowChainedNoClassDefFoundError(const char* descriptor,
395a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein        Object* cause);
396a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein
397a3b3512e99ef51940b0a13e57528bd32803f72b4Dan Bornstein/**
398d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldError in the current thread, with the given
399d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
400d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
401d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowNoSuchFieldError(const char* msg);
402d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
403d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
404d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldException in the current thread, with the given
405d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
406d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
407d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchFieldException(const char* msg);
408d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
409d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
410d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchMethodError in the current thread, with the given
411d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
412d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
413d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowNoSuchMethodError(const char* msg);
414d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
415d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
416d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NullPointerException in the current thread, with the given
417d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
418d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
419d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmThrowNullPointerException(const char* msg);
420d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
421d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
422d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an OutOfMemoryError in the current thread, with the given
423d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
424d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
425d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowOutOfMemoryError(const char* msg);
426d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
427d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
428d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a RuntimeException in the current thread, with the given detail
429d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
430d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
431d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowRuntimeException(const char* msg);
432d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
433d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
43474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw a StaleDexCacheError in the current thread, with
43574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * the given detail message.
43674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
43774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowStaleDexCacheError(const char* msg);
43874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
43974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/**
440d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a StringIndexOutOfBoundsException in the current thread, with
4417a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein * a detail message specifying an actual length as well as a requested
4427a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein * index.
4437a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein */
4447a86c44bde10b37d8df17d0613072c4ef134189cDan Bornsteinvoid dvmThrowStringIndexOutOfBoundsExceptionWithIndex(jsize stringLength,
4457a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein        jsize requestIndex);
4467a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein
4477a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein/**
4487a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein * Throw a StringIndexOutOfBoundsException in the current thread, with
4497a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein * a detail message specifying an actual length as well as a requested
4507a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein * region.
451d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
4527a86c44bde10b37d8df17d0613072c4ef134189cDan Bornsteinvoid dvmThrowStringIndexOutOfBoundsExceptionWithRegion(jsize stringLength,
4537a86c44bde10b37d8df17d0613072c4ef134189cDan Bornstein        jsize requestStart, jsize requestLength);
454d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
455d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
45685ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein * Throw a TypeNotPresentException in the current thread, with the
45785ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein * human-readable form of the given descriptor as the detail message.
45885ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein */
45985ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornsteinvoid dvmThrowTypeNotPresentException(const char* descriptor);
46085ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein
46185ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein/**
46270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an UnsatisfiedLinkError in the current thread, with
46370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
46470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
46570b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowUnsatisfiedLinkError(const char* msg);
4665cc74502e62d99d40f5c7a841a57fafde5e7ed33Andy McFaddenvoid dvmThrowUnsatisfiedLinkError(const char* msg, const Method* method);
46770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
46870b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
469d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an UnsupportedOperationException in the current thread, with
470d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
471d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
472d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowUnsupportedOperationException(const char* msg);
473d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
47470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
47585ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein * Throw a VerifyError in the current thread, with the
47685ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein * human-readable form of the given descriptor as the detail message.
47785ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein */
47885ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornsteinvoid dvmThrowVerifyError(const char* descriptor);
47985ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein
48085ba81d1da57c9f19c54bee3d7907b70045dad46Dan Bornstein/**
48170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a VirtualMachineError in the current thread, with
48270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
48370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
48470b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowVirtualMachineError(const char* msg);
48570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
486375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_EXCEPTION_H_
487