diff --git a/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java b/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java index cb42d7c8..a17c6bcf 100644 --- a/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/ClassDataItem.java @@ -114,27 +114,21 @@ public class ClassDataItem extends OffsettedItem { } public List getStaticFields() { - return (List)staticFieldList.clone(); + return Collections.unmodifiableList(staticFieldList); } public List getInstanceFields() { - return (List)instanceFieldList.clone(); + return Collections.unmodifiableList(instanceFieldList); } public List getDirectMethods() { - return (List)directMethodList.clone(); + return Collections.unmodifiableList(directMethodList); } public List getVirtualMethods() { - return (List)virtualMethodList.clone(); + return Collections.unmodifiableList(virtualMethodList); } - //TODO: GROT - public EncodedField getStaticFieldAtIndex(int i) - { - return staticFieldList.get(i); - } - private static abstract class EncodedMember> extends CompositeField implements Field, Comparable { public EncodedMember(String fieldName) { diff --git a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java index 93ec9a71..496664a6 100644 --- a/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/ClassDefItem.java @@ -187,7 +187,7 @@ public class ClassDefItem extends IndexedItem { //All static fields before this one must have an initial value. Add any default values as needed for (int i=staticFieldInitialValuesList.size(); i < fieldIndex; i++) { - ClassDataItem.EncodedField staticField = classDataItem.getStaticFieldAtIndex(i); + ClassDataItem.EncodedField staticField = classDataItem.getStaticFields().get(i); EncodedValueSubField subField = TypeUtils.makeDefaultValueForType(dexFile, staticField.getField().getFieldType().getTypeDescriptor()); EncodedValue encodedValue = new EncodedValue(dexFile, subField); @@ -207,6 +207,10 @@ public class ClassDefItem extends IndexedItem { this.classAnnotationsReferenceField.setReference(annotations); } + public void setClassDataItem(ClassDataItem classDataItem) { + this.classDataReferenceField.setReference(classDataItem); + } + public static int placeClassDefItems(IndexedSection section, int offset) { ClassDefPlacer cdp = new ClassDefPlacer(section); return cdp.placeSection(offset); diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index c4ab8865..fc1cb80c 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -126,6 +126,14 @@ smali_file } classDefItem.setAnnotations(annotationDirectoryItem); + + if ((classDataItem.getStaticFields().size() + + classDataItem.getInstanceFields().size() + + classDataItem.getDirectMethods().size() + + classDataItem.getVirtualMethods().size()) == 0) { + + classDefItem.setClassDataItem(null); + } }; catch [Exception ex] { reportError(new SemanticException(input, ex)); @@ -136,7 +144,6 @@ smali_file header returns[TypeIdItem classType, int accessFlags, TypeIdItem superType, TypeListItem implementsList, StringIdItem sourceSpec] : class_spec super_spec implements_list source_spec { - //TODO: if a class has no fields or methods, it shouldn't have a ClassDataItem classDataItem = new ClassDataItem(dexFile, 0); classDefItem = new ClassDefItem(dexFile, $class_spec.type, $class_spec.accessFlags, $super_spec.type, $implements_list.implementsList, $source_spec.source, classDataItem);