public static Field parseFieldAndUnescape(String full) throws RuntimeException { int x = full.indexOf("->"); if (x <= 0) { throw new RuntimeException(); } return parseFieldAndUnescape(unEscapeId(full.substring(0, x)), full.substring(x + 2)); } }
@Override public Object visitFf1c(SmaliParser.Ff1cContext ctx) { int r = m.pareReg(ctx.r1.getText()); Field field = parseFieldAndUnescape(ctx.fld.getText()); scv.visitFieldStmt(getOp(ctx.op), r, 0, field); return null; }
@Override public Object visitFf2c(SmaliParser.Ff2cContext ctx) { int r1 = m.pareReg(ctx.r1.getText()); int r2 = m.pareReg(ctx.r2.getText()); scv.visitFieldStmt(getOp(ctx.op), r1, r2, parseFieldAndUnescape(ctx.fld.getText())); return null; }
public static void acceptField(SmaliParser.SFieldContext ctx, String className, DexClassVisitor dexClassVisitor) { Field field; Token fieldObj = ctx.fieldObj; if (fieldObj.getType() == SmaliLexer.FIELD_FULL) { field = Utils.parseFieldAndUnescape(fieldObj.getText()); } else { field = Utils.parseFieldAndUnescape(className, fieldObj.getText()); } int access = collectAccess(ctx.sAccList()); Object value = null; SmaliParser.SBaseValueContext vctx = ctx.sBaseValue(); if (vctx != null) { value = parseBaseValue(vctx); } DexFieldVisitor dexFieldVisitor = dexClassVisitor.visitField(access, field, value); if (dexFieldVisitor != null) { acceptAnnotations(ctx.sAnnotation(), dexFieldVisitor); dexFieldVisitor.visitEnd(); } }
@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; }
return null; case SmaliLexer.FIELD_FULL: return parseFieldAndUnescape(value.getText());