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