mirror of
https://github.com/revanced/smali.git
synced 2025-05-24 18:42:06 +02:00
Changed util/AccessFlags to be an enum, and added a utility method to return a list of AccessFlags enum values for a given composite access flag int.
git-svn-id: https://smali.googlecode.com/svn/trunk@134 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
34abe5bddf
commit
a72588321d
@ -183,7 +183,7 @@ access_list returns [int value]
|
|||||||
(
|
(
|
||||||
ACCESS_SPEC
|
ACCESS_SPEC
|
||||||
{
|
{
|
||||||
$value |= AccessFlags.getValueForAccessFlag($ACCESS_SPEC.getText());
|
$value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue();
|
||||||
}
|
}
|
||||||
)+);
|
)+);
|
||||||
|
|
||||||
@ -231,7 +231,7 @@ field returns[ClassDataItem.EncodedField encodedField, EncodedValue encodedValue
|
|||||||
$encodedField = new ClassDataItem.EncodedField(dexFile, fieldIdItem, $access_list.value);
|
$encodedField = new ClassDataItem.EncodedField(dexFile, fieldIdItem, $access_list.value);
|
||||||
|
|
||||||
if ($field_initial_value.encodedValue != null) {
|
if ($field_initial_value.encodedValue != null) {
|
||||||
if (($access_list.value & AccessFlags.STATIC) == 0) {
|
if (($access_list.value & AccessFlags.STATIC.getValue()) == 0) {
|
||||||
throw new SemanticException(input, "Initial field values can only be specified for static fields.");
|
throw new SemanticException(input, "Initial field values can only be specified for static fields.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ method returns[ ClassDataItem.EncodedMethod encodedMethod,
|
|||||||
{
|
{
|
||||||
methodIdItem = $method_name_and_prototype.methodIdItem;
|
methodIdItem = $method_name_and_prototype.methodIdItem;
|
||||||
accessFlags = $access_list.value;
|
accessFlags = $access_list.value;
|
||||||
isStatic = (accessFlags & AccessFlags.STATIC) != 0;
|
isStatic = (accessFlags & AccessFlags.STATIC.getValue()) != 0;
|
||||||
methodParameterRegisters = methodIdItem.getParameterRegisterCount(isStatic);
|
methodParameterRegisters = methodIdItem.getParameterRegisterCount(isStatic);
|
||||||
}
|
}
|
||||||
registers_directive
|
registers_directive
|
||||||
|
@ -248,7 +248,7 @@ public class ClassDataItem extends OffsettedItem<ClassDataItem> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isStatic() {
|
public boolean isStatic() {
|
||||||
return (accessFlags.getCachedValue() & AccessFlags.STATIC) != 0;
|
return (accessFlags.getCachedValue() & AccessFlags.STATIC.getValue()) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieldIdItem getField() {
|
public FieldIdItem getField() {
|
||||||
@ -303,7 +303,8 @@ public class ClassDataItem extends OffsettedItem<ClassDataItem> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDirect() {
|
public boolean isDirect() {
|
||||||
return ((accessFlags.getCachedValue() & (AccessFlags.STATIC | AccessFlags.PRIVATE | AccessFlags.CONSTRUCTOR)) != 0);
|
return ((accessFlags.getCachedValue() & (AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue() |
|
||||||
|
AccessFlags.CONSTRUCTOR.getValue())) != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,60 +29,97 @@
|
|||||||
package org.jf.dexlib.util;
|
package org.jf.dexlib.util;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class AccessFlags
|
public enum AccessFlags
|
||||||
{
|
{
|
||||||
public static final int PUBLIC = 0x01;
|
PUBLIC(0x1, "public", true, true, true),
|
||||||
public static final int PRIVATE = 0x02;
|
PRIVATE(0x2, "private", true, true, true),
|
||||||
public static final int PROTECTED = 0x04;
|
PROTECTED(0x4, "protected", true, true, true),
|
||||||
public static final int STATIC = 0x08;
|
STATIC(0x8, "static", true, true, true),
|
||||||
public static final int FINAL = 0x10;
|
FINAL(0x10, "final", true, true, true),
|
||||||
public static final int SYNCHRONIZED = 0x20;
|
SYNCHRONIZED(0x20, "synchronized", false, true, false),
|
||||||
public static final int VOLATILE = 0x40;
|
VOLATILE(0x40, "volatile", false, false, true),
|
||||||
public static final int BRIDGE = 0x40;
|
BRIDGE(0x40, "bridge", false, true, false),
|
||||||
public static final int TRANSIENT = 0x80;
|
TRANSIENT(0x80, "transient", false, false, true),
|
||||||
public static final int VARARGS = 0x80;
|
VARARGS(0x80, "varargs", false, true, false),
|
||||||
public static final int NATIVE = 0x100;
|
NATIVE(0x100, "native", false, true, false),
|
||||||
public static final int INTERFACE = 0x200;
|
INTERFACE(0x200, "interface", true, false, false),
|
||||||
public static final int ABSTRACT = 0x400;
|
ABSTRACT(0x400, "abstract", true, true, false),
|
||||||
public static final int STRICTFP = 0x800;
|
STRICTFP(0x800, "strictfp", false, true, false),
|
||||||
public static final int SYNTHETIC = 0x1000;
|
SYNTHETIC(0x1000, "synthetic", true, true, true),
|
||||||
public static final int ANNOTATION = 0x2000;
|
ANNOTATION(0x2000, "annotation", true, false, false),
|
||||||
public static final int ENUM = 0x4000;
|
ENUM(0x4000, "enum", true, false, true),
|
||||||
public static final int CONSTRUCTOR = 0x10000;
|
CONSTRUCTOR(0x10000, "constructor", false, true, false),
|
||||||
public static final int DECLARED_SYNCHRONIZED = 0x20000;
|
DECLARED_SYNCHRONIZED(0x20000, "declared-synchronized", false, true, false);
|
||||||
|
|
||||||
private static HashMap<String, Integer> accessFlagValues;
|
private int value;
|
||||||
|
private String accessFlagName;
|
||||||
|
private boolean validForClass;
|
||||||
|
private boolean validForMethod;
|
||||||
|
private boolean validForField;
|
||||||
|
|
||||||
|
private static HashMap<String, AccessFlags> accessFlagsByName;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
accessFlagValues = new HashMap<String, Integer>();
|
accessFlagsByName = new HashMap<String, AccessFlags>();
|
||||||
accessFlagValues.put("public", PUBLIC);
|
for (AccessFlags accessFlag: AccessFlags.values()) {
|
||||||
accessFlagValues.put("private", PRIVATE);
|
accessFlagsByName.put(accessFlag.accessFlagName, accessFlag);
|
||||||
accessFlagValues.put("static", STATIC);
|
}
|
||||||
accessFlagValues.put("final", FINAL);
|
|
||||||
accessFlagValues.put("synchronized", SYNCHRONIZED);
|
|
||||||
accessFlagValues.put("volatile", VOLATILE);
|
|
||||||
accessFlagValues.put("bridge", BRIDGE);
|
|
||||||
accessFlagValues.put("transient", TRANSIENT);
|
|
||||||
accessFlagValues.put("varargs", VARARGS);
|
|
||||||
accessFlagValues.put("native", NATIVE);
|
|
||||||
accessFlagValues.put("interface", INTERFACE);
|
|
||||||
accessFlagValues.put("abstract", ABSTRACT);
|
|
||||||
accessFlagValues.put("strictfp", STRICTFP);
|
|
||||||
accessFlagValues.put("synthetic", SYNTHETIC);
|
|
||||||
accessFlagValues.put("annotation", ANNOTATION);
|
|
||||||
accessFlagValues.put("enum", ENUM);
|
|
||||||
accessFlagValues.put("constructor", CONSTRUCTOR);
|
|
||||||
accessFlagValues.put("declared-synchronized", DECLARED_SYNCHRONIZED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getValueForAccessFlag(String accessFlag) {
|
private AccessFlags(int value, String accessFlagName, boolean validForClass, boolean validForMethod,
|
||||||
Integer retVal;
|
boolean validForField) {
|
||||||
retVal = accessFlagValues.get(accessFlag);
|
this.value = value;
|
||||||
if (retVal == null) {
|
this.accessFlagName = accessFlagName;
|
||||||
return 0;
|
this.validForClass = validForClass;
|
||||||
|
this.validForMethod = validForMethod;
|
||||||
|
this.validForField = validForField;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal.intValue();
|
public static List<AccessFlags> getAccessFlagsForClass(int accessFlagValue) {
|
||||||
|
ArrayList<AccessFlags> accessFlags = new ArrayList<AccessFlags>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.values()) {
|
||||||
|
if (accessFlag.validForClass && (accessFlagValue & accessFlag.value) != 0) {
|
||||||
|
accessFlags.add(accessFlag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<AccessFlags> getAccessFlagsForMethod(int accessFlagValue) {
|
||||||
|
ArrayList<AccessFlags> accessFlags = new ArrayList<AccessFlags>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.values()) {
|
||||||
|
if (accessFlag.validForMethod && (accessFlagValue & accessFlag.value) != 0) {
|
||||||
|
accessFlags.add(accessFlag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<AccessFlags> getAccessFlagsForField(int accessFlagValue) {
|
||||||
|
ArrayList<AccessFlags> accessFlags = new ArrayList<AccessFlags>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.values()) {
|
||||||
|
if (accessFlag.validForField && (accessFlagValue & accessFlag.value) != 0) {
|
||||||
|
accessFlags.add(accessFlag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessFlags getAccessFlag(String accessFlag) {
|
||||||
|
return accessFlagsByName.get(accessFlag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return accessFlagName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user