blob: 2a0934fb5b1f5c20760160f17a1228fd003d478e [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"
Ian Rogers87e552d2012-08-31 15:54:48 -070022
23namespace art {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080024namespace mirror {
Ian Rogers8d31bbd2013-10-13 10:44:14 -070025 class Class;
26 class Object;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080027} // namespace mirror
Mathieu Chartierc7853442015-03-27 14:35:38 -070028class ArtField;
Mathieu Chartiere401d142015-04-22 13:56:20 -070029class ArtMethod;
Ian Rogersd91d6d62013-09-25 20:26:14 -070030class Signature;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031class StringPiece;
Ian Rogers87e552d2012-08-31 15:54:48 -070032
Sebastien Hertz56adf602013-07-09 17:27:07 +020033// AbstractMethodError
34
Mathieu Chartiere401d142015-04-22 13:56:20 -070035void ThrowAbstractMethodError(ArtMethod* method)
Mathieu Chartier90443472015-07-16 20:32:27 -070036 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz56adf602013-07-09 17:27:07 +020037
Ian Rogers62d6c772013-02-27 08:32:07 -080038// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070039
Mathieu Chartier90443472015-07-16 20:32:27 -070040void ThrowArithmeticExceptionDivideByZero() SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080041
42// ArrayIndexOutOfBoundsException
43
44void ThrowArrayIndexOutOfBoundsException(int index, int length)
Mathieu Chartier90443472015-07-16 20:32:27 -070045 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070046
Ian Rogers62d6c772013-02-27 08:32:07 -080047// ArrayStoreException
48
Ian Rogersef7d42f2014-01-06 12:55:46 -080049void ThrowArrayStoreException(mirror::Class* element_class, mirror::Class* array_class)
Mathieu Chartier90443472015-07-16 20:32:27 -070050 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070051
Ian Rogers62d6c772013-02-27 08:32:07 -080052// ClassCircularityError
53
Ian Rogers8d31bbd2013-10-13 10:44:14 -070054void ThrowClassCircularityError(mirror::Class* c)
Mathieu Chartier90443472015-07-16 20:32:27 -070055 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080056
57// ClassCastException
58
Ian Rogersef7d42f2014-01-06 12:55:46 -080059void ThrowClassCastException(mirror::Class* dest_type, mirror::Class* src_type)
Mathieu Chartier90443472015-07-16 20:32:27 -070060 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080061
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +000062void ThrowClassCastException(const char* msg)
Mathieu Chartier90443472015-07-16 20:32:27 -070063 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080064
65// ClassFormatError
66
Ian Rogersef7d42f2014-01-06 12:55:46 -080067void ThrowClassFormatError(mirror::Class* referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -080068 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -070069 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070070
71// IllegalAccessError
72
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080073void ThrowIllegalAccessErrorClass(mirror::Class* referrer, mirror::Class* accessed)
Mathieu Chartier90443472015-07-16 20:32:27 -070074 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070075
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080076void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
Mathieu Chartiere401d142015-04-22 13:56:20 -070077 ArtMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070078 InvokeType type)
Mathieu Chartier90443472015-07-16 20:32:27 -070079 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070080
Mathieu Chartiere401d142015-04-22 13:56:20 -070081void ThrowIllegalAccessErrorMethod(mirror::Class* referrer, ArtMethod* accessed)
Mathieu Chartier90443472015-07-16 20:32:27 -070082 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070083
Mathieu Chartierc7853442015-03-27 14:35:38 -070084void ThrowIllegalAccessErrorField(mirror::Class* referrer, ArtField* accessed)
Mathieu Chartier90443472015-07-16 20:32:27 -070085 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070086
Mathieu Chartiere401d142015-04-22 13:56:20 -070087void ThrowIllegalAccessErrorFinalField(ArtMethod* referrer, ArtField* accessed)
Mathieu Chartier90443472015-07-16 20:32:27 -070088 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070089
Ian Rogers62d6c772013-02-27 08:32:07 -080090void ThrowIllegalAccessError(mirror::Class* referrer, const char* fmt, ...)
91 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -070092 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080093
Jeff Hao11d5d8f2014-03-26 15:08:20 -070094// IllegalAccessException
95
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +000096void ThrowIllegalAccessException(const char* msg)
Mathieu Chartier90443472015-07-16 20:32:27 -070097 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Jeff Hao11d5d8f2014-03-26 15:08:20 -070098
Ian Rogers62d6c772013-02-27 08:32:07 -080099// IllegalArgumentException
100
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000101void ThrowIllegalArgumentException(const char* msg)
Mathieu Chartier90443472015-07-16 20:32:27 -0700102 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800103
Ian Rogers87e552d2012-08-31 15:54:48 -0700104// IncompatibleClassChangeError
105
106void ThrowIncompatibleClassChangeError(InvokeType expected_type, InvokeType found_type,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700107 ArtMethod* method, ArtMethod* referrer)
Mathieu Chartier90443472015-07-16 20:32:27 -0700108 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700109
Mathieu Chartiere401d142015-04-22 13:56:20 -0700110void ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(ArtMethod* interface_method,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800111 mirror::Object* this_object,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700112 ArtMethod* referrer)
Mathieu Chartier90443472015-07-16 20:32:27 -0700113 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700114
Mathieu Chartierc7853442015-03-27 14:35:38 -0700115void ThrowIncompatibleClassChangeErrorField(ArtField* resolved_field, bool is_static,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700116 ArtMethod* referrer)
Mathieu Chartier90443472015-07-16 20:32:27 -0700117 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700118
Ian Rogersef7d42f2014-01-06 12:55:46 -0800119void ThrowIncompatibleClassChangeError(mirror::Class* referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800120 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700121 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700122
Alex Light9139e002015-10-09 15:59:48 -0700123void ThrowIncompatibleClassChangeErrorForMethodConflict(ArtMethod* method)
124 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
125
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700126// IOException
127
128void ThrowIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700129 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800130
Andreas Gampe329d1882014-04-08 10:32:19 -0700131void ThrowWrappedIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700132 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Andreas Gampe329d1882014-04-08 10:32:19 -0700133
Ian Rogers62d6c772013-02-27 08:32:07 -0800134// LinkageError
135
Ian Rogersef7d42f2014-01-06 12:55:46 -0800136void ThrowLinkageError(mirror::Class* referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800137 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700138 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800139
Vladimir Markod5e5a0e2015-05-08 12:26:59 +0100140void ThrowWrappedLinkageError(mirror::Class* referrer, const char* fmt, ...)
141 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700142 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Vladimir Markod5e5a0e2015-05-08 12:26:59 +0100143
Ian Rogers62d6c772013-02-27 08:32:07 -0800144// NegativeArraySizeException
145
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700146void ThrowNegativeArraySizeException(int size)
Mathieu Chartier90443472015-07-16 20:32:27 -0700147 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800148
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700149void ThrowNegativeArraySizeException(const char* msg)
Mathieu Chartier90443472015-07-16 20:32:27 -0700150 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800151
152
153// NoSuchFieldError
154
155void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
156 const StringPiece& type, const StringPiece& name)
Mathieu Chartier90443472015-07-16 20:32:27 -0700157 SHARED_REQUIRES(Locks::mutator_lock_);
Ian Rogers62d6c772013-02-27 08:32:07 -0800158
Mathieu Chartier4e067782015-05-13 13:13:24 -0700159void ThrowNoSuchFieldException(mirror::Class* c, const StringPiece& name)
Mathieu Chartier90443472015-07-16 20:32:27 -0700160 SHARED_REQUIRES(Locks::mutator_lock_);
Mathieu Chartier4e067782015-05-13 13:13:24 -0700161
Ian Rogers87e552d2012-08-31 15:54:48 -0700162// NoSuchMethodError
163
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800164void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
Ian Rogersd91d6d62013-09-25 20:26:14 -0700165 const Signature& signature)
Mathieu Chartier90443472015-07-16 20:32:27 -0700166 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700167
Ian Rogers62d6c772013-02-27 08:32:07 -0800168void ThrowNoSuchMethodError(uint32_t method_idx)
Mathieu Chartier90443472015-07-16 20:32:27 -0700169 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800170
171// NullPointerException
172
Mathieu Chartierc7853442015-03-27 14:35:38 -0700173void ThrowNullPointerExceptionForFieldAccess(ArtField* field,
Ian Rogers62d6c772013-02-27 08:32:07 -0800174 bool is_read)
Mathieu Chartier90443472015-07-16 20:32:27 -0700175 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800176
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000177void ThrowNullPointerExceptionForMethodAccess(uint32_t method_idx,
Ian Rogers62d6c772013-02-27 08:32:07 -0800178 InvokeType type)
Mathieu Chartier90443472015-07-16 20:32:27 -0700179 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800180
Mathieu Chartiere401d142015-04-22 13:56:20 -0700181void ThrowNullPointerExceptionForMethodAccess(ArtMethod* method,
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200182 InvokeType type)
Mathieu Chartier90443472015-07-16 20:32:27 -0700183 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200184
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000185void ThrowNullPointerExceptionFromDexPC()
Mathieu Chartier90443472015-07-16 20:32:27 -0700186 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800187
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000188void ThrowNullPointerException(const char* msg)
Mathieu Chartier90443472015-07-16 20:32:27 -0700189 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800190
191// RuntimeException
192
193void ThrowRuntimeException(const char* fmt, ...)
194 __attribute__((__format__(__printf__, 1, 2)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700195 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800196
197// VerifyError
198
Ian Rogersef7d42f2014-01-06 12:55:46 -0800199void ThrowVerifyError(mirror::Class* referrer, const char* fmt, ...)
Ian Rogers62d6c772013-02-27 08:32:07 -0800200 __attribute__((__format__(__printf__, 2, 3)))
Mathieu Chartier90443472015-07-16 20:32:27 -0700201 SHARED_REQUIRES(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700202
203} // namespace art
204
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700205#endif // ART_RUNTIME_COMMON_THROWS_H_