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