Exception.h revision 74501e600dcb5634aa26aee0a3f57f2b45b213f2
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 */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_EXCEPTION
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_EXCEPTION
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* initialization */
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmExceptionStartup(void);
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmExceptionShutdown(void);
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception in the current thread, by class descriptor.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThrowChainedException(const char* exceptionDescriptor, const char* msg,
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* cause);
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmThrowException(const char* exceptionDescriptor,
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* msg)
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmThrowChainedException(exceptionDescriptor, msg, NULL);
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Like dvmThrowChainedException, but takes printf-style args for the message.
4074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
4174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowExceptionFmtV(const char* exceptionDescriptor, const char* fmt,
4274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    va_list args);
4374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowExceptionFmt(const char* exceptionDescriptor, const char* fmt, ...)
4474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein#if defined(__GNUC__)
4574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    __attribute__ ((format(printf, 2, 3)))
4674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein#endif
4774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    ;
4874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmThrowExceptionFmt(const char* exceptionDescriptor,
4974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* fmt, ...)
5074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
5174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    va_list args;
5274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    va_start(args, fmt);
5374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    dvmThrowExceptionFmtV(exceptionDescriptor, fmt, args);
5474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    va_end(args);
5574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
5674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
5774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
5874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw an exception in the current thread, by class object.
5974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
6074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowChainedExceptionByClass(ClassObject* exceptionClass,
6174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* msg, Object* cause);
6274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmThrowExceptionByClass(ClassObject* exceptionClass,
6374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* msg)
6474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
6574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    dvmThrowChainedExceptionByClass(exceptionClass, msg, NULL);
6674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
6774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
6874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
6974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw the named exception using the human-readable form of the class
7074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * descriptor as the exception message, and with the specified cause.
7174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
7274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowChainedExceptionWithClassMessage(const char* exceptionDescriptor,
7374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* messageDescriptor, Object* cause);
7474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmThrowExceptionWithClassMessage(const char* exceptionDescriptor,
7574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* messageDescriptor)
7674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
7774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    dvmThrowChainedExceptionWithClassMessage(exceptionDescriptor,
7874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein        messageDescriptor, NULL);
7974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
8074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
8174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
8274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Like dvmThrowException, but take a class object instead of a name
8374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * and turn the given message into the human-readable form for a descriptor.
8474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
8574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowExceptionByClassWithClassMessage(ClassObject* exceptionClass,
8674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    const char* messageDescriptor);
8774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
8874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
8974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Return the exception being thrown in the current thread, or NULL if
9074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * no exception is pending.
9174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
9274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE Object* dvmGetException(Thread* self) {
9374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return self->exception;
9474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
9574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
9674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
9774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Set the exception being thrown in the current thread.
9874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
9974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmSetException(Thread* self, Object* exception)
10074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein{
10174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    assert(exception != NULL);
10274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    self->exception = exception;
10374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
10474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
10574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
10674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Clear the pending exception.
10774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
10874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * (We use this rather than "set(null)" because we may need to have special
10974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * fixups here for StackOverflowError stuff.  Calling "clear" in the code
11074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * makes it obvious.)
1110016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes */
11274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE void dvmClearException(Thread* self) {
11374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    self->exception = NULL;
11474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
11574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
11674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
11774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Clear the pending exception.  Used by the optimization and verification
11874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * code, which has to run with "initializing" set to avoid going into a
11974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * death-spin if the "class not found" exception can't be found.
12074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
12174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmClearOptException(Thread* self);
12274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
12374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
12474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns "true" if an exception is pending.  Use this if you have a
12574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * "self" pointer.
12674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
12774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE bool dvmCheckException(Thread* self) {
12874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (self->exception != NULL);
12974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
13074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
13174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
13274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns "true" if this is a "checked" exception, i.e. it's a subclass
13374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * of Throwable (assumed) but not a subclass of RuntimeException or Error.
13474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
13574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinbool dvmIsCheckedException(const Object* exception);
13674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
13774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
13874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Wrap the now-pending exception in a different exception.
13974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
14074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * If something fails, an (unchecked) exception related to that failure
14174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * will be pending instead.
14274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
14374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmWrapException(const char* newExcepStr);
14474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
14574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
14674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Get the "cause" field from an exception.
14774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
14874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns NULL if the field is null or uninitialized.
14974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
15074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinObject* dvmGetExceptionCause(const Object* exception);
15174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
15274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
15374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print the exception stack trace on stderr.  Calls the exception's
15474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * print function.
15574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
15674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmPrintExceptionStackTrace(void);
15774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
15874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
15974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print the exception stack trace to the log file.  The exception stack
16074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * trace is computed within the VM.
16174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
16274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmLogExceptionStackTrace(void);
16374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
16474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
16574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Search for a catch block that matches "exception".
16674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
16774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * "*newFrame" gets a copy of the new frame pointer.
16874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
16974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * If "doUnroll" is set, we unroll "thread"s stack as we go (and update
17074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * self->curFrame with the same value as in *newFrame).
17174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
17274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Returns the offset to the catch code on success, or -1 if we couldn't
17374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * find a catcher.
17474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
17574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinint dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
17674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    bool doUnroll, void** newFrame);
17774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
17874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
17974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Support for saving exception stack traces and converting them to
18074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * usable form.  Use the "FillIn" function to generate a compact array
18174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * that represents the stack frames, then "GetStackTrace" to convert it
18274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * to an array of StackTraceElement objects.
18374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein *
18474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Don't call the "Internal" form of the function directly.
18574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
18674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid* dvmFillInStackTraceInternal(Thread* thread, bool wantObject, int* pCount);
18774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/* return an [I for use by interpreted code */
18874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE Object* dvmFillInStackTrace(Thread* thread) {
18974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (Object*) dvmFillInStackTraceInternal(thread, true, NULL);
19074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
19174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinArrayObject* dvmGetStackTrace(const Object* stackState);
19274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/* return an int* and array count; caller must free() the return value */
19374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinINLINE int* dvmFillInStackTraceRaw(Thread* thread, int* pCount) {
19474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    return (int*) dvmFillInStackTraceInternal(thread, false, pCount);
19574501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein}
19674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan BornsteinArrayObject* dvmGetStackTraceRaw(const int* intVals, int stackDepth);
19774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
19874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
19974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Print a formatted version of a raw stack trace to the log file.
20074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
20174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmLogRawStackTrace(const int* intVals, int stackDepth);
202d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
203d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
204d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an AbstractMethodError in the current thread, with the given detail
205d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
206d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
207d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowAbstractMethodError(const char* msg);
208d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
209d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
210d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an ArithmeticException in the current thread, with the given detail
211d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
212d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
213d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowArithmeticException(const char* msg);
214d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
21563644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes/*
21674501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw an ArrayIndexOutOfBoundsException in the current thread,
21774501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * using the given index and array length in the detail message.
21874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
21974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowArrayIndexOutOfBoundsException(int index, int length);
22074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
22174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/*
22263644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes * Throw an ArrayStoreException in the current thread, using the given classes'
22363644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes * names in the detail message.
22463644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes */
22563644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughesvoid dvmThrowArrayStoreException(ClassObject* actual, ClassObject* desired);
2260016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes
227c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes/**
228c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * Throw a ClassCastException in the current thread, using the given classes'
229c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * names in the detail message.
230c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes */
231c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughesvoid dvmThrowClassCastException(ClassObject* actual, ClassObject* desired);
232c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes
233d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
23470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a ClassCircularityError in the current thread, with the
23570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * human-readable form of the given descriptor as the detail message.
23670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
23770b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowClassCircularityError(const char* descriptor);
23870b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
23970b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
24070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a ClassFormatError in the current thread, with the given
24170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * detail message.
24270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
24370b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowClassFormatError(const char* msg);
24470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
24570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
246d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a ClassNotFoundException in the current thread, with the given
247d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
248d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
249d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowClassNotFoundException(const char* msg);
250d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
251d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
252d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a FileNotFoundException in the current thread, with the given
253d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
254d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
255d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowFileNotFoundException(const char* msg);
256d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
257d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
258d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IOException in the current thread, with the given
259d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
260d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
261d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIOException(const char* msg);
262d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
263d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
264d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessError in the current thread, with the
265d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
266d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
267d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessError(const char* msg);
268d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
269d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
270d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessException in the current thread, with the
271d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
272d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
273d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessException(const char* msg);
274d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
275d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
276d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalArgumentException in the current thread, with the
277d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
278d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
279d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalArgumentException(const char* msg);
280d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
281d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
282d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalMonitorStateException in the current thread, with
283d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
284d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
285d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalMonitorStateException(const char* msg);
286d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
287d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
288d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalStateException in the current thread, with
289d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
290d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
291d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalStateException(const char* msg);
292d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
293d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
294d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalThreadStateException in the current thread, with
295d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
296d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
297d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalThreadStateException(const char* msg);
298d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
299d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
30070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an IncompatibleClassChangeError in the current thread,
30170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
30270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
30370b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowIncompatibleClassChangeError(const char* msg);
30470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
30570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
30670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an IncompatibleClassChangeError in the current thread, with the
30770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * human-readable form of the given descriptor as the detail message.
30870b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
30970b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowIncompatibleClassChangeErrorWithClassMessage(
31070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein        const char* descriptor);
31170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
31270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
313d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InternalError in the current thread, with the given
314d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
315d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
316d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowInternalError(const char* msg);
317d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
318d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
319d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InterruptedException in the current thread, with the given
320d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
321d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
322d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowInterruptedException(const char* msg);
323d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
324d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
32570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a LinkageError in the current thread, with the
32670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * given detail message.
32770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
32870b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowLinkageError(const char* msg);
32970b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
33070b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
331d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NegativeArraySizeException in the current thread, with the
332d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
333d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
334d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNegativeArraySizeException(const char* msg);
335d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
336d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
337d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoClassDefFoundError in the current thread, with the
338d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * human-readable form of the given descriptor as the detail message.
339d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
340d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoClassDefFoundError(const char* descriptor);
341d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
342d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
343d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldError in the current thread, with the given
344d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
345d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
346d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchFieldError(const char* msg);
347d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
348d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
349d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldException in the current thread, with the given
350d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
351d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
352d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchFieldException(const char* msg);
353d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
354d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
355d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchMethodError in the current thread, with the given
356d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
357d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
358d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchMethodError(const char* msg);
359d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
360d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
361d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NullPointerException in the current thread, with the given
362d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
363d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
364d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNullPointerException(const char* msg);
365d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
366d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
367d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an OutOfMemoryError in the current thread, with the given
368d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
369d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
370d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowOutOfMemoryError(const char* msg);
371d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
372d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
373d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a RuntimeException in the current thread, with the given detail
374d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
375d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
376d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowRuntimeException(const char* msg);
377d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
378d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
37974501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * Throw a StaleDexCacheError in the current thread, with
38074501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein * the given detail message.
38174501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein */
38274501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornsteinvoid dvmThrowStaleDexCacheError(const char* msg);
38374501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein
38474501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein/**
385d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a StringIndexOutOfBoundsException in the current thread, with
386d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
387d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
388d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowStringIndexOutOfBoundsException(const char* msg);
389d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
390d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
39170b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw an UnsatisfiedLinkError in the current thread, with
39270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
39370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
39470b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowUnsatisfiedLinkError(const char* msg);
39570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
39670b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
397d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an UnsupportedOperationException in the current thread, with
398d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
399d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
400d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowUnsupportedOperationException(const char* msg);
401d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
40270b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein/**
40370b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * Throw a VirtualMachineError in the current thread, with
40470b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein * the given detail message.
40570b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein */
40670b00abc45d7d04342a96a03749f993028b060f7Dan Bornsteinvoid dvmThrowVirtualMachineError(const char* msg);
40770b00abc45d7d04342a96a03749f993028b060f7Dan Bornstein
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_EXCEPTION*/
409