blob: 7f13891400a9f51f9a6b68e3b6d767c656fdd27a [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 ArtField;
26 class ArtMethod;
27 class Class;
28 class Object;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080029} // namespace mirror
Ian Rogersd91d6d62013-09-25 20:26:14 -070030class Signature;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080031class StringPiece;
Ian Rogers62d6c772013-02-27 08:32:07 -080032class ThrowLocation;
Ian Rogers87e552d2012-08-31 15:54:48 -070033
Sebastien Hertz56adf602013-07-09 17:27:07 +020034// AbstractMethodError
35
Brian Carlstromea46f952013-07-30 01:26:50 -070036void ThrowAbstractMethodError(const mirror::ArtMethod* method)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070037 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz56adf602013-07-09 17:27:07 +020038
Ian Rogers62d6c772013-02-27 08:32:07 -080039// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070040
Ian Rogers8d31bbd2013-10-13 10:44:14 -070041void ThrowArithmeticExceptionDivideByZero() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080042
43// ArrayIndexOutOfBoundsException
44
45void ThrowArrayIndexOutOfBoundsException(int index, int length)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070046 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070047
Ian Rogers62d6c772013-02-27 08:32:07 -080048// ArrayStoreException
49
50void ThrowArrayStoreException(const mirror::Class* element_class,
51 const mirror::Class* array_class)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070052 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070053
Ian Rogers62d6c772013-02-27 08:32:07 -080054// ClassCircularityError
55
Ian Rogers8d31bbd2013-10-13 10:44:14 -070056void ThrowClassCircularityError(mirror::Class* c)
57 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080058
59// ClassCastException
60
61void ThrowClassCastException(const mirror::Class* dest_type, const mirror::Class* src_type)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070062 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080063
64void ThrowClassCastException(const ThrowLocation* throw_location, const char* msg)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070065 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080066
67// ClassFormatError
68
69void ThrowClassFormatError(const mirror::Class* referrer, const char* fmt, ...)
70 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -070071 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070072
73// IllegalAccessError
74
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080075void ThrowIllegalAccessErrorClass(mirror::Class* referrer, mirror::Class* accessed)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070076 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070077
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080078void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
Brian Carlstromea46f952013-07-30 01:26:50 -070079 const mirror::ArtMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070080 InvokeType type)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070081 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070082
Brian Carlstromea46f952013-07-30 01:26:50 -070083void ThrowIllegalAccessErrorMethod(mirror::Class* referrer, mirror::ArtMethod* accessed)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070084 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070085
Brian Carlstromea46f952013-07-30 01:26:50 -070086void ThrowIllegalAccessErrorField(mirror::Class* referrer, mirror::ArtField* accessed)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070087 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070088
Brian Carlstromea46f952013-07-30 01:26:50 -070089void ThrowIllegalAccessErrorFinalField(const mirror::ArtMethod* referrer,
90 mirror::ArtField* accessed)
Ian Rogers8d31bbd2013-10-13 10:44:14 -070091 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -070092
Ian Rogers62d6c772013-02-27 08:32:07 -080093void ThrowIllegalAccessError(mirror::Class* referrer, const char* fmt, ...)
94 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -070095 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -080096
97// IllegalArgumentException
98
99void ThrowIllegalArgumentException(const ThrowLocation* throw_location, const char* msg)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700100 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800101
Ian Rogers87e552d2012-08-31 15:54:48 -0700102// IncompatibleClassChangeError
103
104void ThrowIncompatibleClassChangeError(InvokeType expected_type, InvokeType found_type,
Brian Carlstromea46f952013-07-30 01:26:50 -0700105 mirror::ArtMethod* method,
106 const mirror::ArtMethod* referrer)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700107 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700108
Brian Carlstromea46f952013-07-30 01:26:50 -0700109void ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(const mirror::ArtMethod* interface_method,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800110 mirror::Object* this_object,
Brian Carlstromea46f952013-07-30 01:26:50 -0700111 const mirror::ArtMethod* referrer)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700112 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700113
Brian Carlstromea46f952013-07-30 01:26:50 -0700114void ThrowIncompatibleClassChangeErrorField(const mirror::ArtField* resolved_field, bool is_static,
115 const mirror::ArtMethod* referrer)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700116 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700117
Ian Rogers62d6c772013-02-27 08:32:07 -0800118void ThrowIncompatibleClassChangeError(const mirror::Class* referrer, const char* fmt, ...)
119 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700120 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
121
122// IOException
123
124void ThrowIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
125 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800126
127// LinkageError
128
129void ThrowLinkageError(const mirror::Class* referrer, const char* fmt, ...)
130 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700131 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800132
133// NegativeArraySizeException
134
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700135void ThrowNegativeArraySizeException(int size)
136 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800137
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700138void ThrowNegativeArraySizeException(const char* msg)
139 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800140
141
142// NoSuchFieldError
143
144void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
145 const StringPiece& type, const StringPiece& name)
146 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
147
Ian Rogers87e552d2012-08-31 15:54:48 -0700148// NoSuchMethodError
149
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800150void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
Ian Rogersd91d6d62013-09-25 20:26:14 -0700151 const Signature& signature)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700152 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700153
Ian Rogers62d6c772013-02-27 08:32:07 -0800154void ThrowNoSuchMethodError(uint32_t method_idx)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700155 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800156
157// NullPointerException
158
159void ThrowNullPointerExceptionForFieldAccess(const ThrowLocation& throw_location,
Brian Carlstromea46f952013-07-30 01:26:50 -0700160 mirror::ArtField* field,
Ian Rogers62d6c772013-02-27 08:32:07 -0800161 bool is_read)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700162 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800163
164void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
165 uint32_t method_idx,
166 InvokeType type)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700167 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800168
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200169void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
Brian Carlstromea46f952013-07-30 01:26:50 -0700170 mirror::ArtMethod* method,
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200171 InvokeType type)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700172 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200173
Ian Rogers62d6c772013-02-27 08:32:07 -0800174void ThrowNullPointerExceptionFromDexPC(const ThrowLocation& throw_location)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700175 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800176
177void ThrowNullPointerException(const ThrowLocation* throw_location, const char* msg)
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700178 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800179
180// RuntimeException
181
182void ThrowRuntimeException(const char* fmt, ...)
183 __attribute__((__format__(__printf__, 1, 2)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700184 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers62d6c772013-02-27 08:32:07 -0800185
186// VerifyError
187
188void ThrowVerifyError(const mirror::Class* referrer, const char* fmt, ...)
189 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700190 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
Ian Rogers87e552d2012-08-31 15:54:48 -0700191
192} // namespace art
193
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700194#endif // ART_RUNTIME_COMMON_THROWS_H_