@Override public String toString() { return this.getOwner() + "." + this.getName() + " " + this.getType(); } }
@Override public void visitFieldStmt(Op op, int a, int b, Field field) { switch (op) { case SPUT: case SPUT_BOOLEAN: case SPUT_BYTE: case SPUT_CHAR: case SPUT_OBJECT: case SPUT_SHORT: case SPUT_WIDE: if (field.getOwner().equals(classNode.className)) { String key = field.getName() + ":" + field.getType(); fs.remove(key); DexFieldNode dn = shouldNotBeAssigned.get(key); if (dn != null) { //System.out.println(field.getName() + ":" + field.getType()); dn.cst = null; } } break; default: // ignored break; } } });
public FieldIdItem uniqField(Field field) { return uniqField(field.getOwner(), field.getName(), field.getType()); }
public static String v(Field f) { return String.format("new Field(%s,%s,%s)", v(f.getOwner()), v(f.getName()), v(f.getType())); }
String owner = f.getOwner(); if (owner == null) { owner = f.getType();
public static String escapeField(Field f) { String owner = f.getOwner(); if (owner == null) { owner = f.getType(); } return escapeType(owner) + "->" + f.getName() + ":" + escapeType(f.getType()); }
public static void doAccept(DexAnnotationVisitor dexAnnotationVisitor, String k, Object value) { if (value instanceof ArrayList) { DexAnnotationVisitor a = dexAnnotationVisitor.visitArray(k); for (Object o : (ArrayList) value) { doAccept(a, null, o); } a.visitEnd(); } else if (value instanceof Ann) { Ann ann = (Ann) value; DexAnnotationVisitor a = dexAnnotationVisitor.visitAnnotation(k, ann.name); for (Map.Entry<String, Object> e : ann.elements) { doAccept(a, e.getKey(), e.getValue()); } a.visitEnd(); } else if (value instanceof Field) { Field f = (Field) value; dexAnnotationVisitor.visitEnum(k, f.getOwner(), f.getName()); } else { dexAnnotationVisitor.visit(k, value); } }
case IGET_SHORT: case IGET_WIDE: list.add(nAssign(locals[a], nField(locals[b], field.getOwner(), field.getName(), field.getType()))); break; case IPUT: case IPUT_SHORT: case IPUT_WIDE: list.add(nAssign(nField(locals[b], field.getOwner(), field.getName(), field.getType()), locals[a])); break; case SGET: case SGET_SHORT: case SGET_WIDE: list.add(nAssign(locals[a], nStaticField(field.getOwner(), field.getName(), field.getType()))); break; case SPUT: case SPUT_SHORT: case SPUT_WIDE: list.add(nAssign(nStaticField(field.getOwner(), field.getName(), field.getType()), locals[a])); break; default:
case SGET_WIDE: Field field = ((FieldStmtNode) insn).field; return b(nStaticField(field.getOwner(), field.getName(), field.getType())); case NEW_INSTANCE: return b(nNew(((TypeStmtNode) insn).type));
switch (mh.getType()) { case MethodHandle.INSTANCE_GET: h = new Handle(Opcodes.H_GETFIELD, toInternalName(mh.getField().getOwner()), mh.getField().getName(), mh.getField().getType()); break; case MethodHandle.INSTANCE_PUT: h = new Handle(Opcodes.H_PUTFIELD, toInternalName(mh.getField().getOwner()), mh.getField().getName(), mh.getField().getType()); break; case MethodHandle.STATIC_GET: h = new Handle(Opcodes.H_GETFIELD, toInternalName(mh.getField().getOwner()), mh.getField().getName(), mh.getField().getType()); break; case MethodHandle.STATIC_PUT: h = new Handle(Opcodes.H_PUTFIELD, toInternalName(mh.getField().getOwner()), mh.getField().getName(), mh.getField().getType()); break; case MethodHandle.INVOKE_INSTANCE:
case SPUT_WIDE: { Field field = ((FieldStmtNode) insn).field; emit(nAssign(nStaticField(field.getOwner(), field.getName(), field.getType()), local)); return null; case IGET_WIDE: { Field field = ((FieldStmtNode) insn).field; return b(nField(local, field.getOwner(), field.getName(), field.getType()));
case IPUT_WIDE: Field field = ((FieldStmtNode) insn).field; emit(nAssign(nField(local1, field.getOwner(), field.getName(), field.getType()), local2)); return null;
@Override public String toString() { return this.getOwner() + "." + this.getName() + " " + this.getType(); } }
public FieldIdItem uniqField(Field field) { return uniqField(field.getOwner(), field.getName(), field.getType()); }
public static String v(Field f) { return String.format("new Field(%s,%s,%s)", v(f.getOwner()), v(f.getName()), v(f.getType())); }
private void writeAnnotationArrayValue(DexAnnotationVisitor aw, EncodedArray array) { for (EncodedValue value : array.values) { String name = null; Object decodeValue = decodeValue(value); if (value.valueType == VALUE_ENUM) { Field field = (Field) decodeValue; aw.visitEnum(name, field.getOwner(), field.getName()); } else if (decodeValue instanceof EncodedAnnotation) { EncodedAnnotation aannotation = (EncodedAnnotation) decodeValue; DexAnnotationVisitor aaw = aw.visitAnnotation(name, aannotation.type.descriptor.stringData.string); writeAnnotation(aaw, aannotation); aaw.visitEnd(); } else if (decodeValue instanceof EncodedArray) { DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, (EncodedArray) decodeValue); aaw.visitEnd(); } else if (decodeValue instanceof Object[]) { Object[] values = (Object[]) decodeValue; EncodedArray aarray = new EncodedArray(); for (Object avalue : values) { aarray.values.add(EncodedValue.wrap(mFw.cp.wrapEncodedItem(avalue))); } DexAnnotationVisitor aaw = aw.visitArray(name); writeAnnotationArrayValue(aaw, aarray); aaw.visitEnd(); } else { aw.visit(name, decodeValue); } } }
if (element.value.valueType == VALUE_ENUM) { Field field = (Field) decodeValue; aw.visitEnum(name, field.getOwner(), field.getName()); } else if (decodeValue instanceof EncodedAnnotation) { EncodedAnnotation aannotation = (EncodedAnnotation) decodeValue;