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