1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Functions for dealing with method prototypes
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef LIBDEX_DEXPROTO_H_
22375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define LIBDEX_DEXPROTO_H_
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "DexFile.h"
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Single-thread single-string cache. This structure holds a pointer to
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a string which is semi-automatically manipulated by some of the
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * method prototype functions. Functions which use in this struct
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * generally return a string that is valid until the next
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * time the same DexStringCache is used.
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
33bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexStringCache {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char* value;          /* the latest value */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    size_t allocatedSize; /* size of the allocated buffer, if allocated */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char buffer[120];     /* buffer used to hold small-enough results */
37bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
403c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson * Make sure that the given cache can hold a string of the given length,
413c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson * including the final '\0' byte.
423c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson */
433c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilsonvoid dexStringCacheAlloc(DexStringCache* pCache, size_t length);
443c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson
453c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson/*
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialize the given DexStringCache. Use this function before passing
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one into any other function.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexStringCacheInit(DexStringCache* pCache);
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Release the allocated contents of the given DexStringCache, if any.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Use this function after your last use of a DexStringCache.
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexStringCacheRelease(DexStringCache* pCache);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the given DexStringCache doesn't already point at the given value,
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * make a copy of it into the cache. This always returns a writable
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer to the contents (whether or not a copy had to be made). This
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * function is intended to be used after making a call that at least
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sometimes doesn't populate a DexStringCache.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dexStringCacheEnsureCopy(DexStringCache* pCache, const char* value);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Abandon the given DexStringCache, and return a writable copy of the
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given value (reusing the string cache's allocation if possible).
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The return value must be free()d by the caller. Use this instead of
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dexStringCacheRelease() if you want the buffer to survive past the
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * scope of the DexStringCache.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dexStringCacheAbandon(DexStringCache* pCache, const char* value);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Method prototype structure, which refers to a protoIdx in a
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * particular DexFile.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
79bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexProto {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* dexFile;     /* file the idx refers to */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 protoIdx;                /* index into proto_ids table of dexFile */
82bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set the given DexProto to refer to the prototype of the given MethodId.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE void dexProtoSetFromMethodId(DexProto* pProto,
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexMethodId* pMethodId)
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pProto->dexFile = pDexFile;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    pProto->protoIdx = pMethodId->protoIdx;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the short-form method descriptor for the given prototype. The
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * prototype must be protoIdx-based.
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexProtoGetShorty(const DexProto* pProto);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the full method descriptor for the given prototype.
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexProtoGetMethodDescriptor(const DexProto* pProto,
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexStringCache* pCache);
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get a copy of the descriptor string associated with the given prototype.
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The returned pointer must be free()ed by the caller.
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dexProtoCopyMethodDescriptor(const DexProto* pProto);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the parameter descriptors for the given prototype. This is the
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * concatenation of all the descriptors for all the parameters, in
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * order, with no other adornment.
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexProtoGetParameterDescriptors(const DexProto* pProto,
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexStringCache* pCache);
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the utf-8 encoded descriptor string from the proto of a MethodId.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetDescriptorFromMethodId(const DexFile* pDexFile,
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        const DexMethodId* pMethodId, DexStringCache* pCache)
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexProto proto;
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dexProtoSetFromMethodId(&proto, pDexFile, pMethodId);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexProtoGetMethodDescriptor(&proto, pCache);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get a copy of the utf-8 encoded method descriptor string from the
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * proto of a MethodId. The returned pointer must be free()ed by the
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caller.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE char* dexCopyDescriptorFromMethodId(const DexFile* pDexFile,
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexMethodId* pMethodId)
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexProto proto;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dexProtoSetFromMethodId(&proto, pDexFile, pMethodId);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexProtoCopyMethodDescriptor(&proto);
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the type descriptor for the return type of the given prototype.
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexProtoGetReturnType(const DexProto* pProto);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the parameter count of the given prototype.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsize_t dexProtoGetParameterCount(const DexProto* pProto);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compute the number of parameter words (u4 units) required by the
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given prototype. For example, if the method takes (int, long) and
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returns double, this would return 3 (one for the int, two for the
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * long, and the return type isn't relevant).
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dexProtoComputeArgsSize(const DexProto* pProto);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare the two prototypes. The two prototypes are compared
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the return type as the major order, then the first arguments,
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * then second, etc. If two prototypes are identical except that one
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * has extra arguments, then the shorter argument is considered the
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * earlier one in sort order (similar to strcmp()).
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dexProtoCompare(const DexProto* pProto1, const DexProto* pProto2);
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17475144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * Compare the two prototypes, ignoring return type. The two
17575144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * prototypes are compared with the first argument as the major order,
17675144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * then second, etc. If two prototypes are identical except that one
17775144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * has extra arguments, then the shorter argument is considered the
17875144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * earlier one in sort order (similar to strcmp()).
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
18075144030732a492207f594ae6bf73f0308d6be6cDan Bornsteinint dexProtoCompareParameters(const DexProto* pProto1,
18175144030732a492207f594ae6bf73f0308d6be6cDan Bornstein        const DexProto* pProto2);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compare a prototype and a string method descriptor. The comparison
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is done as if the descriptor were converted to a prototype and compared
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with dexProtoCompare().
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dexProtoCompareToDescriptor(const DexProto* proto, const char* descriptor);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
19175144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * Compare a prototype and a concatenation of type descriptors. The
19275144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * comparison is done as if the descriptors were converted to a
19375144030732a492207f594ae6bf73f0308d6be6cDan Bornstein * prototype and compared with dexProtoCompareParameters().
19475144030732a492207f594ae6bf73f0308d6be6cDan Bornstein */
19575144030732a492207f594ae6bf73f0308d6be6cDan Bornsteinint dexProtoCompareToParameterDescriptors(const DexProto* proto,
19675144030732a492207f594ae6bf73f0308d6be6cDan Bornstein        const char* descriptors);
19775144030732a492207f594ae6bf73f0308d6be6cDan Bornstein
19875144030732a492207f594ae6bf73f0308d6be6cDan Bornstein/*
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Single-thread prototype parameter iterator. This structure holds a
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pointer to a prototype and its parts, along with a cursor.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
202bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexParameterIterator {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexProto* proto;
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexTypeList* parameters;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int parameterCount;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int cursor;
207bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialize the given DexParameterIterator to be at the start of the
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * parameters of the given prototype.
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexParameterIteratorInit(DexParameterIterator* pIterator,
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        const DexProto* pProto);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the type_id index for the next parameter, if any. This returns
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * kDexNoIndex if the last parameter has already been consumed.
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dexParameterIteratorNextIndex(DexParameterIterator* pIterator);
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the type descriptor for the next parameter, if any. This returns
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NULL if the last parameter has already been consumed.
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexParameterIteratorNextDescriptor(
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DexParameterIterator* pIterator);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // LIBDEX_DEXPROTO_H_
230