blob: 2a602634fbc9b1e8b24f718e6a6e01404df18ee3 [file] [log] [blame]
Ian Rogers87e552d2012-08-31 15:54:48 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_RUNTIME_COMMON_THROWS_H_
18#define ART_RUNTIME_COMMON_THROWS_H_
Ian Rogers87e552d2012-08-31 15:54:48 -070019
Elliott Hughes76b61672012-12-12 17:47:30 -080020#include "base/mutex.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080021#include "invoke_type.h"
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070022#include "obj_ptr.h"
Ian Rogers87e552d2012-08-31 15:54:48 -070023
24namespace art {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080025namespace mirror {
Ian Rogers8d31bbd2013-10-13 10:44:14 -070026 class Class;
27 class Object;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028} // namespace mirror
Mathieu Chartierc7853442015-03-27 14:35:38 -070029class ArtField;
Mathieu Chartiere401d142015-04-22 13:56:20 -070030class ArtMethod;
Alex Light705ad492015-09-21 11:36:30 -070031class DexFile;
Ian Rogersd91d6d62013-09-25 20:26:14 -070032class Signature;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080033class StringPiece;
Ian Rogers87e552d2012-08-31 15:54:48 -070034
Sebastien Hertz56adf602013-07-09 17:27:07 +020035// AbstractMethodError
36
Mathieu Chartiere401d142015-04-22 13:56:20 -070037void ThrowAbstractMethodError(ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070038 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz56adf602013-07-09 17:27:07 +020039
Alex Light705ad492015-09-21 11:36:30 -070040void ThrowAbstractMethodError(uint32_t method_idx, const DexFile& dex_file)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070041 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Alex Light705ad492015-09-21 11:36:30 -070042
Ian Rogers62d6c772013-02-27 08:32:07 -080043// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070044
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070045void ThrowArithmeticExceptionDivideByZero() REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080046
47// ArrayIndexOutOfBoundsException
48
49void ThrowArrayIndexOutOfBoundsException(int index, int length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070050 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070051
Ian Rogers62d6c772013-02-27 08:32:07 -080052// ArrayStoreException
53
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070054void ThrowArrayStoreException(ObjPtr<mirror::Class> element_class,
55 ObjPtr<mirror::Class> array_class)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070056 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070057
Ian Rogers62d6c772013-02-27 08:32:07 -080058// ClassCircularityError
59
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070060void ThrowClassCircularityError(ObjPtr<mirror::Class> c)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070061 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080062
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070063void ThrowClassCircularityError(ObjPtr<mirror::Class> c, const char* fmt, ...)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070064 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Roland Levillain989ab3b2016-05-18 15:52:54 +010065
Ian Rogers62d6c772013-02-27 08:32:07 -080066// ClassCastException
67
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070068void ThrowClassCastException(ObjPtr<mirror::Class> dest_type, ObjPtr<mirror::Class> src_type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070069 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080070
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +000071void ThrowClassCastException(const char* msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070072 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080073
74// ClassFormatError
75
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070076void ThrowClassFormatError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -080077 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070078 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070079
80// IllegalAccessError
81
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070082void ThrowIllegalAccessErrorClass(ObjPtr<mirror::Class> referrer, ObjPtr<mirror::Class> accessed)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070083 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070084
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070085void ThrowIllegalAccessErrorClassForMethodDispatch(ObjPtr<mirror::Class> referrer,
86 ObjPtr<mirror::Class> accessed,
Mathieu Chartiere401d142015-04-22 13:56:20 -070087 ArtMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070088 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070089 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070090
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070091void ThrowIllegalAccessErrorMethod(ObjPtr<mirror::Class> referrer, ArtMethod* accessed)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070092 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070093
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -070094void ThrowIllegalAccessErrorField(ObjPtr<mirror::Class> referrer, ArtField* accessed)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070095 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070096
Mathieu Chartiere401d142015-04-22 13:56:20 -070097void ThrowIllegalAccessErrorFinalField(ArtMethod* referrer, ArtField* accessed)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -070098 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070099
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700100void ThrowIllegalAccessError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800101 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700102 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800103
Jeff Hao11d5d8f2014-03-26 15:08:20 -0700104// IllegalAccessException
105
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000106void ThrowIllegalAccessException(const char* msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700107 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Jeff Hao11d5d8f2014-03-26 15:08:20 -0700108
Ian Rogers62d6c772013-02-27 08:32:07 -0800109// IllegalArgumentException
110
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000111void ThrowIllegalArgumentException(const char* msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700112 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800113
Ian Rogers87e552d2012-08-31 15:54:48 -0700114// IncompatibleClassChangeError
115
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700116void ThrowIncompatibleClassChangeError(InvokeType expected_type,
117 InvokeType found_type,
118 ArtMethod* method,
119 ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700120 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700121
Alex Light705ad492015-09-21 11:36:30 -0700122void ThrowIncompatibleClassChangeErrorClassForInterfaceSuper(ArtMethod* method,
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700123 ObjPtr<mirror::Class> target_class,
124 ObjPtr<mirror::Object> this_object,
Alex Light705ad492015-09-21 11:36:30 -0700125 ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700126 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Alex Light705ad492015-09-21 11:36:30 -0700127
Mathieu Chartiere401d142015-04-22 13:56:20 -0700128void ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(ArtMethod* interface_method,
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700129 ObjPtr<mirror::Object> this_object,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700130 ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700131 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700132
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700133void ThrowIncompatibleClassChangeErrorField(ArtField* resolved_field,
134 bool is_static,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700135 ArtMethod* referrer)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700136 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700137
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700138void ThrowIncompatibleClassChangeError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800139 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700140 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700141
Alex Light9139e002015-10-09 15:59:48 -0700142void ThrowIncompatibleClassChangeErrorForMethodConflict(ArtMethod* method)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700143 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Alex Light9139e002015-10-09 15:59:48 -0700144
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700145// IOException
146
147void ThrowIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700148 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800149
Andreas Gampe329d1882014-04-08 10:32:19 -0700150void ThrowWrappedIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700151 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Andreas Gampe329d1882014-04-08 10:32:19 -0700152
Ian Rogers62d6c772013-02-27 08:32:07 -0800153// LinkageError
154
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700155void ThrowLinkageError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800156 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700157 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800158
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700159void ThrowWrappedLinkageError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Vladimir Markod5e5a0e2015-05-08 12:26:59 +0100160 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700161 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Vladimir Markod5e5a0e2015-05-08 12:26:59 +0100162
Ian Rogers62d6c772013-02-27 08:32:07 -0800163// NegativeArraySizeException
164
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700165void ThrowNegativeArraySizeException(int size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700166 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800167
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700168void ThrowNegativeArraySizeException(const char* msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700169 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800170
171
172// NoSuchFieldError
173
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700174void ThrowNoSuchFieldError(const StringPiece& scope,
175 ObjPtr<mirror::Class> c,
176 const StringPiece& type,
177 const StringPiece& name)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700178 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800179
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700180void ThrowNoSuchFieldException(ObjPtr<mirror::Class> c, const StringPiece& name)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700181 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Mathieu Chartier4e067782015-05-13 13:13:24 -0700182
Ian Rogers87e552d2012-08-31 15:54:48 -0700183// NoSuchMethodError
184
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700185void ThrowNoSuchMethodError(InvokeType type,
186 ObjPtr<mirror::Class> c,
187 const StringPiece& name,
Ian Rogersd91d6d62013-09-25 20:26:14 -0700188 const Signature& signature)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700189 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700190
Ian Rogers62d6c772013-02-27 08:32:07 -0800191// NullPointerException
192
Mathieu Chartierc7853442015-03-27 14:35:38 -0700193void ThrowNullPointerExceptionForFieldAccess(ArtField* field,
Ian Rogers62d6c772013-02-27 08:32:07 -0800194 bool is_read)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700195 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800196
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000197void ThrowNullPointerExceptionForMethodAccess(uint32_t method_idx,
Ian Rogers62d6c772013-02-27 08:32:07 -0800198 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700199 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800200
Mathieu Chartiere401d142015-04-22 13:56:20 -0700201void ThrowNullPointerExceptionForMethodAccess(ArtMethod* method,
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200202 InvokeType type)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700203 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200204
Nicolas Geoffraye8e11272016-06-28 18:08:46 +0100205void ThrowNullPointerExceptionFromDexPC(bool check_address = false, uintptr_t addr = 0)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700206 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800207
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000208void ThrowNullPointerException(const char* msg)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700209 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800210
211// RuntimeException
212
213void ThrowRuntimeException(const char* fmt, ...)
214 __attribute__((__format__(__printf__, 1, 2)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700215 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800216
Andreas Gampe103992b2016-01-04 15:32:43 -0800217// Stack overflow.
218
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700219void ThrowStackOverflowError(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Andreas Gampe103992b2016-01-04 15:32:43 -0800220
Vladimir Marko87f3fcb2016-04-28 15:52:11 +0100221// StringIndexOutOfBoundsException
222
223void ThrowStringIndexOutOfBoundsException(int index, int length)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700224 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Vladimir Marko87f3fcb2016-04-28 15:52:11 +0100225
Ian Rogers62d6c772013-02-27 08:32:07 -0800226// VerifyError
227
Mathieu Chartier6b3d12b2016-10-13 13:59:58 -0700228void ThrowVerifyError(ObjPtr<mirror::Class> referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800229 __attribute__((__format__(__printf__, 2, 3)))
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700230 REQUIRES_SHARED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700231
232} // namespace art
233
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700234#endif // ART_RUNTIME_COMMON_THROWS_H_