1 /*
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_RUNTIME_COMMON_THROWS_H_
18 #define ART_RUNTIME_COMMON_THROWS_H_
19 
20 #include "base/mutex.h"
21 #include "invoke_type.h"
22 
23 namespace art {
24 namespace mirror {
25   class ArtField;
26   class ArtMethod;
27   class Class;
28   class Object;
29 }  // namespace mirror
30 class Signature;
31 class StringPiece;
32 class ThrowLocation;
33 
34 // AbstractMethodError
35 
36 void ThrowAbstractMethodError(mirror::ArtMethod* method)
37     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
38 
39 // ArithmeticException
40 
41 void ThrowArithmeticExceptionDivideByZero() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
42 
43 // ArrayIndexOutOfBoundsException
44 
45 void ThrowArrayIndexOutOfBoundsException(int index, int length)
46     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
47 
48 // ArrayStoreException
49 
50 void ThrowArrayStoreException(mirror::Class* element_class, mirror::Class* array_class)
51     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
52 
53 // ClassCircularityError
54 
55 void ThrowClassCircularityError(mirror::Class* c)
56     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
57 
58 // ClassCastException
59 
60 void ThrowClassCastException(mirror::Class* dest_type, mirror::Class* src_type)
61     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
62 
63 void ThrowClassCastException(const ThrowLocation* throw_location, const char* msg)
64     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
65 
66 // ClassFormatError
67 
68 void ThrowClassFormatError(mirror::Class* referrer, const char* fmt, ...)
69     __attribute__((__format__(__printf__, 2, 3)))
70     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
71 
72 // IllegalAccessError
73 
74 void ThrowIllegalAccessErrorClass(mirror::Class* referrer, mirror::Class* accessed)
75     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
76 
77 void ThrowIllegalAccessErrorClassForMethodDispatch(mirror::Class* referrer, mirror::Class* accessed,
78                                                    mirror::ArtMethod* called,
79                                                    InvokeType type)
80     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
81 
82 void ThrowIllegalAccessErrorMethod(mirror::Class* referrer, mirror::ArtMethod* accessed)
83     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
84 
85 void ThrowIllegalAccessErrorField(mirror::Class* referrer, mirror::ArtField* accessed)
86     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
87 
88 void ThrowIllegalAccessErrorFinalField(mirror::ArtMethod* referrer, mirror::ArtField* accessed)
89     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
90 
91 void ThrowIllegalAccessError(mirror::Class* referrer, const char* fmt, ...)
92     __attribute__((__format__(__printf__, 2, 3)))
93     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
94 
95 // IllegalAccessException
96 
97 void ThrowIllegalAccessException(const ThrowLocation* throw_location, const char* msg)
98     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
99 
100 // IllegalArgumentException
101 
102 void ThrowIllegalArgumentException(const ThrowLocation* throw_location, const char* msg)
103     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
104 
105 // IncompatibleClassChangeError
106 
107 void ThrowIncompatibleClassChangeError(InvokeType expected_type, InvokeType found_type,
108                                        mirror::ArtMethod* method, mirror::ArtMethod* referrer)
109     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
110 
111 void ThrowIncompatibleClassChangeErrorClassForInterfaceDispatch(mirror::ArtMethod* interface_method,
112                                                                 mirror::Object* this_object,
113                                                                 mirror::ArtMethod* referrer)
114     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
115 
116 void ThrowIncompatibleClassChangeErrorField(mirror::ArtField* resolved_field, bool is_static,
117                                             mirror::ArtMethod* referrer)
118     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
119 
120 void ThrowIncompatibleClassChangeError(mirror::Class* referrer, const char* fmt, ...)
121     __attribute__((__format__(__printf__, 2, 3)))
122     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
123 
124 // IOException
125 
126 void ThrowIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
127     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
128 
129 void ThrowWrappedIOException(const char* fmt, ...) __attribute__((__format__(__printf__, 1, 2)))
130     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
131 
132 // LinkageError
133 
134 void ThrowLinkageError(mirror::Class* referrer, const char* fmt, ...)
135     __attribute__((__format__(__printf__, 2, 3)))
136     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
137 
138 // NegativeArraySizeException
139 
140 void ThrowNegativeArraySizeException(int size)
141     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
142 
143 void ThrowNegativeArraySizeException(const char* msg)
144     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
145 
146 
147 // NoSuchFieldError
148 
149 void ThrowNoSuchFieldError(const StringPiece& scope, mirror::Class* c,
150                            const StringPiece& type, const StringPiece& name)
151     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
152 
153 // NoSuchMethodError
154 
155 void ThrowNoSuchMethodError(InvokeType type, mirror::Class* c, const StringPiece& name,
156                             const Signature& signature)
157     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
158 
159 void ThrowNoSuchMethodError(uint32_t method_idx)
160     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
161 
162 // NullPointerException
163 
164 void ThrowNullPointerExceptionForFieldAccess(const ThrowLocation& throw_location,
165                                              mirror::ArtField* field,
166                                              bool is_read)
167     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
168 
169 void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
170                                               uint32_t method_idx,
171                                               InvokeType type)
172     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
173 
174 void ThrowNullPointerExceptionForMethodAccess(const ThrowLocation& throw_location,
175                                               mirror::ArtMethod* method,
176                                               InvokeType type)
177     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
178 
179 void ThrowNullPointerExceptionFromDexPC(const ThrowLocation& throw_location)
180     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
181 
182 void ThrowNullPointerException(const ThrowLocation* throw_location, const char* msg)
183     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
184 
185 // RuntimeException
186 
187 void ThrowRuntimeException(const char* fmt, ...)
188     __attribute__((__format__(__printf__, 1, 2)))
189     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
190 
191 // VerifyError
192 
193 void ThrowVerifyError(mirror::Class* referrer, const char* fmt, ...)
194     __attribute__((__format__(__printf__, 2, 3)))
195     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) COLD_ATTR;
196 
197 }  // namespace art
198 
199 #endif  // ART_RUNTIME_COMMON_THROWS_H_
200