Optimize aput-object in interpreter.

Inline ObjectArray::Set test about valid index and valid object. Adding
ObjectArray::IsValidObject method to check for ArrayStoreException and
call it from interpreter.

Change-Id: I99beeb531455049fc189f9b8e8f4f020591f7bab
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 5992c67..cda376b 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -1687,10 +1687,15 @@
           HANDLE_PENDING_EXCEPTION();
           break;
         }
-        Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x());
         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
-        a->AsObjectArray<Object>()->Set(index, val);
-        POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx);
+        Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x());
+        ObjectArray<Object>* array = a->AsObjectArray<Object>();
+        if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) {
+          array->SetWithoutChecks(index, val);
+          inst = inst->Next_2xx();
+        } else {
+          HANDLE_PENDING_EXCEPTION();
+        }
         break;
       }
       case Instruction::IGET_BOOLEAN: