1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/*
2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project
3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License.
6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at
7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and
14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License.
15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.rop.code;
18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.Hex;
20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/**
22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constants used as "access flags" in various places in classes, and
23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * related utilities. Although, at the rop layer, flags are generally
24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * ignored, this is the layer of communication, and as such, this
25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * package is where these definitions belong. The flag definitions are
26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * identical to Java access flags, but {@code ACC_SUPER} isn't
27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * used at all in translated code, and {@code ACC_SYNCHRONIZED}
28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is only used in a very limited way.
29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class AccessFlags {
31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** public member / class */
32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_PUBLIC = 0x0001;
33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** private member */
35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_PRIVATE = 0x0002;
36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** protected member */
38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_PROTECTED = 0x0004;
39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** static member */
41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_STATIC = 0x0008;
42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** final member / class */
44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_FINAL = 0x0010;
45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * synchronized method; only valid in dex files for {@code native}
48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * methods
49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_SYNCHRONIZED = 0x0020;
51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * class with new-style {@code invokespecial} for superclass
54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * method access
55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_SUPER = 0x0020;
57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** volatile field */
59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_VOLATILE = 0x0040;
60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** bridge method (generated) */
62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_BRIDGE = 0x0040;
63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** transient field */
65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_TRANSIENT = 0x0080;
66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** varargs method */
68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_VARARGS = 0x0080;
69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** native method */
71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_NATIVE = 0x0100;
72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** "class" is in fact an public static final interface */
74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_INTERFACE = 0x0200;
75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** abstract method / class */
77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_ABSTRACT = 0x0400;
78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * method with strict floating point ({@code strictfp})
81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * behavior
82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_STRICT = 0x0800;
84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** synthetic member */
86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_SYNTHETIC = 0x1000;
87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** class is an annotation type */
89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_ANNOTATION = 0x2000;
90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * class is an enumerated type; field is an element of an enumerated
93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * type
94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_ENUM = 0x4000;
96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** method is a constructor */
98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_CONSTRUCTOR = 0x10000;
99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * method was declared {@code synchronized}; has no effect on
102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * execution (other than inspecting this flag, per se)
103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int ACC_DECLARED_SYNCHRONIZED = 0x20000;
105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** flags defined on classes */
107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int CLASS_FLAGS =
108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_PUBLIC | ACC_FINAL | ACC_SUPER | ACC_INTERFACE | ACC_ABSTRACT |
109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM;
110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** flags defined on inner classes */
112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int INNER_CLASS_FLAGS =
113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL |
114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_INTERFACE | ACC_ABSTRACT | ACC_SYNTHETIC | ACC_ANNOTATION |
115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_ENUM;
116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** flags defined on fields */
118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int FIELD_FLAGS =
119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL |
120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_VOLATILE | ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM;
121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** flags defined on methods */
123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static final int METHOD_FLAGS =
124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL |
125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_SYNCHRONIZED | ACC_BRIDGE | ACC_VARARGS | ACC_NATIVE |
126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_ABSTRACT | ACC_STRICT | ACC_SYNTHETIC | ACC_CONSTRUCTOR |
127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        ACC_DECLARED_SYNCHRONIZED;
128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** indicates conversion of class flags */
130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private static final int CONV_CLASS = 1;
131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** indicates conversion of field flags */
133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private static final int CONV_FIELD = 2;
134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /** indicates conversion of method flags */
136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private static final int CONV_METHOD = 3;
137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
138579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
139579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * This class is uninstantiable.
140579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
141579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private AccessFlags() {
142579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        // This space intentionally left blank.
143579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
144579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
145579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
146579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns a human-oriented string representing the given access flags,
147579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * as defined on classes (not fields or methods).
148579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
149579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags
150579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} human-oriented string
151579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
152579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static String classString(int flags) {
153579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return humanHelper(flags, CLASS_FLAGS, CONV_CLASS);
154579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
155579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
156579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
157579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns a human-oriented string representing the given access flags,
158579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * as defined on inner classes.
159579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
160579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags
161579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} human-oriented string
162579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
163579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static String innerClassString(int flags) {
164579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return humanHelper(flags, INNER_CLASS_FLAGS, CONV_CLASS);
165579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
166579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
167579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
168579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns a human-oriented string representing the given access flags,
169579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * as defined on fields (not classes or methods).
170579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
171579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags
172579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} human-oriented string
173579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
174579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static String fieldString(int flags) {
175579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return humanHelper(flags, FIELD_FLAGS, CONV_FIELD);
176579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
177579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
178579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
179579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns a human-oriented string representing the given access flags,
180579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * as defined on methods (not classes or fields).
181579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
182579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags
183579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} human-oriented string
184579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
185579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static String methodString(int flags) {
186579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return humanHelper(flags, METHOD_FLAGS, CONV_METHOD);
187579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
188579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
189579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
190579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_PUBLIC} is on in the given
191579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
192579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
193579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
194579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_PUBLIC} flag
195579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
196579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isPublic(int flags) {
197579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_PUBLIC) != 0;
198579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
199579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
200579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
201579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_PROTECTED} is on in the given
202579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
203579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
204579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
205579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_PROTECTED} flag
206579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
207579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isProtected(int flags) {
208579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_PROTECTED) != 0;
209579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
210579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
211579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
212579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_PRIVATE} is on in the given
213579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
214579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
215579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
216579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_PRIVATE} flag
217579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
218579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isPrivate(int flags) {
219579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_PRIVATE) != 0;
220579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
221579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
222579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
223579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_STATIC} is on in the given
224579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
225579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
226579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
227579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_STATIC} flag
228579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
229579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isStatic(int flags) {
230579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_STATIC) != 0;
231579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
232579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
233579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
234579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_SYNCHRONIZED} is on in
235579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * the given flags.
236579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
237579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
238579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_SYNCHRONIZED} flag
239579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
240579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isSynchronized(int flags) {
241579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_SYNCHRONIZED) != 0;
242579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
243579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
244579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
245579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_ABSTRACT} is on in the given
246579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
247579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
248579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
249579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_ABSTRACT} flag
250579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
251579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isAbstract(int flags) {
252579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_ABSTRACT) != 0;
253579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
254579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
255579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
256579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_NATIVE} is on in the given
257579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
258579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
259579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
260579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_NATIVE} flag
261579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
262579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isNative(int flags) {
263579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_NATIVE) != 0;
264579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
265579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
266579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
267579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_ANNOTATION} is on in the given
268579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * flags.
269579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
270579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
271579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_ANNOTATION} flag
272579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
273579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isAnnotation(int flags) {
274579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_ANNOTATION) != 0;
275579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
276579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
277579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
278579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns whether the flag {@code ACC_DECLARED_SYNCHRONIZED} is
279579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * on in the given flags.
280579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
281579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the flags to check
282579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return the value of the {@code ACC_DECLARED_SYNCHRONIZED} flag
283579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
284579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public static boolean isDeclaredSynchronized(int flags) {
285579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return (flags & ACC_DECLARED_SYNCHRONIZED) != 0;
286579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
287579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
288579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
289579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Helper to return a human-oriented string representing the given
290579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * access flags.
291579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
292579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param flags the defined flags
293579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param mask mask for the "defined" bits
294579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param what what the flags represent (one of {@code CONV_*})
295579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} human-oriented string
296579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
297579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    private static String humanHelper(int flags, int mask, int what) {
298579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        StringBuffer sb = new StringBuffer(80);
299579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        int extra = flags & ~mask;
300579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
301579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        flags &= mask;
302579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
303579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_PUBLIC) != 0) {
304579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|public");
305579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
306579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_PRIVATE) != 0) {
307579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|private");
308579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
309579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_PROTECTED) != 0) {
310579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|protected");
311579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
312579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_STATIC) != 0) {
313579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|static");
314579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
315579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_FINAL) != 0) {
316579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|final");
317579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
318579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_SYNCHRONIZED) != 0) {
319579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            if (what == CONV_CLASS) {
320579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|super");
321579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            } else {
322579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|synchronized");
323579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
324579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
325579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_VOLATILE) != 0) {
326579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            if (what == CONV_METHOD) {
327579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|bridge");
328579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            } else {
329579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|volatile");
330579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
331579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
332579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_TRANSIENT) != 0) {
333579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            if (what == CONV_METHOD) {
334579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|varargs");
335579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            } else {
336579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson                sb.append("|transient");
337579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            }
338579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
339579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_NATIVE) != 0) {
340579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|native");
341579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
342579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_INTERFACE) != 0) {
343579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|interface");
344579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
345579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_ABSTRACT) != 0) {
346579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|abstract");
347579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
348579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_STRICT) != 0) {
349579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|strictfp");
350579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
351579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_SYNTHETIC) != 0) {
352579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|synthetic");
353579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
354579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_ANNOTATION) != 0) {
355579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|annotation");
356579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
357579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_ENUM) != 0) {
358579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|enum");
359579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
360579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_CONSTRUCTOR) != 0) {
361579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|constructor");
362579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
363579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((flags & ACC_DECLARED_SYNCHRONIZED) != 0) {
364579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append("|declared_synchronized");
365579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
366579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
367579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if ((extra != 0) || (sb.length() == 0)) {
368579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append('|');
369579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            sb.append(Hex.u2(extra));
370579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
371579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
372579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return sb.substring(1);
373579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
374579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson}
375