interpreter.cc revision 94d6df471a406a03bb1afba8ca3ae9c0fbf366b5
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 212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h" 22373c52fd70336531010268a2de4f7d3b0f236924jeffhao#include "debugger.h" 232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "dex_instruction.h" 242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h" 252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "logging.h" 2664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h" 272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object.h" 282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h" 292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h" 302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h" 312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h" 322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h" 332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 3887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 3987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 4087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 4187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 4264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeInvoke(Thread* self, AbstractMethod* target_method, 4364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 4464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 4664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 4764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(target_method)); 4864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 4964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string descriptor(DotToDescriptor(args[0].GetL()->AsString()->ToModifiedUtf8().c_str())); 5064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 5164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 5264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 5364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 5464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 5564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 5664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 5764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* klass = receiver->AsClass(); 5864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 5964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 6064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 6164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 6264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 6364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 6464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 6564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 6664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 6764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* klass = receiver->AsClass(); 6864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers String* name = args[0].GetL()->AsString(); 6964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 7064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 7464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 7664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 8464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 8964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 9464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 9564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* ctype = args[0].GetL()->GetClass()->GetComponentType(); 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint srcPos = args[1].GetI(); 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint dstPos = args[3].GetI(); 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint length = args[4].GetI(); 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Object>* src = args[0].GetL()->AsObjectArray<Object>(); 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Object>* dst = args[2].GetL()->AsObjectArray<Object>(); 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CharArray* src = args[0].GetL()->AsCharArray(); 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CharArray* dst = args[2].GetL()->AsCharArray(); 11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers IntArray* src = args[0].GetL()->AsIntArray(); 11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers IntArray* dst = args[2].GetL()->AsIntArray(); 11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 12464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers EnterInterpreterFromInvoke(self, target_method, receiver, args, result); 12564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 12764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 12964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 13064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 13564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 13664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers NthCallerVisitor visitor(self->GetManagedStack(), NULL, 3); 13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetD(log(args[0].GetD())); 14164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 14264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(args[0].GetI()); 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetF(args[0].GetF()); 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetD(exp(args[0].GetD())); 14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 15164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers receiver->NotifyAll(); 15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers String* rhs = args[0].GetL()->AsString(); 15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 15764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->FastIndexOf(args[0].GetI(), args[1].GetI())); 16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(Array::CreateMultiArray(self, args[0].GetL()->AsClass(), args[1].GetL()->AsIntArray())); 16364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 16764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 16864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 16964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = args[0].GetL(); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jlong offset = args[1].GetJ(); 17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint expectedValue = args[2].GetI(); 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers jint newValue = args[3].GetI(); 17364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 17564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 17764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 17864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 17964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = args[0].GetL(); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* newValue = args[2].GetL(); 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers obj->SetFieldObject(MemberOffset(args[1].GetJ()), newValue, false); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 18364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 18564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* receiver, JValue* args, JValue* result) 18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 19164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 19364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 199556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 200556d637764b71563030c479bc35364a75188d559Ian Rogers { 201556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 202556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 203556d637764b71563030c479bc35364a75188d559Ian Rogers } 204556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 21064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 21164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 21264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 21364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 21664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 21764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 21864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 21964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 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 result->SetB(fn(soa.Env(), klass.get(), args[0].GetI())); 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 22764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 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->SetI(fn(soa.Env(), klass.get(), args[0].GetI())); 23364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 23464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 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 ScopedLocalRef<jobject> arg0(soa.Env(), 23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 240556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 241556d637764b71563030c479bc35364a75188d559Ian Rogers { 242556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 243556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 244556d637764b71563030c479bc35364a75188d559Ian Rogers } 245556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 25264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ())); 25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 25464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 25564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 25664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 25964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI())); 26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 26364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetS(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ())); 26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 27064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 27164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 27264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 27364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 27464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 27564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()); 27664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 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 ScopedLocalRef<jobject> arg0(soa.Env(), 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 28364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 28664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 29064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 29564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[2].GetL())); 29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), arg2.get())); 29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 29964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[1].GetL())); 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 30664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), args[2].GetI(), args[3].GetI()); 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 30964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 31364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 31564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[2].GetL())); 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI(), arg2.get(), args[3].GetI(), 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers args[4].GetI()); 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 32064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 32464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 32664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 32864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 329556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 330556d637764b71563030c479bc35364a75188d559Ian Rogers { 331556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 332556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 333556d637764b71563030c479bc35364a75188d559Ian Rogers } 334556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 33564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 33764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 34064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(args[0].GetL())); 342556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 343556d637764b71563030c479bc35364a75188d559Ian Rogers { 344556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 345556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 346556d637764b71563030c479bc35364a75188d559Ian Rogers 347556d637764b71563030c479bc35364a75188d559Ian Rogers } 348556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod()); 35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 35664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(fn(soa.Env(), rcvr.get(), args[0].GetI(), args[1].GetI())); 35764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 35964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 36064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 36164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 36264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 36364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 3642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 3662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 3702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoInvoke(Thread* self, MethodHelper& mh, ShadowFrame& shadow_frame, 3732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, InvokeType type, bool is_range, 3742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue* result) 3752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* receiver; 3772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (type == kStatic) { 3782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers receiver = NULL; 3792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 3802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers receiver = shadow_frame.GetReference(dec_insn.vC); 3812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(receiver == NULL)) { 3822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionForMethodAccess(shadow_frame.GetMethod(), dec_insn.vB, type); 3832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 3842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return; 3852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 3862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 3872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t method_idx = dec_insn.vB; 3882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers AbstractMethod* target_method = FindMethodFromCode(method_idx, receiver, 3892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetMethod(), self, true, 3902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers type); 3912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(target_method == NULL)) { 3922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 3932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 3942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return; 3952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 3962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers mh.ChangeMethod(target_method); 3972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ArgArray arg_array(mh.GetShorty(), mh.GetShortyLength()); 3982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_range) { 3992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers arg_array.BuildArgArray(shadow_frame, dec_insn.vC + (type != kStatic ? 1 : 0)); 4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers arg_array.BuildArgArray(shadow_frame, dec_insn.arg + (type != kStatic ? 1 : 0)); 4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 40364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(Runtime::Current()->IsStarted())) { 40464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers target_method->Invoke(self, receiver, arg_array.get(), result); 40564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 40664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UnstartedRuntimeInvoke(self, target_method, receiver, arg_array.get(), result); 40764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 408d752132c73072084a3def9257cca4fcee76047b6jeffhao // Check the return type if the result is non-null. We do the GetReturnType 409d752132c73072084a3def9257cca4fcee76047b6jeffhao // after the null check to avoid resolution when there's an exception pending. 410d752132c73072084a3def9257cca4fcee76047b6jeffhao if (result->GetL() != NULL && !mh.GetReturnType()->IsPrimitive()) { 4112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(mh.GetReturnType()->IsAssignableFrom(result->GetL()->GetClass())); 4122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers mh.ChangeMethod(shadow_frame.GetMethod()); 4142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 4172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, FindFieldType find_type, 4182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Primitive::Type field_type) 4192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 4212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC; 4222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers find_type, Primitive::FieldSize(field_type)); 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (LIKELY(f != NULL)) { 4252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj; 4262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_static) { 4272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = f->GetDeclaringClass(); 4282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 4292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = shadow_frame.GetReference(dec_insn.vB); 4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(obj == NULL)) { 4312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionForFieldAccess(f, true); 432689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers return; 4332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (field_type) { 4362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimBoolean: 4372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetBoolean(obj)); 4382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimByte: 4402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetByte(obj)); 4412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimChar: 4432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetChar(obj)); 4442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimShort: 4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetShort(obj)); 4472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimInt: 4492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, f->GetInt(obj)); 4502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimLong: 4522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, f->GetLong(obj)); 4532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimNot: 4552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, f->GetObject(obj)); 4562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 4582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unreachable: " << field_type; 4592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldPut(Thread* self, ShadowFrame& shadow_frame, 4642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DecodedInstruction& dec_insn, FindFieldType find_type, 4652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Primitive::Type field_type) 4662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 4682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC; 4692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 4702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers find_type, Primitive::FieldSize(field_type)); 4712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (LIKELY(f != NULL)) { 4722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj; 4732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (is_static) { 4742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = f->GetDeclaringClass(); 4752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 4762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers obj = shadow_frame.GetReference(dec_insn.vB); 4772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(obj == NULL)) { 4782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionForFieldAccess(f, false); 479689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers return; 4802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 4822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (field_type) { 4832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimBoolean: 4842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetBoolean(obj, shadow_frame.GetVReg(dec_insn.vA)); 4852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimByte: 4872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetByte(obj, shadow_frame.GetVReg(dec_insn.vA)); 4882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimChar: 4902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetChar(obj, shadow_frame.GetVReg(dec_insn.vA)); 4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimShort: 4932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetShort(obj, shadow_frame.GetVReg(dec_insn.vA)); 4942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimInt: 4962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetInt(obj, shadow_frame.GetVReg(dec_insn.vA)); 4972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 4982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimLong: 4992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetLong(obj, shadow_frame.GetVRegLong(dec_insn.vA)); 5002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Primitive::kPrimNot: 5022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers f->SetObj(obj, shadow_frame.GetReference(dec_insn.vA)); 5032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 5052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unreachable: " << field_type; 5062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 5092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 510d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 511d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 512d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 513d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 514d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 515d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 516d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 517d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 518d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 519d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 520d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 521d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 522d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 523d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 524d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 525d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 526d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 527d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 528d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 529d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 530d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 531d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 532d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 533d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 534d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 535d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 536d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 537d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 538d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 539d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 540d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 541d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 542d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 543d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg, 544d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 545d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 546d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero"); 547d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 548d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 549d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 550d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 553d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 5542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 5552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame& shadow_frame) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 5562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const uint16_t* insns = code_item->insns_; 5572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction* inst = Instruction::At(insns + shadow_frame.GetDexPC()); 5582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result_register; 5592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 560373c52fd70336531010268a2de4f7d3b0f236924jeffhao CheckSuspend(self); 561373c52fd70336531010268a2de4f7d3b0f236924jeffhao uint32_t dex_pc = inst->GetDexPc(insns); 562373c52fd70336531010268a2de4f7d3b0f236924jeffhao shadow_frame.SetDexPC(dex_pc); 563373c52fd70336531010268a2de4f7d3b0f236924jeffhao Dbg::UpdateDebugger(dex_pc, self); 5642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DecodedInstruction dec_insn(inst); 56564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 5662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 5672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << PrettyMethod(shadow_frame.GetMethod()) 5682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers << StringPrintf("\n0x%x: %s\nReferences:", 5692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst->GetDexPc(insns), inst->DumpString(&mh.GetDexFile()).c_str()); 5702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) { 5712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* o = shadow_frame.GetReference(i); 5722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (o != NULL) { 5732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (o->GetClass()->IsStringClass() && o->AsString()->GetCharArray() != NULL) { 5742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": java.lang.String " << static_cast<void*>(o) 5752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers << " \"" << o->AsString()->ToModifiedUtf8() << "\""; 5762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 5772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": " << PrettyTypeOf(o) << " " << static_cast<void*>(o); 5782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 5802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << i << ": null"; 5812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << "vregs:"; 5842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) { 5852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(INFO) << StringPrintf("%d: %08x", i, shadow_frame.GetVReg(i)); 5862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 5882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction* next_inst = inst->Next(); 5892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (dec_insn.opcode) { 5902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 5912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 5932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 5942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 5952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 5962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 5972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 5982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 5992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 6002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 6012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 6032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 6052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 6062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReference(dec_insn.vA, shadow_frame.GetReference(dec_insn.vB)); 6072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 6092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result_register.GetI()); 6102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 6122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, result_register.GetJ()); 6132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 6152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, result_register.GetL()); 6162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 6182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Throwable* exception = self->GetException(); 6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, exception); 6212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 6242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 6262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 6292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 6312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetI(shadow_frame.GetVReg(dec_insn.vA)); 6322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_WIDE: { 6352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(shadow_frame.GetVRegLong(dec_insn.vA)); 6372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 6402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 6412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 6422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetL(shadow_frame.GetReference(dec_insn.vA)); 6432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 6442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 64664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int32_t val = static_cast<int32_t>(dec_insn.vB << 28) >> 28; 6472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReference(dec_insn.vA, NULL); 6502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 6542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = static_cast<int16_t>(dec_insn.vB); 6552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 6572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReference(dec_insn.vA, NULL); 6582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 6622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = dec_insn.vB; 6632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 6652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReference(dec_insn.vA, NULL); 6662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 6702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = dec_insn.vB << 16; 6712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, val); 6722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 6732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReference(dec_insn.vA, NULL); 6742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 67764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 67864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int16_t>(dec_insn.vB)); 6792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 68064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 68164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int32_t>(dec_insn.vB)); 6822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 68464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, dec_insn.vB_wide); 6852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 68764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, static_cast<uint64_t>(dec_insn.vB) << 48); 6882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING: 6902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 6912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(!String::GetJavaLangString()->IsInitialized())) { 6922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Runtime::Current()->GetClassLinker()->EnsureInitialized(String::GetJavaLangString(), 6932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers true, true); 6942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers String* s = mh.ResolveString(dec_insn.vB); 6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, s); 6972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6990a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 7000a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 7010a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao shadow_frame.SetReferenceAndVReg(dec_insn.vA, c); 7022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7030a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 70487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 70587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao Object* obj = shadow_frame.GetReference(dec_insn.vA); 70687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 70787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 70887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 70987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 71087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 71287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 71387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 71487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao Object* obj = shadow_frame.GetReference(dec_insn.vA); 71587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 71687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 71787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 71887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 71987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 72187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 7230a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 72487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 72587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao CHECK(self->IsExceptionPending()); 72687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 72787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao Object* obj = shadow_frame.GetReference(dec_insn.vA); 72887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 72987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao self->ThrowNewExceptionF("Ljava/lang/ClassCastException;", 73087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao "%s cannot be cast to %s", 73187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao PrettyDescriptor(obj->GetClass()).c_str(), 73287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao PrettyDescriptor(c).c_str()); 73387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 7380a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* c = ResolveVerifyAndClinit(dec_insn.vC, shadow_frame.GetMethod(), self, false, true); 73987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 74087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao CHECK(self->IsExceptionPending()); 74187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 74287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao Object* obj = shadow_frame.GetReference(dec_insn.vB); 74387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 74487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 7452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 74864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* array = shadow_frame.GetReference(dec_insn.vB); 7492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 7502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 7512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 75364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.SetVReg(dec_insn.vA, array->AsArray()->GetLength()); 7542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 7572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj = AllocObjectFromCode(dec_insn.vB, shadow_frame.GetMethod(), self, true); 7582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj); 7592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 7622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t length = shadow_frame.GetVReg(dec_insn.vB); 7632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* obj = AllocArrayFromCode(dec_insn.vC, shadow_frame.GetMethod(), length, self, true); 7642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj); 7652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 7662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FILLED_NEW_ARRAY: 76864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::FILLED_NEW_ARRAY_RANGE: { 76964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers bool is_range = (dec_insn.opcode == Instruction::FILLED_NEW_ARRAY_RANGE); 77064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int32_t length = dec_insn.vA; 77164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(is_range || length <= 5); 7720a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao Class* arrayClass = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true); 77364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(arrayClass->IsArrayClass()); 77464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (arrayClass->GetComponentType()->IsPrimitiveInt()) { 77564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers IntArray* newArray = IntArray::Alloc(self, length); 77664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (newArray != NULL) { 77764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < length; ++i) { 77864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (is_range) { 77964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers newArray->Set(i, shadow_frame.GetVReg(dec_insn.vC + i)); 78064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 78164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers newArray->Set(i, shadow_frame.GetVReg(dec_insn.arg[i])); 78264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 78364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 78464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 78564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result_register.SetL(newArray); 78664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 78764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << inst->DumpString(&mh.GetDexFile()) 78864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " for array type: " << PrettyDescriptor(arrayClass); 78964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 7902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 79164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 7922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPL_FLOAT: { 7932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val1 = shadow_frame.GetVRegFloat(dec_insn.vB); 7942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val2 = shadow_frame.GetVRegFloat(dec_insn.vC); 7952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 7962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 7972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 7982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 > val2) { 7992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPG_FLOAT: { 8072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val1 = shadow_frame.GetVRegFloat(dec_insn.vB); 8082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers float val2 = shadow_frame.GetVRegFloat(dec_insn.vC); 8092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 8122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 < val2) { 8132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPL_DOUBLE: { 8212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val1 = shadow_frame.GetVRegDouble(dec_insn.vB); 8222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val2 = shadow_frame.GetVRegDouble(dec_insn.vC); 8232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 82658bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers } else if (val1 > val2) { 8272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 8352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMPG_DOUBLE: { 8362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val1 = shadow_frame.GetVRegDouble(dec_insn.vB); 8372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers double val2 = shadow_frame.GetVRegDouble(dec_insn.vC); 8382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 8392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val1 == val2) { 8402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 84158bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers } else if (val1 < val2) { 8422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = -1; 8432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 8442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 1; 8452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CMP_LONG: { 8502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val1 = shadow_frame.GetVRegLong(dec_insn.vB); 8512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val2 = shadow_frame.GetVRegLong(dec_insn.vC); 8522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t result; 85387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val1 > val2) { 85464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result = 1; 8552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (val1 == val2) { 8562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result = 0; 8572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 85864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result = -1; 8592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, result); 8612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 8642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Throwable* t = shadow_frame.GetReference(dec_insn.vA)->AsThrowable(); 86594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao self->DeliverException(t); 8662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 8682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO: 8692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_16: 8702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 8712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 8722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vA); 8732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 8742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 875556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 876556d637764b71563030c479bc35364a75188d559Ian Rogers uint32_t dex_pc = inst->GetDexPc(insns); 877556d637764b71563030c479bc35364a75188d559Ian Rogers const uint16_t* switch_data = insns + dex_pc + dec_insn.vB; 878556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t test_val = shadow_frame.GetVReg(dec_insn.vA); 879556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 880556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 881556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_GT(size, 0); 882556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 883556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK(IsAligned<4>(keys)); 884556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 885556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 886556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK(IsAligned<4>(targets)); 887556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 888556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 889556d637764b71563030c479bc35364a75188d559Ian Rogers next_inst = Instruction::At(insns + dex_pc + targets[index]); 890556d637764b71563030c479bc35364a75188d559Ian Rogers } 8912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 892556d637764b71563030c479bc35364a75188d559Ian Rogers } 8932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 8942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 895556d637764b71563030c479bc35364a75188d559Ian Rogers const uint16_t* switch_data = insns + dex_pc + dec_insn.vB; 896556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t test_val = shadow_frame.GetVReg(dec_insn.vA); 897556d637764b71563030c479bc35364a75188d559Ian Rogers CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 898556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 8992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK_GT(size, 0); 900556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(IsAligned<4>(keys)); 9022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const int32_t* entries = keys + size; 9032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(IsAligned<4>(entries)); 9042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int lo = 0; 9052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int hi = size - 1; 9062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (lo <= hi) { 9072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int mid = (lo + hi) / 2; 9082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t foundVal = keys[mid]; 909556d637764b71563030c479bc35364a75188d559Ian Rogers if (test_val < foundVal) { 9102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers hi = mid - 1; 911556d637764b71563030c479bc35364a75188d559Ian Rogers } else if (test_val > foundVal) { 9122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers lo = mid + 1; 9132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 9142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + entries[mid]); 9152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FILL_ARRAY_DATA: { 92194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* obj = shadow_frame.GetReference(dec_insn.vA); 92294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao if (UNLIKELY(obj == NULL)) { 9232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Thread::Current()->ThrowNewExceptionF("Ljava/lang/NullPointerException;", 9242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers "null array in FILL_ARRAY_DATA"); 9252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 92794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Array* array = obj->AsArray(); 9282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 9292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction::ArrayDataPayload* payload = 9312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + dex_pc + dec_insn.vB); 9322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 9332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;", 9342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers "failed FILL_ARRAY_DATA; length=%d, index=%d", 9352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers array->GetLength(), payload->element_count); 9362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t size_in_bytes = payload->element_count * payload->element_width; 9392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 9402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 9432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) == shadow_frame.GetVReg(dec_insn.vB)) { 9442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 9502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) != shadow_frame.GetVReg(dec_insn.vB)) { 9512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 9572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) < shadow_frame.GetVReg(dec_insn.vB)) { 9582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 9642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) >= shadow_frame.GetVReg(dec_insn.vB)) { 9652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 9712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) > shadow_frame.GetVReg(dec_insn.vB)) { 9722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 9782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) <= shadow_frame.GetVReg(dec_insn.vB)) { 9792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vC); 9812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 9852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) == 0) { 9862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 9882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 9922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) != 0) { 9932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 9942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 9952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 9972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 9982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 9992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) < 0) { 10002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 10062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) >= 0) { 10072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 10132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) > 0) { 10142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 10202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (shadow_frame.GetVReg(dec_insn.vA) <= 0) { 10212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t dex_pc = inst->GetDexPc(insns); 10222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + dex_pc + dec_insn.vB); 10232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 102794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 103394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsBooleanArray()->Get(index)); 10342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 103794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 104394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsByteArray()->Get(index)); 10442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 104794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 105394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsCharArray()->Get(index)); 10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 105794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 106394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsShortArray()->Get(index)); 10642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 106794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 107394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVReg(dec_insn.vA, a->AsIntArray()->Get(index)); 10742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 107794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 108394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetVRegLong(dec_insn.vA, a->AsLongArray()->Get(index)); 10842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 108794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 10892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 10902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 109394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao shadow_frame.SetReferenceAndVReg(dec_insn.vA, a->AsObjectArray<Object>()->Get(index)); 10942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint8_t val = shadow_frame.GetVReg(dec_insn.vA); 109894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 10992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 110494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsBooleanArray()->Set(index, val); 11052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int8_t val = shadow_frame.GetVReg(dec_insn.vA); 110994d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(dec_insn.vB); 11102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 11112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns)); 11122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t index = shadow_frame.GetVReg(dec_insn.vC); 111594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsByteArray()->Set(index, val); 11162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 11192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t val = shadow_frame.GetVReg(dec_insn.vA); 112094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(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); 112694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao a->AsCharArray()->Set(index, val); 11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 11302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int16_t val = shadow_frame.GetVReg(dec_insn.vA); 113194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(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->AsShortArray()->Set(index, val); 11382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 11412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int32_t val = shadow_frame.GetVReg(dec_insn.vA); 114294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(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->AsIntArray()->Set(index, val); 11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 11522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers int64_t val = shadow_frame.GetVRegLong(dec_insn.vA); 115394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(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->AsLongArray()->Set(index, val); 11602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* val = shadow_frame.GetReference(dec_insn.vA); 116494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao Object* a = shadow_frame.GetReference(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->AsObjectArray<Object>()->Set(index, val); 11712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BOOLEAN: 11742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimBoolean); 11752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BYTE: 11772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimByte); 11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_CHAR: 11802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimChar); 11812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_SHORT: 11832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimShort); 11842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET: 11862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimInt); 11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_WIDE: 11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimLong); 11902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_OBJECT: 11922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, InstanceObjectRead, Primitive::kPrimNot); 11932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BOOLEAN: 11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimBoolean); 11962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BYTE: 11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimByte); 11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_CHAR: 12012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimChar); 12022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_SHORT: 12042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimShort); 12052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET: 12072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimInt); 12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_WIDE: 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimLong); 12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_OBJECT: 12132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldGet(self, shadow_frame, dec_insn, StaticObjectRead, Primitive::kPrimNot); 12142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BOOLEAN: 12162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimBoolean); 12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BYTE: 12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimByte); 12202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_CHAR: 12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimChar); 12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_SHORT: 12252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimShort); 12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT: 12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimInt); 12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_WIDE: 12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimLong); 12322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_OBJECT: 12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, InstanceObjectWrite, Primitive::kPrimNot); 12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BOOLEAN: 12372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimBoolean); 12382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BYTE: 12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimByte); 12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_CHAR: 12432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimChar); 12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_SHORT: 12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimShort); 12472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT: 12492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimInt); 12502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_WIDE: 12522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimLong); 12532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_OBJECT: 12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoFieldPut(self, shadow_frame, dec_insn, StaticObjectWrite, Primitive::kPrimNot); 12562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL: 12582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, false, &result_register); 12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL_RANGE: 12612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, true, &result_register); 12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER: 12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, false, &result_register); 12652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER_RANGE: 12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, true, &result_register); 12682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT: 12702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, false, &result_register); 12712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT_RANGE: 12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, true, &result_register); 12742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE: 12762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, false, &result_register); 12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE_RANGE: 12792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, true, &result_register); 12802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC: 12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, false, &result_register); 12832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC_RANGE: 12852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, true, &result_register); 12862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 12882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, -shadow_frame.GetVReg(dec_insn.vB)); 12892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 12912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 0 ^ shadow_frame.GetVReg(dec_insn.vB)); 12922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 12942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, -shadow_frame.GetVRegLong(dec_insn.vB)); 12952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 12972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 0 ^ shadow_frame.GetVRegLong(dec_insn.vB)); 12982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 13002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, -shadow_frame.GetVRegFloat(dec_insn.vB)); 13012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 13032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, -shadow_frame.GetVRegDouble(dec_insn.vB)); 13042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 13062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 13122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB)); 13132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 13152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 13182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 13212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB)); 13222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 132387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 132487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao float val = shadow_frame.GetVRegFloat(dec_insn.vB); 132587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 132687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, 0); 132787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 132887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMaxInt); 132987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 133087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMinInt); 133187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 133287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, val); 133387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 133587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 133687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 133787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao float val = shadow_frame.GetVRegFloat(dec_insn.vB); 133887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 133987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, 0); 134087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 134187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong); 134287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 134387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMinLong); 134487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 134587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, val); 134687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 134887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 13502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegFloat(dec_insn.vB)); 13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 135287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 135387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao double val = shadow_frame.GetVRegDouble(dec_insn.vB); 135487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 135587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, 0); 135687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 135787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMaxInt); 135887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 135987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, kMinInt); 136087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 136187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVReg(dec_insn.vA, val); 136287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 136487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 136587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 136687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao double val = shadow_frame.GetVRegDouble(dec_insn.vB); 136787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 136887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, 0); 136987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 137087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong); 137187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 137287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, kMinLong); 137387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 137487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao shadow_frame.SetVRegLong(dec_insn.vA, val); 137587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 137787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 13792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegDouble(dec_insn.vB)); 13802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 13822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<int8_t>(shadow_frame.GetVReg(dec_insn.vB))); 13832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 13852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<uint16_t>(shadow_frame.GetVReg(dec_insn.vB))); 13862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 13882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, static_cast<int16_t>(shadow_frame.GetVReg(dec_insn.vB))); 13892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 13912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 13922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) + shadow_frame.GetVReg(dec_insn.vC)); 13932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 13952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 13962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) - shadow_frame.GetVReg(dec_insn.vC)); 13972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 13992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) * shadow_frame.GetVReg(dec_insn.vC)); 14012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT: 1403d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1404d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vC)); 14052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT: 1407d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1408d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vC)); 14092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) << shadow_frame.GetVReg(dec_insn.vC)); 14132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 14152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB) >> shadow_frame.GetVReg(dec_insn.vC)); 14172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 14192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 14202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >> 14212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vC)); 14222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_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::OR_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::XOR_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::ADD_LONG: 14362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) + 14382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 14412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) - 14432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) * 14482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 1451d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB), 1452d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vC)); 14532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 1455d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB), 1456d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vC)); 14572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 14592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) & 14612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 14642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) | 14662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vC)); 14672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_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::SHL_LONG: 14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) << 14762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vC)); 14772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 14792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB) >> 14812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vC)); 14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 14842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 14852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vB)) >> 14862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vC)); 14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 14892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 14902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) + 14912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 14922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 14942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 14952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) - 14962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 14992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) * 15012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 15042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB) / 15062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC)); 15072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 15092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 15102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmodf(shadow_frame.GetVRegFloat(dec_insn.vB), 15112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vC))); 15122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 15142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) + 15162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 15192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) - 15212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 15242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) * 15262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 15292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB) / 15312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC)); 15322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 15342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 15352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmod(shadow_frame.GetVRegDouble(dec_insn.vB), 15362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vC))); 15372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_2ADDR: 15392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) + shadow_frame.GetVReg(dec_insn.vB)); 15412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT_2ADDR: 15432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) - shadow_frame.GetVReg(dec_insn.vB)); 15452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_2ADDR: 15472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) * shadow_frame.GetVReg(dec_insn.vB)); 15492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_2ADDR: 1551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA), 1552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vB)); 15532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_2ADDR: 15552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) << shadow_frame.GetVReg(dec_insn.vB)); 15572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_2ADDR: 15592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) >> shadow_frame.GetVReg(dec_insn.vB)); 15612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_2ADDR: 15632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vA)) >> 15652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB)); 15662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_2ADDR: 15682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 15692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vA) & shadow_frame.GetVReg(dec_insn.vB)); 15702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_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::XOR_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::DIV_INT_2ADDR: 1580d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA), 1581d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVReg(dec_insn.vB)); 15822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG_2ADDR: 15842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) + 15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG_2ADDR: 15892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 15902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) - 15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 15922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG_2ADDR: 15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 159564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) * 15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG_2ADDR: 1599d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA), 1600d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vB)); 16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG_2ADDR: 1603d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA), 1604d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.GetVRegLong(dec_insn.vB)); 16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG_2ADDR: 16072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) & 16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG_2ADDR: 16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) | 16142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vB)); 16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_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::SHL_LONG_2ADDR: 16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) << 16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB)); 16252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG_2ADDR: 16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegLong(dec_insn.vA) >> 16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB)); 16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG_2ADDR: 16322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegLong(dec_insn.vA, 16332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vA)) >> 16342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVReg(dec_insn.vB)); 16352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT_2ADDR: 16372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) + 16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT_2ADDR: 16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) - 16442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT_2ADDR: 16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) * 16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT_2ADDR: 16522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vA) / 16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB)); 16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT_2ADDR: 16572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegFloat(dec_insn.vA, 16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmodf(shadow_frame.GetVRegFloat(dec_insn.vA), 16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegFloat(dec_insn.vB))); 16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE_2ADDR: 16622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) + 16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE_2ADDR: 16672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) - 16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 16702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE_2ADDR: 16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) * 16742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE_2ADDR: 16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vA) / 16792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB)); 16802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE_2ADDR: 16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVRegDouble(dec_insn.vA, 16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers fmod(shadow_frame.GetVRegDouble(dec_insn.vA), 16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetVRegDouble(dec_insn.vB))); 16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 16872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT8: 16882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) + dec_insn.vC); 16892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT_LIT8: 16922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, dec_insn.vC - shadow_frame.GetVReg(dec_insn.vB)); 16932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT8: 16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) * dec_insn.vC); 16972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT16: 16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT8: 1700d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1701d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao dec_insn.vC); 17022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT16: 17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT8: 1705d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB), 1706d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao dec_insn.vC); 17072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT8: 17102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) & dec_insn.vC); 17112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT8: 17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) | dec_insn.vC); 17152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) ^ dec_insn.vC); 17192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_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::SHR_INT_LIT8: 17242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >> dec_insn.vC); 17252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.SetVReg(dec_insn.vA, 17282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >> 17292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers dec_insn.vC); 17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 17332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(self->IsExceptionPending())) { 17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint32_t found_dex_pc = 17372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame.GetMethod()->FindCatchBlock(self->GetException()->GetClass(), 17382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst->GetDexPc(insns)); 17392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (found_dex_pc == DexFile::kDexNoIndex) { 17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 17412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 17422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; // Handler in caller. 17432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 17442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers next_inst = Instruction::At(insns + found_dex_pc); 17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers inst = next_inst; 17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 17512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 17522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue* args, JValue* result) { 175364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 1754d752132c73072084a3def9257cca4fcee76047b6jeffhao if (__builtin_frame_address(0) < self->GetStackEnd()) { 1755d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 1756d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 1757d752132c73072084a3def9257cca4fcee76047b6jeffhao } 1758d752132c73072084a3def9257cca4fcee76047b6jeffhao 17592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 17602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 17612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 17622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 17642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 17652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 17660a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 17670a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao self->ThrowNewExceptionF("Ljava/lang/AbstractMethodError;", "abstract method \"%s\"", 17680a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao PrettyMethod(method).c_str()); 17690a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 17702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 17712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 17722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 17732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 17742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 17752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 17792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 17802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs, num_regs, 17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers (last_shadow_frame == NULL) ? NULL : last_shadow_frame->GetLink(), 17822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers method, 0)); 17832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PushShadowFrame(shadow_frame.get()); 17842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 17852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 17862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 17872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetReferenceAndVReg(cur_reg, receiver); 17882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else if (!method->GetDeclaringClass()->IsInitializing()) { 179094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 179194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao true, true)) { 179294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao DCHECK(Thread::Current()->IsExceptionPending()); 179394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 179494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 17952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 17962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 179764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 17982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t arg_pos = 0; 17992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers for (; cur_reg < num_regs; ++cur_reg, ++arg_pos) { 18002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK_LT(arg_pos + 1, mh.GetShortyLength()); 18012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers switch (shorty[arg_pos + 1]) { 18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Object* o = args[arg_pos].GetL(); 18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetReferenceAndVReg(cur_reg, o); 18052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'J': case 'D': 18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetVRegLong(cur_reg, args[arg_pos].GetJ()); 18092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 18102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 18122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers shadow_frame->SetVReg(cur_reg, args[arg_pos].GetI()); 18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 181664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue r = Execute(self, mh, code_item, *shadow_frame.get()); 18182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (result != NULL) { 18192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *result = r; 18202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 182264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 182364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 182464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 182564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UnstartedRuntimeJni(self, method, receiver, args, result); 18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 182764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers InterpreterJni(self, method, shorty, receiver, args, result); 18282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 18312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 18332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 18342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 1835