1 21 package proguard.optimize.info; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.CodeAttribute; 25 import proguard.classfile.constant.*; 26 import proguard.classfile.constant.visitor.ConstantVisitor; 27 import proguard.classfile.instruction.*; 28 import proguard.classfile.instruction.visitor.InstructionVisitor; 29 import proguard.classfile.util.SimplifiedVisitor; 30 import proguard.classfile.visitor.MemberVisitor; 31 32 37 public class ReadWriteFieldMarker 38 extends SimplifiedVisitor 39 implements InstructionVisitor, 40 ConstantVisitor, 41 MemberVisitor 42 { 43 private boolean reading; 45 private boolean writing; 46 47 48 50 public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} 51 52 53 public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) 54 { 55 byte opcode = constantInstruction.opcode; 56 57 switch (opcode) 59 { 60 case InstructionConstants.OP_LDC: 61 case InstructionConstants.OP_LDC_W: 62 reading = true; 64 writing = true; 65 clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); 66 break; 67 68 case InstructionConstants.OP_GETSTATIC: 69 case InstructionConstants.OP_GETFIELD: 70 reading = true; 72 writing = false; 73 clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); 74 break; 75 76 case InstructionConstants.OP_PUTSTATIC: 77 case InstructionConstants.OP_PUTFIELD: 78 reading = false; 80 writing = true; 81 clazz.constantPoolEntryAccept(constantInstruction.constantIndex, this); 82 break; 83 } 84 } 85 86 87 89 public void visitAnyConstant(Clazz clazz, Constant constant) {} 90 91 92 public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 93 { 94 stringConstant.referencedMemberAccept(this); 96 } 97 98 99 public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) 100 { 101 fieldrefConstant.referencedMemberAccept(this); 103 } 104 105 106 108 public void visitAnyMember(Clazz Clazz, Member member) {} 109 110 111 public void visitProgramField(ProgramClass programClass, ProgramField programField) 112 { 113 if (reading) 115 { 116 markAsRead(programField); 117 } 118 119 if (writing) 121 { 122 markAsWritten(programField); 123 } 124 } 125 126 127 129 private static void markAsRead(Field field) 130 { 131 FieldOptimizationInfo info = FieldOptimizationInfo.getFieldOptimizationInfo(field); 132 if (info != null) 133 { 134 info.setRead(); 135 } 136 } 137 138 139 public static boolean isRead(Field field) 140 { 141 FieldOptimizationInfo info = FieldOptimizationInfo.getFieldOptimizationInfo(field); 142 return info == null || 143 info.isRead(); 144 } 145 146 147 private static void markAsWritten(Field field) 148 { 149 FieldOptimizationInfo info = FieldOptimizationInfo.getFieldOptimizationInfo(field); 150 if (info != null) 151 { 152 info.setWritten(); 153 } 154 } 155 156 157 public static boolean isWritten(Field field) 158 { 159 FieldOptimizationInfo info = FieldOptimizationInfo.getFieldOptimizationInfo(field); 160 return info == null || 161 info.isWritten(); 162 } 163 } 164 | Popular Tags |