public static Field parseFieldAndUnescape(String owner, String part) throws RuntimeException { int x = part.indexOf(':'); if (x < 0) { throw new RuntimeException(); } return new Field(owner, unEscapeId(part.substring(0, x)), unEscapeId(part.substring(x + 1))); }
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)); } }
public static Method parseMethodAndUnescape(String full) throws RuntimeException { int x = full.indexOf("->"); if (x <= 0) { throw new RuntimeException(); } return parseMethodAndUnescape(unEscapeId(full.substring(0, x)), full.substring(x + 2)); }
public static Method parseMethodAndUnescape(String owner, String part) throws RuntimeException { int x = part.indexOf('('); if (x < 0) { throw new RuntimeException(); } int y = part.indexOf(')', x); if (y < 0) { throw new RuntimeException(); } String methodName = unEscapeId(part.substring(0, x)); String[] params = toTypeList(part.substring(x + 1, y)); for (int i = 0; i < params.length; i++) { params[i] = unEscapeId(params[i]); } String ret = unEscapeId(part.substring(y + 1)); return new Method(owner, methodName, params, ret); }
@Override public Object visitFt5c(SmaliParser.Ft5cContext ctx) { Op op = getOp(ctx.op); List<TerminalNode> ts = ctx.REGISTER(); int rs[] = new int[ts.size()]; for (int i = 0; i < ts.size(); i++) { rs[i] = m.pareReg(ts.get(i).getSymbol().getText()); } scv.visitFilledNewArrayStmt(op, rs, unEscapeId(ctx.type.getText())); return null; }
@Override public Object visitFcache(SmaliParser.FcacheContext ctx) { scv.visitTryCatch(getLabel(ctx.start.getText()), getLabel(ctx.end.getText()), new DexLabel[]{getLabel(ctx.handle.getText())}, new String[]{unEscapeId(ctx.type.getText())} ); return null; }
@Override public Object visitFt2c(SmaliParser.Ft2cContext ctx) { int r1 = m.pareReg(ctx.r1.getText()); int r2 = m.pareReg(ctx.r2.getText()); scv.visitTypeStmt(getOp(ctx.op), r1, r2, unEscapeId(ctx.type.getText())); return null; }
@Override public Object visitFtrc(SmaliParser.FtrcContext ctx) { if (ctx.rstart != null) { int start = m.pareReg(ctx.rstart.getText()); int end = m.pareReg(ctx.rend.getText()); int size = end - start + 1; int rs[] = new int[size]; for (int i = 0; i < size; i++) { rs[i] = start + i; } scv.visitFilledNewArrayStmt(getOp(ctx.op), rs, unEscapeId(ctx.type.getText())); } else { scv.visitFilledNewArrayStmt(getOp(ctx.op), new int[0], unEscapeId(ctx.type.getText())); } return null; }
private static void acceptAnnotations(List<SmaliParser.SAnnotationContext> sAnnotationContexts, DexAnnotationAble dexAnnotationAble) { if (dexAnnotationAble == null) { return; } if (sAnnotationContexts.size() > 0) { for (SmaliParser.SAnnotationContext ctx : sAnnotationContexts) { Visibility visibility = Utils.getAnnVisibility(ctx.visibility.getText()); String type = Utils.unEscapeId(ctx.type.getText()); DexAnnotationVisitor dexAnnotationVisitor = dexAnnotationAble.visitAnnotation(type, visibility); if (dexAnnotationVisitor != null) { List<SmaliParser.SAnnotationKeyNameContext> keys = ctx.sAnnotationKeyName(); if (keys.size() > 0) { List<SmaliParser.SAnnotationValueContext> values = ctx.sAnnotationValue(); for (int i = 0; i < keys.size(); i++) { acceptAnnotation(dexAnnotationVisitor, Utils.unEscapeId(keys.get(i).getText()), values.get(i)); } } dexAnnotationVisitor.visitEnd(); } } } }
public static void acceptFile(SmaliParser.SFileContext ctx, DexFileVisitor dexFileVisitor) { DexClassVisitor dexClassVisitor; String className = Utils.unEscapeId(ctx.className.getText()); int access = collectAccess(ctx.sAccList()); List<SmaliParser.SSuperContext> superContexts = ctx.sSuper(); String superClass = null; if (superContexts.size() > 0) { superClass = Utils.unEscapeId(superContexts.get(superContexts.size() - 1).name.getText()); } List<SmaliParser.SInterfaceContext> itfs = ctx.sInterface(); String[] interfaceNames = null; if (itfs.size() > 0) { interfaceNames = new String[itfs.size()]; for (int i = 0; i < itfs.size(); i++) { interfaceNames[i] = Utils.unEscapeId(itfs.get(i).name.getText()); } } dexClassVisitor = dexFileVisitor.visit(access, className, superClass, interfaceNames); List<SmaliParser.SSourceContext> sources = ctx.sSource(); if (sources.size() > 0) { dexClassVisitor.visitSource( Utils.unescapeStr(sources.get(sources.size() - 1).src.getText()) ); } acceptAnnotations(ctx.sAnnotation(), dexClassVisitor); acceptField(ctx.sField(), className, dexClassVisitor); acceptMethod(ctx.sMethod(), className, dexClassVisitor); dexClassVisitor.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 parseMethodAndUnescape(value.getText()); case SmaliLexer.OBJECT_TYPE: return new DexType(unEscapeId(value.getText())); case SmaliLexer.NULL: return null;
SmaliParser.SSubannotationContext subannotationContext = (SmaliParser.SSubannotationContext) t; DexAnnotationVisitor annotationVisitor = dexAnnotationVisitor.visitAnnotation(name, Utils .unEscapeId(subannotationContext.type.getText())); if (annotationVisitor != null) { List<SmaliParser.SAnnotationKeyNameContext> keys = subannotationContext.sAnnotationKeyName(); List<SmaliParser.SAnnotationValueContext> values = subannotationContext.sAnnotationValue(); for (int i = 0; i < keys.size(); i++) { acceptAnnotation(annotationVisitor, Utils.unEscapeId(keys.get(i).getText()), values.get(i));
break; case CONST_CLASS: scv.visitConstStmt(op, r, new DexType(unEscapeId(cst.getText()))); break; case CHECK_CAST: case NEW_INSTANCE: scv.visitTypeStmt(op, r, 0, unEscapeId(cst.getText())); break; case CONST_WIDE: