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