interpreter.cc revision 11ffc2d02b7d979f26a8a04013fce3eb4f9a2816
12fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers/* 22fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Copyright (C) 2012 The Android Open Source Project 32fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 42fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * you may not use this file except in compliance with the License. 62fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * You may obtain a copy of the License at 72fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 82fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 92fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Unless required by applicable law or agreed to in writing, software 112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * See the License for the specific language governing permissions and 142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * limitations under the License. 152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers */ 162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "interpreter.h" 182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include <math.h> 202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 2107ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h" 232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h" 24373c52fd70336531010268a2de4f7d3b0f236924jeffhao#include "debugger.h" 252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "dex_instruction.h" 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "gc/card_table-inl.h" 272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h" 2864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h" 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-inl.h" 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h" 372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h" 382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h" 392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h" 402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h" 412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersusing namespace art::mirror; 432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 4887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 4987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 5087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 5187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 529b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic JDWP::FrameId throw_frame_id_ = 0; 539b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic AbstractMethod* throw_method_ = NULL; 549b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic uint32_t throw_dex_pc_ = 0; 559b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao 5664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeInvoke(Thread* self, AbstractMethod* target_method, 5764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 5864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 5964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 6064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 6164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(target_method)); 6264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 6364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string descriptor(DotToDescriptor(args[0].GetL()->AsString()->ToModifiedUtf8().c_str())); 6464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 6564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 6664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 6764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 6864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 6964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 7064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* klass = receiver->AsClass(); 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 7464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 7664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* klass = receiver->AsClass(); 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers String* name = args[0].GetL()->AsString(); 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 8464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 8964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 9464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 9564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* ctype = args[0].GetL()->GetClass()->GetComponentType(); 11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint srcPos = args[1].GetI(); 11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint dstPos = args[3].GetI(); 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint length = args[4].GetI(); 11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Object>* src = args[0].GetL()->AsObjectArray<Object>(); 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Object>* dst = args[2].GetL()->AsObjectArray<Object>(); 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CharArray* src = args[0].GetL()->AsCharArray(); 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CharArray* dst = args[2].GetL()->AsCharArray(); 12464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 12564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 12664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers IntArray* src = args[0].GetL()->AsIntArray(); 12964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers IntArray* dst = args[2].GetL()->AsIntArray(); 13064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 13564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers EnterInterpreterFromInvoke(self, target_method, receiver, args, result); 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 14164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 14264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 1507a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers NthCallerVisitor visitor(self, 3); 15164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetD(log(args[0].GetD())); 15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 15764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(args[0].GetI()); 15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetF(args[0].GetF()); 16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetD(exp(args[0].GetD())); 16364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers receiver->NotifyAll(); 16764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 16864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers String* rhs = args[0].GetL()->AsString(); 16964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 17364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->FastIndexOf(args[0].GetI(), args[1].GetI())); 17564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(Array::CreateMultiArray(self, args[0].GetL()->AsClass(), args[1].GetL()->AsIntArray())); 17764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 17864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 17964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 18364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = args[0].GetL(); 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jlong offset = args[1].GetJ(); 18564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint expectedValue = args[2].GetI(); 18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint newValue = args[3].GetI(); 18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 19164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 19364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = args[0].GetL(); 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* newValue = args[2].GetL(); 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers obj->SetFieldObject(MemberOffset(args[1].GetJ()), newValue, false); 19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 20064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 20164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 20264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 20364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 21064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 21164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 21264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 213556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 214556d637764b71563030c479bc35364a75188d559Ian Rogers { 215556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 216556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 217556d637764b71563030c479bc35364a75188d559Ian Rogers } 218556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 21964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 22164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 22464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 22764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 23064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 23164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 23264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 23364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 23464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 23564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 23864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetB(fn(soa.Env(), klass.get(), args[0].GetI())); 24064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 24164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 24264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), klass.get(), args[0].GetI())); 24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 254556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 255556d637764b71563030c479bc35364a75188d559Ian Rogers { 256556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 257556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 258556d637764b71563030c479bc35364a75188d559Ian Rogers } 259556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 26364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 26664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ())); 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 27064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 27164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 27264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 27364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 27464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 27564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI())); 27664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 27864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 27964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetS(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ())); 28364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 28664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()); 29064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 29264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 29964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 30264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 30964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[2].GetL())); 31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), arg2.get())); 31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 31364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 31564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 32064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), args[2].GetI(), args[3].GetI()); 32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 32464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 32864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[2].GetL())); 33064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 33164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI(), arg2.get(), args[3].GetI(), 33264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers args[4].GetI()); 33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 33464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 33564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 33764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 34064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 34264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 343556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 344556d637764b71563030c479bc35364a75188d559Ian Rogers { 345556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 346556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 347556d637764b71563030c479bc35364a75188d559Ian Rogers } 348556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 356556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 357556d637764b71563030c479bc35364a75188d559Ian Rogers { 358556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 359556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 360556d637764b71563030c479bc35364a75188d559Ian Rogers 361556d637764b71563030c479bc35364a75188d559Ian Rogers } 362556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 36364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 36464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 36564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 36664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 36764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 36864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 36964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 37064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), rcvr.get(), args[0].GetI(), args[1].GetI())); 37164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 37464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 37564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 37664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 37764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 3782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 3802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 3842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoInvoke(Thread* self, MethodHelper& mh, ShadowFrame& shadow_frame, 3872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, InvokeType type, bool is_range, 3882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue* result) 3892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* receiver; 3912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (type == kStatic) { 3922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers receiver = NULL; 3932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 394ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa receiver = shadow_frame.GetVRegReference(dec_insn.vC); 3952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 3962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t method_idx = dec_insn.vB; 3972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers AbstractMethod* target_method = FindMethodFromCode(method_idx, receiver, 3982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetMethod(), self, true, 3992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers type); 4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(target_method == NULL)) { 4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 4032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return; 4042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers mh.ChangeMethod(target_method); 4062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ArgArray arg_array(mh.GetShorty(), mh.GetShortyLength()); 4072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_range) { 4082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers arg_array.BuildArgArray(shadow_frame, dec_insn.vC + (type != kStatic ? 1 : 0)); 4092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 4102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers arg_array.BuildArgArray(shadow_frame, dec_insn.arg + (type != kStatic ? 1 : 0)); 4112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 41264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(Runtime::Current()->IsStarted())) { 41364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers target_method->Invoke(self, receiver, arg_array.get(), result); 41464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 41564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UnstartedRuntimeInvoke(self, target_method, receiver, arg_array.get(), result); 41664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 4172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers mh.ChangeMethod(shadow_frame.GetMethod()); 4182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 4212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, FindFieldType find_type, 4222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Primitive::Type field_type) 4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 4252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC; 4262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 4272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers find_type, Primitive::FieldSize(field_type)); 4282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (LIKELY(f != NULL)) { 4292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj; 4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_static) { 4312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = f->GetDeclaringClass(); 4322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 433ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa obj = shadow_frame.GetVRegReference(dec_insn.vB); 4342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(obj == NULL)) { 4352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionForFieldAccess(f, true); 436689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers return; 4372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (field_type) { 4402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimBoolean: 4412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetBoolean(obj)); 4422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimByte: 4442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetByte(obj)); 4452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimChar: 4472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetChar(obj)); 4482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimShort: 4502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetShort(obj)); 4512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimInt: 4532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetInt(obj)); 4542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimLong: 4562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, f->GetLong(obj)); 4572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimNot: 459ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, f->GetObject(obj)); 4602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 4622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unreachable: " << field_type; 4632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldPut(Thread* self, ShadowFrame& shadow_frame, 4682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, FindFieldType find_type, 4692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Primitive::Type field_type) 4702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 4722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC; 4732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 4742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers find_type, Primitive::FieldSize(field_type)); 4752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (LIKELY(f != NULL)) { 4762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj; 4772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_static) { 4782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = f->GetDeclaringClass(); 4792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 480ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa obj = shadow_frame.GetVRegReference(dec_insn.vB); 4812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(obj == NULL)) { 4822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionForFieldAccess(f, false); 483689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers return; 4842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (field_type) { 4872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimBoolean: 4882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetBoolean(obj, shadow_frame.GetVReg(dec_insn.vA)); 4892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimByte: 4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetByte(obj, shadow_frame.GetVReg(dec_insn.vA)); 4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimChar: 4942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetChar(obj, shadow_frame.GetVReg(dec_insn.vA)); 4952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimShort: 4972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetShort(obj, shadow_frame.GetVReg(dec_insn.vA)); 4982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimInt: 5002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetInt(obj, shadow_frame.GetVReg(dec_insn.vA)); 5012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimLong: 5032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetLong(obj, shadow_frame.GetVRegLong(dec_insn.vA)); 5042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimNot: 506ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa f->SetObj(obj, shadow_frame.GetVRegReference(dec_insn.vA)); 5072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 5092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unreachable: " << field_type; 5102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 5132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 514d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 515d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 516d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 517d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 518d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 519d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 520d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 521d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 522d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 523d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 524d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 525d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 526d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 527d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 528d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 529d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 530d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 531d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 532d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 533d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 534d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 535d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 536d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 537d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 538d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 539d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 540d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 541d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 542d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 543d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 544d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 545d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 546d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 547d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 548d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 549d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 550d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 553d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 554d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 555d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 556d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 557d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 5582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 559306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers ShadowFrame& shadow_frame, JValue result_register) 560306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 5612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const uint16_t* insns = code_item->insns_; 5622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction* inst = Instruction::At(insns + shadow_frame.GetDexPC()); 56314f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao bool entry = (inst->GetDexPc(insns) == 0); 5642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 565373c52fd70336531010268a2de4f7d3b0f236924jeffhao CheckSuspend(self); 566373c52fd70336531010268a2de4f7d3b0f236924jeffhao uint32_t dex_pc = inst->GetDexPc(insns); 567373c52fd70336531010268a2de4f7d3b0f236924jeffhao shadow_frame.SetDexPC(dex_pc); 56814f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao if (entry) { 56914f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao Dbg::UpdateDebugger(-1, self); 57014f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao } 57114f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao entry = false; 572373c52fd70336531010268a2de4f7d3b0f236924jeffhao Dbg::UpdateDebugger(dex_pc, self); 5732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DecodedInstruction dec_insn(inst); 57464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 5752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 5762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << PrettyMethod(shadow_frame.GetMethod()) 5772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers << StringPrintf("\n0x%x: %s\nReferences:", 5782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst->GetDexPc(insns), inst->DumpString(&mh.GetDexFile()).c_str()); 579ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 580ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* o = shadow_frame.GetVRegReference(i); 5812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (o != NULL) { 5822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (o->GetClass()->IsStringClass() && o->AsString()->GetCharArray() != NULL) { 5832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": java.lang.String " << static_cast<void*>(o) 5842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers << " \"" << o->AsString()->ToModifiedUtf8() << "\""; 5852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 5862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": " << PrettyTypeOf(o) << " " << static_cast<void*>(o); 5872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 5892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": null"; 5902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << "vregs:"; 593ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 5942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << StringPrintf("%d: %08x", i, shadow_frame.GetVReg(i)); 5952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction* next_inst = inst->Next(); 5982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (dec_insn.opcode) { 5992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 6002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 6032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 6052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 6072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 6082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 6092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 6102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 6122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 6132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 614ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, shadow_frame.GetVRegReference(dec_insn.vB)); 6152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 6172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result_register.GetI()); 6182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, result_register.GetJ()); 6212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 623ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, result_register.GetL()); 6242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 6262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Throwable* exception = self->GetException(); 6272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 628ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, exception); 6292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 6322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 6342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 6372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 6392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetI(shadow_frame.GetVReg(dec_insn.vA)); 6402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_WIDE: { 6432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(shadow_frame.GetVRegLong(dec_insn.vA)); 6452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 650ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa result.SetL(shadow_frame.GetVRegReference(dec_insn.vA)); 6512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 65464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int32_t val = static_cast<int32_t>(dec_insn.vB << 28) >> 28; 6552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 657ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, NULL); 6582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 6622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = static_cast<int16_t>(dec_insn.vB); 6632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 665ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, NULL); 6662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 6702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = dec_insn.vB; 6712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 673ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, NULL); 6742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 6782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = dec_insn.vB << 16; 6792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 681ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, NULL); 6822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 68564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 68664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int16_t>(dec_insn.vB)); 6872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 68864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 68964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int32_t>(dec_insn.vB)); 6902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 69264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, dec_insn.vB_wide); 6932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 69564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<uint64_t>(dec_insn.vB) << 48); 6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING: 6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 6992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(!String::GetJavaLangString()->IsInitialized())) { 7002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Runtime::Current()->GetClassLinker()->EnsureInitialized(String::GetJavaLangString(), 7012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers true, true); 7022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers String* s = mh.ResolveString(dec_insn.vB); 704ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, s); 7052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7070a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 7080a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 709ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, c); 7102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7110a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 71287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 713ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* obj = shadow_frame.GetVRegReference(dec_insn.vA); 71487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 71587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 71687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 71787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 71887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 72087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 72187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 722ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* obj = shadow_frame.GetVRegReference(dec_insn.vA); 72387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 72487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 72587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 72687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 72787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 72987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 7310a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 73287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 73387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao CHECK(self->IsExceptionPending()); 73487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 735ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* obj = shadow_frame.GetVRegReference(dec_insn.vA); 73687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 73787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao self->ThrowNewExceptionF("Ljava/lang/ClassCastException;", 73887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao "%s cannot be cast to %s", 73987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao PrettyDescriptor(obj->GetClass()).c_str(), 74087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao PrettyDescriptor(c).c_str()); 74187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 7460a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vC, shadow_frame.GetMethod(), self, false, true); 74787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 74887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao CHECK(self->IsExceptionPending()); 74987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 750ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* obj = shadow_frame.GetVRegReference(dec_insn.vB); 75187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 75287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 756ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* array = shadow_frame.GetVRegReference(dec_insn.vB); 7572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 7582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 7592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 76164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVReg(dec_insn.vA, array->AsArray()->GetLength()); 7622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 7652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj = AllocObjectFromCode(dec_insn.vB, shadow_frame.GetMethod(), self, true); 766ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, obj); 7672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 7702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t length = shadow_frame.GetVReg(dec_insn.vB); 7712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj = AllocArrayFromCode(dec_insn.vC, shadow_frame.GetMethod(), length, self, true); 772ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, obj); 7732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FILLED_NEW_ARRAY: 77664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::FILLED_NEW_ARRAY_RANGE: { 77764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers bool is_range = (dec_insn.opcode == Instruction::FILLED_NEW_ARRAY_RANGE); 77864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int32_t length = dec_insn.vA; 77964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(is_range || length <= 5); 78042b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (UNLIKELY(length < 0)) { 78142b4dc4280c25a624bf38e19da70be39d2676232jeffhao self->ThrowNewExceptionF("Ljava/lang/NegativeArraySizeException;", "%d", length); 78242b4dc4280c25a624bf38e19da70be39d2676232jeffhao break; 78342b4dc4280c25a624bf38e19da70be39d2676232jeffhao } 7840a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* arrayClass = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 78542b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (UNLIKELY(arrayClass == NULL)) { 78642b4dc4280c25a624bf38e19da70be39d2676232jeffhao CHECK(self->IsExceptionPending()); 78742b4dc4280c25a624bf38e19da70be39d2676232jeffhao break; 78842b4dc4280c25a624bf38e19da70be39d2676232jeffhao } 78964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(arrayClass->IsArrayClass()); 79042b4dc4280c25a624bf38e19da70be39d2676232jeffhao Class* componentClass = arrayClass->GetComponentType(); 79142b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) { 79242b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) { 79342b4dc4280c25a624bf38e19da70be39d2676232jeffhao self->ThrowNewExceptionF("Ljava/lang/RuntimeException;", 79442b4dc4280c25a624bf38e19da70be39d2676232jeffhao "Bad filled array request for type %s", 79542b4dc4280c25a624bf38e19da70be39d2676232jeffhao PrettyDescriptor(componentClass).c_str()); 79642b4dc4280c25a624bf38e19da70be39d2676232jeffhao } else { 79742b4dc4280c25a624bf38e19da70be39d2676232jeffhao self->ThrowNewExceptionF("Ljava/lang/InternalError;", 79842b4dc4280c25a624bf38e19da70be39d2676232jeffhao "Found type %s; filled-new-array not implemented for anything but \'int\'", 79942b4dc4280c25a624bf38e19da70be39d2676232jeffhao PrettyDescriptor(componentClass).c_str()); 80042b4dc4280c25a624bf38e19da70be39d2676232jeffhao } 80142b4dc4280c25a624bf38e19da70be39d2676232jeffhao break; 80242b4dc4280c25a624bf38e19da70be39d2676232jeffhao } 80342b4dc4280c25a624bf38e19da70be39d2676232jeffhao Object* newArray = Array::Alloc(self, arrayClass, length); 80442b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (newArray != NULL) { 80542b4dc4280c25a624bf38e19da70be39d2676232jeffhao for (int32_t i = 0; i < length; ++i) { 80642b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (is_range) { 80742b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (componentClass->IsPrimitiveInt()) { 80842b4dc4280c25a624bf38e19da70be39d2676232jeffhao newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(dec_insn.vC + i)); 80942b4dc4280c25a624bf38e19da70be39d2676232jeffhao } else { 81042b4dc4280c25a624bf38e19da70be39d2676232jeffhao newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(dec_insn.vC + i)); 81142b4dc4280c25a624bf38e19da70be39d2676232jeffhao } 81242b4dc4280c25a624bf38e19da70be39d2676232jeffhao } else { 81342b4dc4280c25a624bf38e19da70be39d2676232jeffhao if (componentClass->IsPrimitiveInt()) { 81442b4dc4280c25a624bf38e19da70be39d2676232jeffhao newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(dec_insn.arg[i])); 81564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 81642b4dc4280c25a624bf38e19da70be39d2676232jeffhao newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(dec_insn.arg[i])); 81764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 81864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 81964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 82064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 82142b4dc4280c25a624bf38e19da70be39d2676232jeffhao result_register.SetL(newArray); 8222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 82364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 8242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPL_FLOAT: { 8252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val1 = shadow_frame.GetVRegFloat(dec_insn.vB); 8262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val2 = shadow_frame.GetVRegFloat(dec_insn.vC); 8272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 8302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 > val2) { 8312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPG_FLOAT: { 8392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val1 = shadow_frame.GetVRegFloat(dec_insn.vB); 8402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val2 = shadow_frame.GetVRegFloat(dec_insn.vC); 8412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 8442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 < val2) { 8452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPL_DOUBLE: { 8532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val1 = shadow_frame.GetVRegDouble(dec_insn.vB); 8542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val2 = shadow_frame.GetVRegDouble(dec_insn.vC); 8552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 85858bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers } else if (val1 > val2) { 8592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 8672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPG_DOUBLE: { 8682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val1 = shadow_frame.GetVRegDouble(dec_insn.vB); 8692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val2 = shadow_frame.GetVRegDouble(dec_insn.vC); 8702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 87358bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers } else if (val1 < val2) { 8742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMP_LONG: { 8822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val1 = shadow_frame.GetVRegLong(dec_insn.vB); 8832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val2 = shadow_frame.GetVRegLong(dec_insn.vC); 8842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 88587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val1 > val2) { 88664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result = 1; 8872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 == val2) { 8882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 8892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 89064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result = -1; 8912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 8965f548e0a4151ae56c14d88f188872b573599f952Ian Rogers Object* o = shadow_frame.GetVRegReference(dec_insn.vA); 8975f548e0a4151ae56c14d88f188872b573599f952Ian Rogers Throwable* t = (o == NULL) ? NULL : o->AsThrowable(); 89894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao self->DeliverException(t); 8992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO: 9022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_16: 9032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 9042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vA); 9062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 908556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 909556d637764b71563030c479bc35364a75188d559Ian Rogers uint32_t dex_pc = inst->GetDexPc(insns); 910556d637764b71563030c479bc35364a75188d559Ian Rogers const uint16_t* switch_data = insns + dex_pc + dec_insn.vB; 911556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t test_val = shadow_frame.GetVReg(dec_insn.vA); 912556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 913556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 914556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_GT(size, 0); 915556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 916556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK(IsAligned<4>(keys)); 917556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 918556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 919556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK(IsAligned<4>(targets)); 920556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 921556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 922556d637764b71563030c479bc35364a75188d559Ian Rogers next_inst = Instruction::At(insns + dex_pc + targets[index]); 923556d637764b71563030c479bc35364a75188d559Ian Rogers } 9242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 925556d637764b71563030c479bc35364a75188d559Ian Rogers } 9262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 9272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 928556d637764b71563030c479bc35364a75188d559Ian Rogers const uint16_t* switch_data = insns + dex_pc + dec_insn.vB; 929556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t test_val = shadow_frame.GetVReg(dec_insn.vA); 930556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 931556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 9322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK_GT(size, 0); 933556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(IsAligned<4>(keys)); 9352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const int32_t* entries = keys + size; 9362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(IsAligned<4>(entries)); 9372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int lo = 0; 9382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int hi = size - 1; 9392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (lo <= hi) { 9402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int mid = (lo + hi) / 2; 9412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t foundVal = keys[mid]; 942556d637764b71563030c479bc35364a75188d559Ian Rogers if (test_val < foundVal) { 9432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers hi = mid - 1; 944556d637764b71563030c479bc35364a75188d559Ian Rogers } else if (test_val > foundVal) { 9452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers lo = mid + 1; 9462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 9472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + entries[mid]); 9482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FILL_ARRAY_DATA: { 954ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* obj = shadow_frame.GetVRegReference(dec_insn.vA); 95594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao if (UNLIKELY(obj == NULL)) { 9562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Thread::Current()->ThrowNewExceptionF("Ljava/lang/NullPointerException;", 9572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers "null array in FILL_ARRAY_DATA"); 9582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 96094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Array* array = obj->AsArray(); 9612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 9622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction::ArrayDataPayload* payload = 9642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + dex_pc + dec_insn.vB); 9652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 9662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;", 9672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers "failed FILL_ARRAY_DATA; length=%d, index=%d", 9682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers array->GetLength(), payload->element_count); 9692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t size_in_bytes = payload->element_count * payload->element_width; 9722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 9732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 9762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) == shadow_frame.GetVReg(dec_insn.vB)) { 9772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 9832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) != shadow_frame.GetVReg(dec_insn.vB)) { 9842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 9902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) < shadow_frame.GetVReg(dec_insn.vB)) { 9912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 9972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) >= shadow_frame.GetVReg(dec_insn.vB)) { 9982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 10002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 10042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) > shadow_frame.GetVReg(dec_insn.vB)) { 10052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 10072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 10112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) <= shadow_frame.GetVReg(dec_insn.vB)) { 10122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 10142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 10182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) == 0) { 10192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 10252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) != 0) { 10262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 10322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) < 0) { 10332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 10392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) >= 0) { 10402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 10462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) > 0) { 10472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 10532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) <= 0) { 10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 1060ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 10612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 106694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsBooleanArray()->Get(index)); 10672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 1070ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 10712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 107694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsByteArray()->Get(index)); 10772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 1080ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 10812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 108694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsCharArray()->Get(index)); 10872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 1090ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 109694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsShortArray()->Get(index)); 10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 1100ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 110694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsIntArray()->Get(index)); 11072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 1110ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 111694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVRegLong(dec_insn.vA, a->AsLongArray()->Get(index)); 11172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 1120ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 1126ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame.SetVRegReference(dec_insn.vA, a->AsObjectArray<Object>()->Get(index)); 11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 11302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint8_t val = shadow_frame.GetVReg(dec_insn.vA); 1131ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 113794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsBooleanArray()->Set(index, val); 11382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 11412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int8_t val = shadow_frame.GetVReg(dec_insn.vA); 1142ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 114894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsByteArray()->Set(index, val); 11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 11522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t val = shadow_frame.GetVReg(dec_insn.vA); 1153ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 115994d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsCharArray()->Set(index, val); 11602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int16_t val = shadow_frame.GetVReg(dec_insn.vA); 1164ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 117094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsShortArray()->Set(index, val); 11712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 11742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = shadow_frame.GetVReg(dec_insn.vA); 1175ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 118194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsIntArray()->Set(index, val); 11822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 11852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val = shadow_frame.GetVRegLong(dec_insn.vA); 1186ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 119294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsLongArray()->Set(index, val); 11932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 1196ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* val = shadow_frame.GetVRegReference(dec_insn.vA); 1197ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa Object* a = shadow_frame.GetVRegReference(dec_insn.vB); 11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 12002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 120394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsObjectArray<Object>()->Set(index, val); 12042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BOOLEAN: 12072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimBoolean); 12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BYTE: 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimByte); 12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_CHAR: 12132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimChar); 12142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_SHORT: 12162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimShort); 12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET: 12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimInt); 12202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_WIDE: 12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimLong); 12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_OBJECT: 12252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstanceObjectRead, Primitive::kPrimNot); 12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BOOLEAN: 12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimBoolean); 12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BYTE: 12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimByte); 12322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_CHAR: 12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimChar); 12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_SHORT: 12372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimShort); 12382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET: 12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimInt); 12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_WIDE: 12432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimLong); 12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_OBJECT: 12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticObjectRead, Primitive::kPrimNot); 12472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BOOLEAN: 12492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimBoolean); 12502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BYTE: 12522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimByte); 12532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_CHAR: 12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimChar); 12562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_SHORT: 12582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimShort); 12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT: 12612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimInt); 12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_WIDE: 12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimLong); 12652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_OBJECT: 12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstanceObjectWrite, Primitive::kPrimNot); 12682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BOOLEAN: 12702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimBoolean); 12712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BYTE: 12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimByte); 12742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_CHAR: 12762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimChar); 12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_SHORT: 12792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimShort); 12802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT: 12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimInt); 12832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_WIDE: 12852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimLong); 12862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_OBJECT: 12882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticObjectWrite, Primitive::kPrimNot); 12892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL: 12912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, false, &result_register); 12922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL_RANGE: 12942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, true, &result_register); 12952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER: 12972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, false, &result_register); 12982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER_RANGE: 13002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, true, &result_register); 13012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT: 13032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, false, &result_register); 13042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT_RANGE: 13062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, true, &result_register); 13072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE: 13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, false, &result_register); 13102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE_RANGE: 13122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, true, &result_register); 13132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC: 13152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, false, &result_register); 13162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC_RANGE: 13182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, true, &result_register); 13192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 13212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, -shadow_frame.GetVReg(dec_insn.vB)); 13222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 132442b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, ~shadow_frame.GetVReg(dec_insn.vB)); 13252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 13272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, -shadow_frame.GetVRegLong(dec_insn.vB)); 13282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 133042b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVRegLong(dec_insn.vA, ~shadow_frame.GetVRegLong(dec_insn.vB)); 13312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 13332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, -shadow_frame.GetVRegFloat(dec_insn.vB)); 13342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 13362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, -shadow_frame.GetVRegDouble(dec_insn.vB)); 13372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 13392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 13422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 13452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 13482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 13542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 135687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 135787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao float val = shadow_frame.GetVRegFloat(dec_insn.vB); 135887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 135987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, 0); 136087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 136187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMaxInt); 136287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 136387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMinInt); 136487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 136587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, val); 136687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 136887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 136987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 137087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao float val = shadow_frame.GetVRegFloat(dec_insn.vB); 137187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 137287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, 0); 137387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 137487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong); 137587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 137687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMinLong); 137787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 137887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, val); 137987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 138187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 13832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegFloat(dec_insn.vB)); 13842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 138587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 138687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao double val = shadow_frame.GetVRegDouble(dec_insn.vB); 138787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 138887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, 0); 138987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 139087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMaxInt); 139187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 139287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMinInt); 139387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 139487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, val); 139587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 139787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 139887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 139987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao double val = shadow_frame.GetVRegDouble(dec_insn.vB); 140087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 140187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, 0); 140287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 140387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong); 140487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 140587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMinLong); 140687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 140787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, val); 140887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 14092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 141087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 14122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegDouble(dec_insn.vB)); 14132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 14152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<int8_t>(shadow_frame.GetVReg(dec_insn.vB))); 14162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 14182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<uint16_t>(shadow_frame.GetVReg(dec_insn.vB))); 14192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 14212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<int16_t>(shadow_frame.GetVReg(dec_insn.vB))); 14222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 14242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) + shadow_frame.GetVReg(dec_insn.vC)); 14262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 14282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) - shadow_frame.GetVReg(dec_insn.vC)); 14302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 14322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) * shadow_frame.GetVReg(dec_insn.vC)); 14342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT: 1436d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1437d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vC)); 14382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT: 1440d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1441d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vC)); 14422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 144442b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) << 144542b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x1f)); 14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 144842b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >> 144942b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x1f)); 14502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 14522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >> 145442b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x1f)); 14552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT: 14572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) & shadow_frame.GetVReg(dec_insn.vC)); 14592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT: 14612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) | shadow_frame.GetVReg(dec_insn.vC)); 14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT: 14652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) ^ shadow_frame.GetVReg(dec_insn.vC)); 14672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG: 14692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) + 14712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) - 14762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 14792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) * 14812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 1484d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB), 1485d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vC)); 14862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 1488d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB), 1489d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vC)); 14902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 14922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) & 14942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) | 14992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 15002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG: 15022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) ^ 15042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 15052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG: 15072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) << 150942b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x3f)); 15102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 15122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) >> 151442b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x3f)); 15152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 15172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vB)) >> 151942b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vC) & 0x3f)); 15202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 15222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) + 15242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 15272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) - 15292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 15322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) * 15342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 15372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) / 15392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 15422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmodf(shadow_frame.GetVRegFloat(dec_insn.vB), 15442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC))); 15452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 15472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) + 15492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 15522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) - 15542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 15572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) * 15592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 15622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) / 15642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 15672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmod(shadow_frame.GetVRegDouble(dec_insn.vB), 15692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC))); 15702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_2ADDR: 15722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) + shadow_frame.GetVReg(dec_insn.vB)); 15742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT_2ADDR: 15762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) - shadow_frame.GetVReg(dec_insn.vB)); 15782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_2ADDR: 15802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) * shadow_frame.GetVReg(dec_insn.vB)); 15822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_2ADDR: 1584d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA), 1585d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vB)); 15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_2ADDR: 158842b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA) << 158942b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x1f)); 15902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_2ADDR: 159242b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA) >> 159342b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x1f)); 15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_2ADDR: 15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vA)) >> 159842b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x1f)); 15992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_2ADDR: 16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) & shadow_frame.GetVReg(dec_insn.vB)); 16032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_2ADDR: 16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) | shadow_frame.GetVReg(dec_insn.vB)); 16072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_2ADDR: 16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) ^ shadow_frame.GetVReg(dec_insn.vB)); 16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_2ADDR: 1613d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA), 1614d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vB)); 16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG_2ADDR: 16172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) + 16192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG_2ADDR: 16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) - 16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG_2ADDR: 16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 162864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) * 16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG_2ADDR: 1632d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA), 1633d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vB)); 16342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG_2ADDR: 1636d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA), 1637d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vB)); 16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG_2ADDR: 16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) & 16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG_2ADDR: 16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) | 16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG_2ADDR: 16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) ^ 16522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG_2ADDR: 16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) << 165742b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x3f)); 16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG_2ADDR: 16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) >> 166242b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x3f)); 16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG_2ADDR: 16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vA)) >> 166742b4dc4280c25a624bf38e19da70be39d2676232jeffhao (shadow_frame.GetVReg(dec_insn.vB) & 0x3f)); 16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT_2ADDR: 16702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) + 16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT_2ADDR: 16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) - 16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT_2ADDR: 16802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) * 16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT_2ADDR: 16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) / 16872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT_2ADDR: 16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmodf(shadow_frame.GetVRegFloat(dec_insn.vA), 16922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB))); 16932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE_2ADDR: 16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) + 16972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 16982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE_2ADDR: 17002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 17012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) - 17022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 17032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE_2ADDR: 17052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 17062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) * 17072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 17082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE_2ADDR: 17102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 17112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) / 17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE_2ADDR: 17152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 17162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmod(shadow_frame.GetVRegDouble(dec_insn.vA), 17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB))); 17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 17202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT8: 17212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) + dec_insn.vC); 17222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 17242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT_LIT8: 17252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, dec_insn.vC - shadow_frame.GetVReg(dec_insn.vB)); 17262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 17282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT8: 17292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) * dec_insn.vC); 17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT16: 17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT8: 1733d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1734d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao dec_insn.vC); 17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT16: 17372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT8: 1738d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1739d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao dec_insn.vC); 17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 17422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT8: 17432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) & dec_insn.vC); 17442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 17462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT8: 17472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) | dec_insn.vC); 17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 17512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) ^ dec_insn.vC); 17522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_LIT8: 175442b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) << 175542b4dc4280c25a624bf38e19da70be39d2676232jeffhao (dec_insn.vC & 0x1f)); 17562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_LIT8: 175842b4dc4280c25a624bf38e19da70be39d2676232jeffhao shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >> 175942b4dc4280c25a624bf38e19da70be39d2676232jeffhao (dec_insn.vC & 0x1f)); 17602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 17622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >> 176442b4dc4280c25a624bf38e19da70be39d2676232jeffhao (dec_insn.vC & 0x1f)); 17652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 17672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 17682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(self->IsExceptionPending())) { 17719b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao if (throw_frame_id_ == 0) { 17729b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao throw_method_ = shadow_frame.GetMethod(); 17739b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao throw_dex_pc_ = dex_pc; 17749b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao } 17759b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao throw_frame_id_++; 17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t found_dex_pc = 17772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetMethod()->FindCatchBlock(self->GetException()->GetClass(), 17782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst->GetDexPc(insns)); 17792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (found_dex_pc == DexFile::kDexNoIndex) { 17802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 17822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; // Handler in caller. 17832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 17849b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao Dbg::PostException(self, throw_frame_id_, throw_method_, throw_dex_pc_, 17859b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao shadow_frame.GetMethod(), found_dex_pc, self->GetException()); 17869b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao throw_frame_id_ = 0; 17872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + found_dex_pc); 17882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst = next_inst; 17912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 17932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 17942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 17952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue* args, JValue* result) { 179664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 1797d752132c73072084a3def9257cca4fcee76047b6jeffhao if (__builtin_frame_address(0) < self->GetStackEnd()) { 1798d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 1799d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 1800d752132c73072084a3def9257cca4fcee76047b6jeffhao } 1801d752132c73072084a3def9257cca4fcee76047b6jeffhao 18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 18052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 18062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 18090a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 18100a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao self->ThrowNewExceptionF("Ljava/lang/AbstractMethodError;", "abstract method \"%s\"", 18110a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao PrettyMethod(method).c_str()); 18120a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 18142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 18152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 18162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 18182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 18192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 18222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 1823ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs, 18247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers last_shadow_frame, 18252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers method, 0)); 18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PushShadowFrame(shadow_frame.get()); 18272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 18282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 1830ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, receiver); 18312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (!method->GetDeclaringClass()->IsInitializing()) { 183394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 183494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao true, true)) { 183594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao DCHECK(Thread::Current()->IsExceptionPending()); 183694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 183794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 18382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 18392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 184064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 18412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t arg_pos = 0; 18422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers for (; cur_reg < num_regs; ++cur_reg, ++arg_pos) { 18432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK_LT(arg_pos + 1, mh.GetShortyLength()); 18442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (shorty[arg_pos + 1]) { 18452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 18462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* o = args[arg_pos].GetL(); 1847ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, o); 18482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'J': case 'D': 18512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetVRegLong(cur_reg, args[arg_pos].GetJ()); 18522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 18532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 18552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetVReg(cur_reg, args[arg_pos].GetI()); 18562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 185964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 1860306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers JValue r = Execute(self, mh, code_item, *shadow_frame.get(), JValue()); 18612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (result != NULL) { 18622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *result = r; 18632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 186564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 186664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 186764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 186864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UnstartedRuntimeJni(self, method, receiver, args, result); 18692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 187064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers InterpreterJni(self, method, shorty, receiver, args, result); 18712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 18742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 18752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 1876306057fd278d75bf3794bd5243a3b6652c487d18Ian RogersJValue EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame& shadow_frame, JValue ret_val) 1877306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1878306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers MethodHelper mh(shadow_frame.GetMethod()); 1879306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 1880306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers return Execute(self, mh, code_item, shadow_frame, ret_val); 1881306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers} 1882306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers 188311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Haovoid EnterInterpreterFromLLVM(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val) 188411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 188511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao JValue value; 188611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao MethodHelper mh(shadow_frame->GetMethod()); 188711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao const DexFile::CodeItem* code_item = mh.GetCodeItem(); 188811ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao while (shadow_frame != NULL) { 188911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao value = Execute(self, mh, code_item, *shadow_frame, value); 189011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ShadowFrame* old_frame = shadow_frame; 189111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao shadow_frame = shadow_frame->GetLink(); 189211ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao mh.ChangeMethod(shadow_frame->GetMethod()); 189311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao delete old_frame; 189411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao } 189511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ret_val->SetJ(value.GetJ()); 189611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao} 189711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao 18987db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 18997db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers ShadowFrame& shadow_frame) 19007db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 19017db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers return Execute(self, mh, code_item, shadow_frame, JValue()); 19027db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers} 19037db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 19042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 19052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 1906