12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "calling_convention.h" 182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1907ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "jni/quick/arm/calling_convention_arm.h" 21b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith#include "jni/quick/arm64/calling_convention_arm64.h" 227940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "jni/quick/mips/calling_convention_mips.h" 236ea651f0f4c7de4580beb2e887d86802c1ae0738Maja Gagic#include "jni/quick/mips64/calling_convention_mips64.h" 247940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "jni/quick/x86/calling_convention_x86.h" 25fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "jni/quick/x86_64/calling_convention_x86_64.h" 26b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersnamespace art { 28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 29df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers// Managed runtime calling convention 30df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 312c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersManagedRuntimeCallingConvention* ManagedRuntimeCallingConvention::Create( 32169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers bool is_static, bool is_synchronized, const char* shorty, InstructionSet instruction_set) { 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao switch (instruction_set) { 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kArm: 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kThumb2: 367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new arm::ArmManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 37b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith case kArm64: 38b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith return new arm64::Arm64ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kMips: 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new mips::MipsManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 416ea651f0f4c7de4580beb2e887d86802c1ae0738Maja Gagic case kMips64: 426ea651f0f4c7de4580beb2e887d86802c1ae0738Maja Gagic return new mips64::Mips64ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kX86: 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new x86::X86ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 45fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 46fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return new x86_64::X86_64ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao default: 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool ManagedRuntimeCallingConvention::HasNext() { 54169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return itr_args_ < NumArgs(); 55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 56b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 57b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid ManagedRuntimeCallingConvention::Next() { 58b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(HasNext()); 597a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers if (IsCurrentArgExplicit() && // don't query parameter type of implicit args 60169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers IsParamALongOrDouble(itr_args_)) { 61b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers itr_longs_and_doubles_++; 625381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 63b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (IsParamAFloatOrDouble(itr_args_)) { 65fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko itr_float_and_doubles_++; 66fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 67668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao if (IsCurrentParamAReference()) { 68668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao itr_refs_++; 69668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao } 705381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_args_++; 715381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 72b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 73b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 747a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentArgExplicit() { 757a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers // Static methods have no implicit arguments, others implicitly pass this 76169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsStatic() || (itr_args_ != 0); 777a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers} 787a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers 797a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentArgPossiblyNull() { 807a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers return IsCurrentArgExplicit(); // any user parameter may be null 81b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 82b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 83df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogerssize_t ManagedRuntimeCallingConvention::CurrentParamSize() { 84169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return ParamSize(itr_args_); 85b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 86b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 87b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentParamAReference() { 88169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsParamAReference(itr_args_); 89b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 90b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 91fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkobool ManagedRuntimeCallingConvention::IsCurrentParamAFloatOrDouble() { 92fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return IsParamAFloatOrDouble(itr_args_); 93fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 94fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 9575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool ManagedRuntimeCallingConvention::IsCurrentParamADouble() { 9675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamADouble(itr_args_); 9775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 9875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 9975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool ManagedRuntimeCallingConvention::IsCurrentParamALong() { 10075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamALong(itr_args_); 10175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 10275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 103df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers// JNI calling convention 104b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 105169c9a7f46776b235d0a37d5e0ff27682deffe06Ian RogersJniCallingConvention* JniCallingConvention::Create(bool is_static, bool is_synchronized, 106169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers const char* shorty, 107169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers InstructionSet instruction_set) { 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao switch (instruction_set) { 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kArm: 1107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kThumb2: 1117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new arm::ArmJniCallingConvention(is_static, is_synchronized, shorty); 112b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith case kArm64: 113b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith return new arm64::Arm64JniCallingConvention(is_static, is_synchronized, shorty); 1147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kMips: 1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new mips::MipsJniCallingConvention(is_static, is_synchronized, shorty); 1166ea651f0f4c7de4580beb2e887d86802c1ae0738Maja Gagic case kMips64: 1176ea651f0f4c7de4580beb2e887d86802c1ae0738Maja Gagic return new mips64::Mips64JniCallingConvention(is_static, is_synchronized, shorty); 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kX86: 1197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new x86::X86JniCallingConvention(is_static, is_synchronized, shorty); 120fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 121fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return new x86_64::X86_64JniCallingConvention(is_static, is_synchronized, shorty); 1227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao default: 1237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 1242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 1252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 1262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 1272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 128dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogerssize_t JniCallingConvention::ReferenceCount() const { 129169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return NumReferenceArgs() + (IsStatic() ? 1 : 0); 130b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 131b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1325a7a74a042e73a355f5cedffa0d2faf5340028faIan RogersFrameOffset JniCallingConvention::SavedLocalReferenceCookieOffset() const { 133eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier size_t references_size = handle_scope_pointer_size_ * ReferenceCount(); // size excluding header 1343d21bdf8894e780d349c481e5c9e29fe1556051cMathieu Chartier return FrameOffset(HandleReferencesOffset().Int32Value() + references_size); 135df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 136df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 137dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian RogersFrameOffset JniCallingConvention::ReturnValueSaveLocation() const { 138dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers // Segment state is 4 bytes long 1395a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers return FrameOffset(SavedLocalReferenceCookieOffset().Int32Value() + 4); 140dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 141dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 142b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool JniCallingConvention::HasNext() { 1435381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ <= kObjectOrClass) { 144b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return true; 145b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 146169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers unsigned int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 147169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return arg_pos < NumArgs(); 148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 149b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid JniCallingConvention::Next() { 152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(HasNext()); 1535381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ > kObjectOrClass) { 154169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 155169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers if (IsParamALongOrDouble(arg_pos)) { 156b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers itr_longs_and_doubles_++; 1575381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 159b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 160fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (IsCurrentParamAFloatOrDouble()) { 161fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko itr_float_and_doubles_++; 162fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 163668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao if (IsCurrentParamAReference()) { 164668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao itr_refs_++; 165668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao } 1665381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_args_++; 1675381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 168b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 169b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 170b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool JniCallingConvention::IsCurrentParamAReference() { 1715381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao switch (itr_args_) { 172b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case kJniEnv: 173b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return false; // JNIEnv* 174b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case kObjectOrClass: 175b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return true; // jobject or jclass 176b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers default: { 177169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 178169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsParamAReference(arg_pos); 179b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 180b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 181b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 182b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 18375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamJniEnv() { 18475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return (itr_args_ == kJniEnv); 18575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 18675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 187fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkobool JniCallingConvention::IsCurrentParamAFloatOrDouble() { 188fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko switch (itr_args_) { 189fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kJniEnv: 190fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return false; // JNIEnv* 191fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kObjectOrClass: 192fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return false; // jobject or jclass 193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko default: { 194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return IsParamAFloatOrDouble(arg_pos); 196fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 197fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 198fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 199fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 20075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamADouble() { 20175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu switch (itr_args_) { 20275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kJniEnv: 20375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // JNIEnv* 20475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kObjectOrClass: 20575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // jobject or jclass 20675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu default: { 20775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 20875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamADouble(arg_pos); 20975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 21075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 21175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 21275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 21375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamALong() { 21475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu switch (itr_args_) { 21575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kJniEnv: 21675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // JNIEnv* 21775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kObjectOrClass: 21875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // jobject or jclass 21975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu default: { 22075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 22175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamALong(arg_pos); 22275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 22375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 22475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 22575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 226eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Return position of handle scope entry holding reference at the current iterator 227408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers// position 228eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu ChartierFrameOffset JniCallingConvention::CurrentParamHandleScopeEntryOffset() { 229b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsCurrentParamAReference()); 230eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier CHECK_LT(HandleScopeLinkOffset(), HandleScopeNumRefsOffset()); 2313d21bdf8894e780d349c481e5c9e29fe1556051cMathieu Chartier int result = HandleReferencesOffset().Int32Value() + itr_refs_ * handle_scope_pointer_size_; 232eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier CHECK_GT(result, HandleScopeNumRefsOffset().Int32Value()); 233b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return FrameOffset(result); 234b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 235b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 236df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogerssize_t JniCallingConvention::CurrentParamSize() { 2375381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ <= kObjectOrClass) { 238790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers return frame_pointer_size_; // JNIEnv or jobject/jclass 239b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 240169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 241169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return ParamSize(arg_pos); 242b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 243b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 244b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 245169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogerssize_t JniCallingConvention::NumberOfExtraArgumentsForJni() { 2465381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao // The first argument is the JNIEnv*. 2475381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao // Static methods have an extra argument which is the jclass. 248169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsStatic() ? 2 : 1; 2495381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao} 2505381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao 251b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 252