blob: 4bf12c0d017ef9e9d559023f3789d5cd492343fb [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
Sebastien Hertz56adf602013-07-09 17:27:07 +020033// AbstractMethodError
34
35void ThrowAbstractMethodError(const mirror::AbstractMethod* method)
36 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
37
Ian Rogers62d6c772013-02-27 08:32:07 -080038// ArithmeticException
Ian Rogers87e552d2012-08-31 15:54:48 -070039
Sebastien Hertz0a3b8632013-06-26 11:16:01 +020040void ThrowArithmeticExceptionDivideByZero() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers62d6c772013-02-27 08:32:07 -080041
42// ArrayIndexOutOfBoundsException
43
44void ThrowArrayIndexOutOfBoundsException(int index, int length)
Ian Rogersb726dcb2012-09-05 08:57:23 -070045 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070046
Ian Rogers62d6c772013-02-27 08:32:07 -080047// ArrayStoreException
48
49void ThrowArrayStoreException(const mirror::Class* element_class,
50 const mirror::Class* array_class)
Ian Rogersb726dcb2012-09-05 08:57:23 -070051 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070052
Ian Rogers62d6c772013-02-27 08:32:07 -080053// ClassCircularityError
54
55void ThrowClassCircularityError(mirror::Class* c) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
56
57// ClassCastException
58
59void ThrowClassCastException(const mirror::Class* dest_type, const mirror::Class* src_type)
60 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
61
62void ThrowClassCastException(const ThrowLocation* throw_location, const char* msg)
63 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
64
65// ClassFormatError
66
67void ThrowClassFormatError(const mirror::Class* referrer, const char* fmt, ...)
68 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -070069 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
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)
Ian Rogersb726dcb2012-09-05 08:57:23 -070074 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070075
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080076void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
77 const mirror::AbstractMethod* caller,
78 const mirror::AbstractMethod* called,
Ian Rogers87e552d2012-08-31 15:54:48 -070079 InvokeType type)
Ian Rogersb726dcb2012-09-05 08:57:23 -070080 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070081
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080082void ThrowIllegalAccessErrorMethod(mirror::Class* referrer, mirror::AbstractMethod* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070083 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070084
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080085void ThrowIllegalAccessErrorField(mirror::Class* referrer, mirror::Field* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070086 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070087
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080088void ThrowIllegalAccessErrorFinalField(const mirror::AbstractMethod* referrer,
89 mirror::Field* accessed)
Ian Rogersb726dcb2012-09-05 08:57:23 -070090 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -070091
Ian Rogers62d6c772013-02-27 08:32:07 -080092void ThrowIllegalAccessError(mirror::Class* referrer, const char* fmt, ...)
93 __attribute__((__format__(__printf__, 2, 3)))
94 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
95
96// IllegalArgumentException
97
98void ThrowIllegalArgumentException(const ThrowLocation* throw_location, const char* msg)
99 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
100
Ian Rogers87e552d2012-08-31 15:54:48 -0700101// IncompatibleClassChangeError
102
103void ThrowIncompatibleClassChangeError(InvokeType expected_type, InvokeType found_type,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800104 mirror::AbstractMethod* method,
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 ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(const mirror::AbstractMethod* interface_method,
109 mirror::Object* this_object,
110 const mirror::AbstractMethod* referrer)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700111 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700112
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800113void ThrowIncompatibleClassChangeErrorField(const mirror::Field* resolved_field, bool is_static,
114 const mirror::AbstractMethod* referrer)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700115 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700116
Ian Rogers62d6c772013-02-27 08:32:07 -0800117void ThrowIncompatibleClassChangeError(const mirror::Class* referrer, const char* fmt, ...)
118 __attribute__((__format__(__printf__, 2, 3)))
119 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
120
121// LinkageError
122
123void ThrowLinkageError(const mirror::Class* referrer, const char* fmt, ...)
124 __attribute__((__format__(__printf__, 2, 3)))
125 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
126
127// NegativeArraySizeException
128
129void ThrowNegativeArraySizeException(int size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
130
131void ThrowNegativeArraySizeException(const char* msg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
132
133
134// NoSuchFieldError
135
136void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
137 const StringPiece& type, const StringPiece& name)
138 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
139
Ian Rogers87e552d2012-08-31 15:54:48 -0700140// NoSuchMethodError
141
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800142void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
Ian Rogers62d6c772013-02-27 08:32:07 -0800143 const StringPiece& signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700144 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700145
Ian Rogers62d6c772013-02-27 08:32:07 -0800146void ThrowNoSuchMethodError(uint32_t method_idx)
147 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
148
149// NullPointerException
150
151void ThrowNullPointerExceptionForFieldAccess(const ThrowLocation& throw_location,
152 mirror::Field* field,
153 bool is_read)
154 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
155
156void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
157 uint32_t method_idx,
158 InvokeType type)
159 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
160
Sebastien Hertz2d6ba512013-05-17 11:31:37 +0200161void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
162 mirror::AbstractMethod* method,
163 InvokeType type)
164 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
165
Ian Rogers62d6c772013-02-27 08:32:07 -0800166void ThrowNullPointerExceptionFromDexPC(const ThrowLocation& throw_location)
167 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
168
169void ThrowNullPointerException(const ThrowLocation* throw_location, const char* msg)
170 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
171
172// RuntimeException
173
174void ThrowRuntimeException(const char* fmt, ...)
175 __attribute__((__format__(__printf__, 1, 2)))
176 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
177
178// VerifyError
179
180void ThrowVerifyError(const mirror::Class* referrer, const char* fmt, ...)
181 __attribute__((__format__(__printf__, 2, 3)))
Ian Rogersb726dcb2012-09-05 08:57:23 -0700182 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
Ian Rogers87e552d2012-08-31 15:54:48 -0700183
184} // namespace art
185
186#endif // ART_SRC_COMMON_THROWS_H_