blob: fbaf4c199fb7df7671759f7d1866896c17ddb0fa [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
17#ifndef ART_SRC_COMMON_THROWS__H_
18#define ART_SRC_COMMON_THROWS_H_
19
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 {
25class AbstractMethod;
26class Class;
27class Field;
28class Object;
29} // namespace mirror
30class StringPiece;
Ian Rogers62d6c772013-02-27 08:32:07 -080031class ThrowLocation;
Ian Rogers87e552d2012-08-31 15:54:48 -070032
Ian Rogers62d6c772013-02-27 08:32:07 -080033// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070034
Sebastien Hertz0a3b8632013-06-26 11:16:01 +020035void ThrowArithmeticExceptionDivideByZero() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers62d6c772013-02-27 08:32:07 -080036
37// ArrayIndexOutOfBoundsException
38
39void ThrowArrayIndexOutOfBoundsException(int index, int length)
Ian Rogersb726dcb2012-09-05 08:57:23 -070040 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070041
Ian Rogers62d6c772013-02-27 08:32:07 -080042// ArrayStoreException
43
44void ThrowArrayStoreException(const mirror::Class* element_class,
45 const mirror::Class* array_class)
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// ClassCircularityError
49
50void ThrowClassCircularityError(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
51
52// ClassCastException
53
54void ThrowClassCastException(const mirror::Class* dest_type, const mirror::Class* src_type)
55 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
56
57void ThrowClassCastException(const ThrowLocation* throw_location, const char* msg)
58 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
59
60// ClassFormatError
61
62void ThrowClassFormatError(const mirror::Class* referrer, const char* fmt, ...)
63 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -070064 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070065
66// IllegalAccessError
67
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080068void ThrowIllegalAccessErrorClass(mirror::Class* referrer, mirror::Class* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070069 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070070
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080071void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
72 const mirror::AbstractMethod* caller,
73 const mirror::AbstractMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070074 InvokeType type)
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 ThrowIllegalAccessErrorMethod(mirror::Class* referrer, mirror::AbstractMethod* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070078 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070079
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080080void ThrowIllegalAccessErrorField(mirror::Class* referrer, mirror::Field* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070081 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070082
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080083void ThrowIllegalAccessErrorFinalField(const mirror::AbstractMethod* referrer,
84 mirror::Field* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070085 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070086
Ian Rogers62d6c772013-02-27 08:32:07 -080087void ThrowIllegalAccessError(mirror::Class* referrer, const char* fmt, ...)
88 __attribute__((__format__(__printf__, 2, 3)))
89 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
90
91// IllegalArgumentException
92
93void ThrowIllegalArgumentException(const ThrowLocation* throw_location, const char* msg)
94 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
95
Ian Rogers87e552d2012-08-31 15:54:48 -070096// IncompatibleClassChangeError
97
98void ThrowIncompatibleClassChangeError(InvokeType expected_type, InvokeType found_type,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080099 mirror::AbstractMethod* method,
100 const mirror::AbstractMethod* referrer)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700101 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700102
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800103void ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(const mirror::AbstractMethod* interface_method,
104 mirror::Object* this_object,
105 const mirror::AbstractMethod* referrer)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700106 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700107
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800108void ThrowIncompatibleClassChangeErrorField(const mirror::Field* resolved_field, bool is_static,
109 const mirror::AbstractMethod* referrer)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700110 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700111
Ian Rogers62d6c772013-02-27 08:32:07 -0800112void ThrowIncompatibleClassChangeError(const mirror::Class* referrer, const char* fmt, ...)
113 __attribute__((__format__(__printf__, 2, 3)))
114 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
115
116// LinkageError
117
118void ThrowLinkageError(const mirror::Class* referrer, const char* fmt, ...)
119 __attribute__((__format__(__printf__, 2, 3)))
120 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
121
122// NegativeArraySizeException
123
124void ThrowNegativeArraySizeException(int size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
125
126void ThrowNegativeArraySizeException(const char* msg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
127
128
129// NoSuchFieldError
130
131void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
132 const StringPiece& type, const StringPiece& name)
133 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
134
Ian Rogers87e552d2012-08-31 15:54:48 -0700135// NoSuchMethodError
136
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800137void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
Ian Rogers62d6c772013-02-27 08:32:07 -0800138 const StringPiece& signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700139 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700140
Ian Rogers62d6c772013-02-27 08:32:07 -0800141void ThrowNoSuchMethodError(uint32_t method_idx)
142 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
143
144// NullPointerException
145
146void ThrowNullPointerExceptionForFieldAccess(const ThrowLocation& throw_location,
147 mirror::Field* field,
148 bool is_read)
149 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
150
151void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
152 uint32_t method_idx,
153 InvokeType type)
154 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
155
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200156void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
157 mirror::AbstractMethod* method,
158 InvokeType type)
159 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
160
Ian Rogers62d6c772013-02-27 08:32:07 -0800161void ThrowNullPointerExceptionFromDexPC(const ThrowLocation& throw_location)
162 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
163
164void ThrowNullPointerException(const ThrowLocation* throw_location, const char* msg)
165 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
166
167// RuntimeException
168
169void ThrowRuntimeException(const char* fmt, ...)
170 __attribute__((__format__(__printf__, 1, 2)))
171 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
172
173// VerifyError
174
175void ThrowVerifyError(const mirror::Class* referrer, const char* fmt, ...)
176 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -0700177 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700178
179} // namespace art
180
181#endif // ART_SRC_COMMON_THROWS_H_