summaryrefslogtreecommitdiffstats
path: root/runtime/entrypoints/quick/quick_throw_entrypoints.cc
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2013-10-04 11:17:26 -0700
committerIan Rogers <irogers@google.com>2013-10-08 15:54:54 -0700
commita9a8254c920ce8e22210abfc16c9842ce0aea28f (patch)
tree56614ee997940e8e3b88fef43b890e8a33e78112 /runtime/entrypoints/quick/quick_throw_entrypoints.cc
parent34633b22f74393344987a50b8aaee548a9dadc18 (diff)
downloadart-a9a8254c920ce8e22210abfc16c9842ce0aea28f.zip
art-a9a8254c920ce8e22210abfc16c9842ce0aea28f.tar.gz
art-a9a8254c920ce8e22210abfc16c9842ce0aea28f.tar.bz2
Improve quick codegen for aput-object.
1) don't type check known null. 2) if we know types in verify don't check at runtime. 3) if we're runtime checking then move all the code out-of-line. Also, don't set up a callee-save frame for check-cast, do an instance-of test then throw an exception if that fails. Tidy quick entry point of Ldivmod to Lmod which it is on x86 and mips. Fix monitor-enter/exit NPE for MIPS. Fix benign bug in mirror::Class::CannotBeAssignedFromOtherTypes, a byte[] cannot be assigned to from other types. Change-Id: I9cb3859ec70cca71ed79331ec8df5bec969d6745
Diffstat (limited to 'runtime/entrypoints/quick/quick_throw_entrypoints.cc')
-rw-r--r--runtime/entrypoints/quick/quick_throw_entrypoints.cc20
1 files changed, 19 insertions, 1 deletions
diff --git a/runtime/entrypoints/quick/quick_throw_entrypoints.cc b/runtime/entrypoints/quick/quick_throw_entrypoints.cc
index f67b2fc..31eacac 100644
--- a/runtime/entrypoints/quick/quick_throw_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_throw_entrypoints.cc
@@ -15,8 +15,9 @@
*/
#include "callee_save_frame.h"
+#include "common_throws.h"
#include "entrypoints/entrypoint_utils.h"
-#include "mirror/object.h"
+#include "mirror/object-inl.h"
#include "object_utils.h"
#include "thread.h"
#include "well_known_classes.h"
@@ -95,4 +96,21 @@ extern "C" void artThrowNoSuchMethodFromCode(int32_t method_idx, Thread* self,
self->QuickDeliverException();
}
+extern "C" void artThrowClassCastException(mirror::Class* dest_type, mirror::Class* src_type,
+ Thread* self, mirror::ArtMethod** sp)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ FinishCalleeSaveFrameSetup(self, sp, Runtime::kSaveAll);
+ CHECK(!dest_type->IsAssignableFrom(src_type));
+ ThrowClassCastException(dest_type, src_type);
+ self->QuickDeliverException();
+}
+
+extern "C" void artThrowArrayStoreException(mirror::Object* array, mirror::Object* value,
+ Thread* self, mirror::ArtMethod** sp)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ FinishCalleeSaveFrameSetup(self, sp, Runtime::kSaveAll);
+ ThrowArrayStoreException(value->GetClass(), array->GetClass());
+ self->QuickDeliverException();
+}
+
} // namespace art