157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/* 20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project 357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License. 657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at 757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * 1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software 1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and 1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License. 1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "callee_save_frame.h" 18a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers#include "common_throws.h" 19a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers#include "mirror/object-inl.h" 2057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "thread.h" 21120f1c74a9768e958377b6c97897511b27ae58c8Ian Rogers#include "well_known_classes.h" 2257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2357b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art { 2457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Deliver an exception that's pending on thread helping set up a callee save frame on the way. 2665b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artDeliverPendingExceptionFromCode(Thread* self) 2790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 291d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers self->QuickDeliverException(); 3057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 3157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 3257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Called by generated call to throw an exception. 3365b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artDeliverExceptionFromCode(mirror::Throwable* exception, Thread* self) 3490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 3557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier * exception may be null, in which case this routine should 3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * throw NPE. NOTE: this is a convenience for generated code, 3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * which previously did the null check inline and constructed 392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier * and threw a NPE if null. This routine responsible for setting 4057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * exception_ in thread and delivering the exception. 4157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 431d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers if (exception == nullptr) { 440aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray self->ThrowNewException("Ljava/lang/NullPointerException;", "throw with null exception"); 4562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } else { 4614691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception); 4762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 4862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->QuickDeliverException(); 4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 5057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Called by generated call to throw a NPE exception. 5265b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowNullPointerExceptionFromCode(Thread* self) 5390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 55648d7112609dd19c38131b3e71c37bcbbd19d11eDave Allison self->NoteSignalBeingHandled(); 560aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromDexPC(); 57648d7112609dd19c38131b3e71c37bcbbd19d11eDave Allison self->NoteSignalHandlerDone(); 5894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao self->QuickDeliverException(); 5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 6057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 6157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Called by generated call to throw an arithmetic divide by zero exception. 6265b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowDivZeroFromCode(Thread* self) 6390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 641d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 650a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 6662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->QuickDeliverException(); 6757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers// Called by generated call to throw an array index out of bounds exception. 7065b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowArrayBoundsFromCode(int index, int length, Thread* self) 7190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 7362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowArrayIndexOutOfBoundsException(index, length); 7462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->QuickDeliverException(); 7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 7765b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowStackOverflowFromCode(Thread* self) 7890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 80648d7112609dd19c38131b3e71c37bcbbd19d11eDave Allison self->NoteSignalBeingHandled(); 81d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 82648d7112609dd19c38131b3e71c37bcbbd19d11eDave Allison self->NoteSignalHandlerDone(); 8394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao self->QuickDeliverException(); 8457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 8557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 8665b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowNoSuchMethodFromCode(int32_t method_idx, Thread* self) 8790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 8962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNoSuchMethodError(method_idx); 9094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao self->QuickDeliverException(); 9157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 9257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 9365b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowClassCastException(mirror::Class* dest_type, 9465b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampe mirror::Class* src_type, 9565b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampe Thread* self) 9690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers DCHECK(!dest_type->IsAssignableFrom(src_type)); 99a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers ThrowClassCastException(dest_type, src_type); 100a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers self->QuickDeliverException(); 101a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers} 102a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 10365b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampeextern "C" NO_RETURN void artThrowArrayStoreException(mirror::Object* array, mirror::Object* value, 10465b798ea10dd716c1bb3dda029f9bf255435af72Andreas Gampe Thread* self) 10590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 1061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ScopedQuickEntrypointChecks sqec(self); 107a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers ThrowArrayStoreException(value->GetClass(), array->GetClass()); 108a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers self->QuickDeliverException(); 109a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers} 110a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 11157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} // namespace art 112