@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())); }
owner = f.getType(); return ".enum " + escapeType(owner) + "->" + f.getName() + ":" + escapeType(f.getType());
FieldVisitor fv = cv.visitField(fieldNode.access & FieldCleanFlag, fieldNode.field.getName(), fieldNode.field.getType(), signature, value); if (fv == null) {
public static String escapeField(Field f) { String owner = f.getOwner(); if (owner == null) { owner = f.getType(); } return escapeType(owner) + "->" + f.getName() + ":" + escapeType(f.getType()); }
@Override public Object visitFlocal(SmaliParser.FlocalContext ctx) { if (dexDebugVisitor != null) { DexLabel dexLabel = new DexLabel(); scv.visitLabel(dexLabel); int reg = m.pareReg(ctx.r.getText()); String name; String type; if (ctx.v1 != null) { Field fld = parseFieldAndUnescape("Lt;", ctx.v1.getText()); name = fld.getName(); type = fld.getType(); } else if (ctx.v2 != null) { String txt = ctx.v2.getText(); int i = findString(txt, 1, txt.length(), '\"'); name = unescapeStr(txt.substring(0, i + 1)); type = unEscapeId(txt.substring(i + 2)); } else { if (ctx.name2 != null) { name = unescapeStr(ctx.name2.getText()); } else { name = unEscapeId(ctx.name1.getText()); } type = unEscapeId(ctx.type.getText()); } String sig = ctx.sig == null ? null : unescapeStr(ctx.sig.getText()); dexDebugVisitor.visitStartLocal(reg, dexLabel, name, type, sig); } return null; }
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); } }
dav.visitEnum(name, f.getType(), f.getName()); } else if (o instanceof DexType) { dav.visit(name, Type.getType(((DexType) o).desc));
appendAccess(f.access | ACCESS_FIELD, buff); Field field = f.field; buff.append(escapeId(f.field.getName())).append(":").append(escapeType(field.getType())); if (f.cst != null) { buff.append(" = ");
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:
@Override public DexFieldVisitor visitField(int accessFlags, Field field, Object value) { String fieldName = String.format("f%03d_%s", fCount++, field.getName()); out.s("%s(cv);", fieldName); final ArrayOut f = new ArrayOut(); fieldOuts.add(f); f.s("public static void %s(DexClassVisitor cv) {", fieldName); f.push(); f.s("DexFieldVisitor fv=cv.visitField(%s, %s, %s);", Escape.fieldAcc(accessFlags), Escape.v(field), Escape.v(value)); f.s("if(fv != null) {"); f.push(); return new DexFieldVisitor() { @Override public DexAnnotationVisitor visitAnnotation(String name, Visibility visibility) { return new ASMifierAnnotationV("fv", f, name, visibility); } @Override public void visitEnd() { f.s("fv.visitEnd();"); f.pop(); f.s("}"); f.pop(); f.s("}"); } }; }
public static void acceptAnnotationItem(DexAnnotationVisitor dav, String name, Object o) { if (o instanceof Object[]) { DexAnnotationVisitor arrayVisitor = dav.visitArray(name); if (arrayVisitor != null) { Object[] array = (Object[]) o; for (Object e : array) { acceptAnnotationItem(arrayVisitor, null, e); } arrayVisitor.visitEnd(); } } else if (o instanceof DexAnnotationNode) { DexAnnotationNode ann = (DexAnnotationNode) o; DexAnnotationVisitor av = dav.visitAnnotation(name, ann.type); if (av != null) { for (DexAnnotationNode.Item item : ann.items) { acceptAnnotationItem(av, item.name, item.value); } av.visitEnd(); } } else if (o instanceof Field) { Field f = (Field) o; dav.visitEnum(name, f.getType(), f.getName()); } else { dav.visit(name, o); } }
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(); } }