calling_convention.cc revision eb8167a4f4d27fce0530f6724ab8032610cd146b
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" 237940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "jni/quick/x86/calling_convention_x86.h" 24fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "jni/quick/x86_64/calling_convention_x86_64.h" 25578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "utils.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); 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kX86: 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new x86::X86ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 43fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return new x86_64::X86_64ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty); 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao default: 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return NULL; 482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 51b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool ManagedRuntimeCallingConvention::HasNext() { 52169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return itr_args_ < NumArgs(); 53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 54b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid ManagedRuntimeCallingConvention::Next() { 56b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(HasNext()); 577a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers if (IsCurrentArgExplicit() && // don't query parameter type of implicit args 58169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers IsParamALongOrDouble(itr_args_)) { 59b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers itr_longs_and_doubles_++; 605381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 61b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 62fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (IsParamAFloatOrDouble(itr_args_)) { 63fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko itr_float_and_doubles_++; 64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 65668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao if (IsCurrentParamAReference()) { 66668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao itr_refs_++; 67668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao } 685381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_args_++; 695381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 70b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 71b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 727a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentArgExplicit() { 737a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers // Static methods have no implicit arguments, others implicitly pass this 74169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsStatic() || (itr_args_ != 0); 757a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers} 767a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers 777a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentArgPossiblyNull() { 787a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers return IsCurrentArgExplicit(); // any user parameter may be null 79b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 80b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 81df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogerssize_t ManagedRuntimeCallingConvention::CurrentParamSize() { 82169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return ParamSize(itr_args_); 83b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 84b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 85b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool ManagedRuntimeCallingConvention::IsCurrentParamAReference() { 86169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsParamAReference(itr_args_); 87b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 88b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 89fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkobool ManagedRuntimeCallingConvention::IsCurrentParamAFloatOrDouble() { 90fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return IsParamAFloatOrDouble(itr_args_); 91fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 92fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 9375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool ManagedRuntimeCallingConvention::IsCurrentParamADouble() { 9475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamADouble(itr_args_); 9575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 9675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 9775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool ManagedRuntimeCallingConvention::IsCurrentParamALong() { 9875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamALong(itr_args_); 9975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 10075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 101df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers// JNI calling convention 102b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 103169c9a7f46776b235d0a37d5e0ff27682deffe06Ian RogersJniCallingConvention* JniCallingConvention::Create(bool is_static, bool is_synchronized, 104169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers const char* shorty, 105169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers InstructionSet instruction_set) { 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao switch (instruction_set) { 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kArm: 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kThumb2: 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new arm::ArmJniCallingConvention(is_static, is_synchronized, shorty); 110b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith case kArm64: 111b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith return new arm64::Arm64JniCallingConvention(is_static, is_synchronized, shorty); 1127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kMips: 1137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new mips::MipsJniCallingConvention(is_static, is_synchronized, shorty); 1147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao case kX86: 1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return new x86::X86JniCallingConvention(is_static, is_synchronized, shorty); 116fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 117fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return new x86_64::X86_64JniCallingConvention(is_static, is_synchronized, shorty); 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao default: 1197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 1207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return NULL; 1212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 1222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 1232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 124dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogerssize_t JniCallingConvention::ReferenceCount() const { 125169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return NumReferenceArgs() + (IsStatic() ? 1 : 0); 126b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 127b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1285a7a74a042e73a355f5cedffa0d2faf5340028faIan RogersFrameOffset JniCallingConvention::SavedLocalReferenceCookieOffset() const { 129eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier size_t references_size = handle_scope_pointer_size_ * ReferenceCount(); // size excluding header 130eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier return FrameOffset(HandleerencesOffset().Int32Value() + references_size); 131df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 132df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 133dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian RogersFrameOffset JniCallingConvention::ReturnValueSaveLocation() const { 134dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers // Segment state is 4 bytes long 1355a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers return FrameOffset(SavedLocalReferenceCookieOffset().Int32Value() + 4); 136dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 137dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 138b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool JniCallingConvention::HasNext() { 1395381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ <= kObjectOrClass) { 140b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return true; 141b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 142169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers unsigned int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 143169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return arg_pos < NumArgs(); 144b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 145b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 146b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 147b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid JniCallingConvention::Next() { 148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(HasNext()); 1495381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ > kObjectOrClass) { 150169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 151169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers if (IsParamALongOrDouble(arg_pos)) { 152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers itr_longs_and_doubles_++; 1535381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 154b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 155b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 156fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (IsCurrentParamAFloatOrDouble()) { 157fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko itr_float_and_doubles_++; 158fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 159668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao if (IsCurrentParamAReference()) { 160668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao itr_refs_++; 161668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao } 1625381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_args_++; 1635381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao itr_slots_++; 164b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 165b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 166b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersbool JniCallingConvention::IsCurrentParamAReference() { 1675381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao switch (itr_args_) { 168b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case kJniEnv: 169b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return false; // JNIEnv* 170b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers case kObjectOrClass: 171b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return true; // jobject or jclass 172b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers default: { 173169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 174169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsParamAReference(arg_pos); 175b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 176b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 177b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 178b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamJniEnv() { 18075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return (itr_args_ == kJniEnv); 18175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 18275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 183fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkobool JniCallingConvention::IsCurrentParamAFloatOrDouble() { 184fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko switch (itr_args_) { 185fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kJniEnv: 186fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return false; // JNIEnv* 187fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kObjectOrClass: 188fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return false; // jobject or jclass 189fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko default: { 190fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 191fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return IsParamAFloatOrDouble(arg_pos); 192fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 19675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamADouble() { 19775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu switch (itr_args_) { 19875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kJniEnv: 19975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // JNIEnv* 20075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kObjectOrClass: 20175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // jobject or jclass 20275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu default: { 20375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 20475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamADouble(arg_pos); 20575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 20675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 20775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 20875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 20975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescubool JniCallingConvention::IsCurrentParamALong() { 21075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu switch (itr_args_) { 21175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kJniEnv: 21275b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // JNIEnv* 21375b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu case kObjectOrClass: 21475b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return false; // jobject or jclass 21575b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu default: { 21675b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 21775b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu return IsParamALong(arg_pos); 21875b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 21975b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu } 22075b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu} 22175b9113b2b0a5807043af2a669a93d1579af8e2cSerban Constantinescu 222eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Return position of handle scope entry holding reference at the current iterator 223408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers// position 224eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu ChartierFrameOffset JniCallingConvention::CurrentParamHandleScopeEntryOffset() { 225b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsCurrentParamAReference()); 226eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier CHECK_LT(HandleScopeLinkOffset(), HandleScopeNumRefsOffset()); 227eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier int result = HandleerencesOffset().Int32Value() + itr_refs_ * handle_scope_pointer_size_; 228eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier CHECK_GT(result, HandleScopeNumRefsOffset().Int32Value()); 229b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return FrameOffset(result); 230b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 231b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 232df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogerssize_t JniCallingConvention::CurrentParamSize() { 2335381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao if (itr_args_ <= kObjectOrClass) { 234790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers return frame_pointer_size_; // JNIEnv or jobject/jclass 235b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 236169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers int arg_pos = itr_args_ - NumberOfExtraArgumentsForJni(); 237169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return ParamSize(arg_pos); 238b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 239b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 240b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 241169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogerssize_t JniCallingConvention::NumberOfExtraArgumentsForJni() { 2425381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao // The first argument is the JNIEnv*. 2435381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao // Static methods have an extra argument which is the jclass. 244169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers return IsStatic() ? 2 : 1; 2455381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao} 2465381cf941d26030199fcdbe61a614ff01e55a27cShih-wei Liao 247b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 248