Exception.h revision d27f3cf3e7b373487f39e035fc4b55168d55c454
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/*
390016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes * Throw an ArrayIndexOutOfBoundsException in the current thread, using the given
400016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes * index and array length in the detail message.
410016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes */
420016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughesvoid dvmThrowAIOOBE(int index, int length);
43d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
44d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
45d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an AbstractMethodError in the current thread, with the given detail
46d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
47d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
48d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowAbstractMethodError(const char* msg);
49d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
50d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
51d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an ArithmeticException in the current thread, with the given detail
52d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
53d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
54d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowArithmeticException(const char* msg);
55d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
5663644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes/*
5763644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes * Throw an ArrayStoreException in the current thread, using the given classes'
5863644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes * names in the detail message.
5963644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughes */
6063644657f74e0a5d05f2c5fb56a18872e7ac7427Elliott Hughesvoid dvmThrowArrayStoreException(ClassObject* actual, ClassObject* desired);
610016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes
62c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes/**
63c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * Throw a ClassCastException in the current thread, using the given classes'
64c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes * names in the detail message.
65c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes */
66c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughesvoid dvmThrowClassCastException(ClassObject* actual, ClassObject* desired);
67c560e30f68265068bed9eadf174d1e76288d2952Elliott Hughes
68d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
69d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a ClassNotFoundException in the current thread, with the given
70d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
71d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
72d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowClassNotFoundException(const char* msg);
73d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
74d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
75d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a FileNotFoundException in the current thread, with the given
76d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
77d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
78d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowFileNotFoundException(const char* msg);
79d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
80d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
81d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IOException in the current thread, with the given
82d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
83d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
84d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIOException(const char* msg);
85d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
86d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
87d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessError in the current thread, with the
88d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
89d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
90d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessError(const char* msg);
91d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
92d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
93d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalAccessException in the current thread, with the
94d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
95d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
96d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalAccessException(const char* msg);
97d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
98d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
99d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalArgumentException in the current thread, with the
100d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
101d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
102d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalArgumentException(const char* msg);
103d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
104d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
105d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalMonitorStateException in the current thread, with
106d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
107d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
108d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalMonitorStateException(const char* msg);
109d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
110d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
111d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalStateException in the current thread, with
112d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
113d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
114d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalStateException(const char* msg);
115d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
116d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
117d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an IllegalThreadStateException in the current thread, with
118d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
119d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
120d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowIllegalThreadStateException(const char* msg);
121d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
122d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
123d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InternalError in the current thread, with the given
124d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
125d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
126d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowInternalError(const char* msg);
127d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
128d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
129d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an InterruptedException in the current thread, with the given
130d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
131d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
132d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowInterruptedException(const char* msg);
133d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
134d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
135d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NegativeArraySizeException in the current thread, with the
136d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * given detail message.
137d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
138d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNegativeArraySizeException(const char* msg);
139d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
140d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
141d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoClassDefFoundError in the current thread, with the
142d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * human-readable form of the given descriptor as the detail message.
143d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
144d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoClassDefFoundError(const char* descriptor);
145d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
146d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
147d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldError in the current thread, with the given
148d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
149d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
150d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchFieldError(const char* msg);
151d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
152d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
153d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchFieldException in the current thread, with the given
154d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
155d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
156d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchFieldException(const char* msg);
157d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
158d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
159d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NoSuchMethodError in the current thread, with the given
160d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
161d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
162d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNoSuchMethodError(const char* msg);
163d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
164d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
165d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a NullPointerException in the current thread, with the given
166d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
167d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
168d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowNullPointerException(const char* msg);
169d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
170d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
171d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an OutOfMemoryError in the current thread, with the given
172d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * detail message.
173d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
174d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowOutOfMemoryError(const char* msg);
175d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
176d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
177d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a RuntimeException in the current thread, with the given detail
178d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * message.
179d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
180d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowRuntimeException(const char* msg);
181d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
182d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
183d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw a StringIndexOutOfBoundsException in the current thread, with
184d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
185d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
186d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowStringIndexOutOfBoundsException(const char* msg);
187d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
188d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein/**
189d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw an UnsupportedOperationException in the current thread, with
190d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * the given detail message.
191d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein */
192d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornsteinvoid dvmThrowUnsupportedOperationException(const char* msg);
193d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein
1940016024cdd2bdeef3b98c92f7a8f40a2bc1ff42dElliott Hughes/*
1950171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden * Like dvmThrowChainedException, but takes printf-style args for the message.
1960171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden */
1970171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFaddenvoid dvmThrowExceptionFmtV(const char* exceptionDescriptor, const char* fmt,
1980171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    va_list args);
199d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFaddenvoid dvmThrowExceptionFmt(const char* exceptionDescriptor, const char* fmt, ...)
200d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFadden#if defined(__GNUC__)
201d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFadden    __attribute__ ((format(printf, 2, 3)))
202d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFadden#endif
203d4524479b8b87b88b75f269b3757bbc22361f7dfAndy McFadden    ;
2040171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFaddenINLINE void dvmThrowExceptionFmt(const char* exceptionDescriptor,
2050171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    const char* fmt, ...)
2060171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden{
2070171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    va_list args;
2080171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    va_start(args, fmt);
2090171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    dvmThrowExceptionFmtV(exceptionDescriptor, fmt, args);
2100171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden    va_end(args);
2110171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden}
2120171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden
2130171812e59e2520a4345b9bbadd4f7afa0a1de16Andy McFadden/*
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throw an exception in the current thread, by class object.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThrowChainedExceptionByClass(ClassObject* exceptionClass,
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* msg, Object* cause);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmThrowExceptionByClass(ClassObject* exceptionClass,
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* msg)
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmThrowChainedExceptionByClass(exceptionClass, msg, NULL);
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
225d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Throw the named exception using the human-readable form of the class
226d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * descriptor as the exception message, and with the specified cause.
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThrowChainedExceptionWithClassMessage(const char* exceptionDescriptor,
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* messageDescriptor, Object* cause);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmThrowExceptionWithClassMessage(const char* exceptionDescriptor,
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* messageDescriptor)
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmThrowChainedExceptionWithClassMessage(exceptionDescriptor,
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        messageDescriptor, NULL);
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
238d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * Like dvmThrowException, but take a class object instead of a name
239d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein * and turn the given message into the human-readable form for a descriptor.
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThrowExceptionByClassWithClassMessage(ClassObject* exceptionClass,
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* messageDescriptor);
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the exception being thrown in the current thread, or NULL if
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * no exception is pending.
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE Object* dvmGetException(Thread* self) {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return self->exception;
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set the exception being thrown in the current thread.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmSetException(Thread* self, Object* exception)
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(exception != NULL);
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    self->exception = exception;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Clear the pending exception.
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We use this rather than "set(null)" because we may need to have special
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fixups here for StackOverflowError stuff.  Calling "clear" in the code
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it obvious.)
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmClearException(Thread* self) {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    self->exception = NULL;
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Clear the pending exception.  Used by the optimization and verification
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * code, which has to run with "initializing" set to avoid going into a
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * death-spin if the "class not found" exception can't be found.
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmClearOptException(Thread* self);
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "true" if an exception is pending.  Use this if you have a
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "self" pointer.
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmCheckException(Thread* self) {
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (self->exception != NULL);
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "true" if this is a "checked" exception, i.e. it's a subclass
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of Throwable (assumed) but not a subclass of RuntimeException or Error.
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIsCheckedException(const Object* exception);
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Wrap the now-pending exception in a different exception.
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If something fails, an (unchecked) exception related to that failure
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will be pending instead.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmWrapException(const char* newExcepStr);
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
302686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden * Get the "cause" field from an exception.
303686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden *
304686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden * Returns NULL if the field is null or uninitialized.
305686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden */
306686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFaddenObject* dvmGetExceptionCause(const Object* exception);
307686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden
308686e1e23324f1c1f358f29f13f23e57b41c00eaaAndy McFadden/*
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the exception stack trace on stderr.  Calls the exception's
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * print function.
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmPrintExceptionStackTrace(void);
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the exception stack trace to the log file.  The exception stack
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * trace is computed within the VM.
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLogExceptionStackTrace(void);
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Search for a catch block that matches "exception".
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "*newFrame" gets a copy of the new frame pointer.
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "doUnroll" is set, we unroll "thread"s stack as we go (and update
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * self->curFrame with the same value as in *newFrame).
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the offset to the catch code on success, or -1 if we couldn't
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * find a catcher.
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmFindCatchBlock(Thread* self, int relPc, Object* exception,
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool doUnroll, void** newFrame);
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Support for saving exception stack traces and converting them to
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * usable form.  Use the "FillIn" function to generate a compact array
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that represents the stack frames, then "GetStackTrace" to convert it
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to an array of StackTraceElement objects.
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Don't call the "Internal" form of the function directly.
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmFillInStackTraceInternal(Thread* thread, bool wantObject, int* pCount);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return an [I for use by interpreted code */
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE Object* dvmFillInStackTrace(Thread* thread) {
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (Object*) dvmFillInStackTraceInternal(thread, true, NULL);
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetStackTrace(const Object* stackState);
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return an int* and array count; caller must free() the return value */
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE int* dvmFillInStackTraceRaw(Thread* thread, int* pCount) {
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (int*) dvmFillInStackTraceInternal(thread, false, pCount);
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetStackTraceRaw(const int* intVals, int stackDepth);
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a formatted version of a raw stack trace to the log file.
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLogRawStackTrace(const int* intVals, int stackDepth);
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_EXCEPTION*/
360