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