blob: 1d77e2d6250b48cde6abc5a34f907a7cd0cfb035 [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 {
Brian Carlstromea46f952013-07-30 01:26:50 -070025class ArtField;
26class ArtMethod;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080027class Class;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028class Object;
29} // 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)
Sebastien Hertz56adf602013-07-09 17:27:07 +020037 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
38
Ian Rogers62d6c772013-02-27 08:32:07 -080039// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070040
Sebastien Hertz0a3b8632013-06-26 11:16:01 +020041void ThrowArithmeticExceptionDivideByZero() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers62d6c772013-02-27 08:32:07 -080042
43// ArrayIndexOutOfBoundsException
44
45void ThrowArrayIndexOutOfBoundsException(int index, int length)
Ian Rogersb726dcb2012-09-05 08:57:23 -070046 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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 Rogersb726dcb2012-09-05 08:57:23 -070052 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070053
Ian Rogers62d6c772013-02-27 08:32:07 -080054// ClassCircularityError
55
56void ThrowClassCircularityError(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
57
58// ClassCastException
59
60void ThrowClassCastException(const mirror::Class* dest_type, const mirror::Class* src_type)
61 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
62
63void ThrowClassCastException(const ThrowLocation* throw_location, const char* msg)
64 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
65
66// ClassFormatError
67
68void ThrowClassFormatError(const mirror::Class* referrer, const char* fmt, ...)
69 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -070070 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070071
72// IllegalAccessError
73
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080074void ThrowIllegalAccessErrorClass(mirror::Class* referrer, mirror::Class* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070075 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070076
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080077void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
Brian Carlstromea46f952013-07-30 01:26:50 -070078 const mirror::ArtMethod* caller,
79 const mirror::ArtMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070080 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -070081 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070082
Brian Carlstromea46f952013-07-30 01:26:50 -070083void ThrowIllegalAccessErrorMethod(mirror::Class* referrer, mirror::ArtMethod* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070084 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070085
Brian Carlstromea46f952013-07-30 01:26:50 -070086void ThrowIllegalAccessErrorField(mirror::Class* referrer, mirror::ArtField* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070087 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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 Rogersb726dcb2012-09-05 08:57:23 -070091 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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)))
95 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
96
97// IllegalArgumentException
98
99void ThrowIllegalArgumentException(const ThrowLocation* throw_location, const char* msg)
100 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
101
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 Rogersb726dcb2012-09-05 08:57:23 -0700107 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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 Rogersb726dcb2012-09-05 08:57:23 -0700112 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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 Rogersb726dcb2012-09-05 08:57:23 -0700116 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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)))
120 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
121
122// LinkageError
123
124void ThrowLinkageError(const mirror::Class* referrer, const char* fmt, ...)
125 __attribute__((__format__(__printf__, 2, 3)))
126 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
127
128// NegativeArraySizeException
129
130void ThrowNegativeArraySizeException(int size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
131
132void ThrowNegativeArraySizeException(const char* msg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
133
134
135// NoSuchFieldError
136
137void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
138 const StringPiece& type, const StringPiece& name)
139 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
140
Ian Rogers87e552d2012-08-31 15:54:48 -0700141// NoSuchMethodError
142
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800143void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
Ian Rogersd91d6d62013-09-25 20:26:14 -0700144 const Signature& signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700145 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700146
Ian Rogers62d6c772013-02-27 08:32:07 -0800147void ThrowNoSuchMethodError(uint32_t method_idx)
148 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
149
150// NullPointerException
151
152void ThrowNullPointerExceptionForFieldAccess(const ThrowLocation& throw_location,
Brian Carlstromea46f952013-07-30 01:26:50 -0700153 mirror::ArtField* field,
Ian Rogers62d6c772013-02-27 08:32:07 -0800154 bool is_read)
155 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
156
157void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
158 uint32_t method_idx,
159 InvokeType type)
160 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
161
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200162void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
Brian Carlstromea46f952013-07-30 01:26:50 -0700163 mirror::ArtMethod* method,
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200164 InvokeType type)
165 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
166
Ian Rogers62d6c772013-02-27 08:32:07 -0800167void ThrowNullPointerExceptionFromDexPC(const ThrowLocation& throw_location)
168 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
169
170void ThrowNullPointerException(const ThrowLocation* throw_location, const char* msg)
171 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
172
173// RuntimeException
174
175void ThrowRuntimeException(const char* fmt, ...)
176 __attribute__((__format__(__printf__, 1, 2)))
177 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
178
179// VerifyError
180
181void ThrowVerifyError(const mirror::Class* referrer, const char* fmt, ...)
182 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -0700183 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700184
185} // namespace art
186
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700187#endif // ART_RUNTIME_COMMON_THROWS_H_