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