/** * Writes out the information stored in tags associated with the given unit * * @param mv * The method visitor for writing out the bytecode * @param u * The unit for which to write out the tags */ protected void generateTagsForUnit(MethodVisitor mv, Unit u) { if (u.hasTag("LineNumberTag")) { LineNumberTag lnt = (LineNumberTag) u.getTag("LineNumberTag"); Label l; if (branchTargetLabels.containsKey(u)) { l = branchTargetLabels.get(u); } else { l = new Label(); mv.visitLabel(l); } mv.visitLineNumber(lnt.getLineNumber(), l); } }
protected void internalTransform(Body b, String phaseName, Map<String, String> options) { System.out.println("Printing Line Numbers for: " + b.getMethod().getSignature()); PatchingChain<Unit> units = b.getUnits(); // get the method code Iterator<Unit> it = units.iterator(); while (it.hasNext()) { // for each jimple statement or baf instruction Unit u = (Unit) it.next(); if (u.hasTag("LineNumberTag")) { // see if a LineNumberTag exists (it will if you use -keep-line-number) LineNumberTag tag = (LineNumberTag) u.getTag(("LineNumberTag")); System.out.println(u + " has Line Number: " + tag.getLineNumber()); // print out the unit and line number } else { System.out.println(u + " has no Line Number"); } } System.out.println("\n"); } }
void setUnit(AbstractInsnNode insn, Unit u) { if (Options.v().keep_line_number() && lastLineNumber >= 0) { Tag lineTag = u.getTag("LineNumberTag"); if (lineTag == null) { lineTag = new LineNumberTag(lastLineNumber); u.addTag(lineTag); } else if (((LineNumberTag) lineTag).getLineNumber() != lastLineNumber) { throw new RuntimeException("Line tag mismatch"); } } Unit o = units.put(insn, u); if (o != null) { throw new AssertionError(insn.getOpcode() + " already has a unit, " + o); } }
@Override public int getJavaSourceStartLineNumber() { if (line <= 0) { // get line from source SourceLnPosTag tag = (SourceLnPosTag) getTag("SourceLnPosTag"); if (tag != null) { line = tag.startLn(); } else { // get line from bytecode LineNumberTag tag2 = (LineNumberTag) getTag("LineNumberTag"); if (tag2 != null) { line = tag2.getLineNumber(); } else { line = -1; } } } return line; }
private boolean coversLineNumber(int lineNumber, Host host) { { SourceLnPosTag tag = (SourceLnPosTag) host.getTag("SourceLnPosTag"); if (tag != null) { if (tag.startLn() <= lineNumber && tag.endLn() >= lineNumber) { return true; } } } { LineNumberTag tag = (LineNumberTag) host.getTag("LineNumberTag"); if (tag != null) { if (tag.getLineNumber() == lineNumber) { return true; } } } return false; }
/** * Writes out the information stored in the tags associated with the given statement * * @param builder * The builder used to generate the Dalvik method implementation * @param stmt * The statement for which to write out the tags */ protected void writeTagsForStatement(MethodImplementationBuilder builder, Stmt stmt) { List<Tag> tags = stmt.getTags(); for (Tag t : tags) { if (t instanceof LineNumberTag) { LineNumberTag lnt = (LineNumberTag) t; builder.addLineNumber(lnt.getLineNumber()); } else if (t instanceof SourceFileTag) { SourceFileTag sft = (SourceFileTag) t; builder.addSetSourceFile(new ImmutableStringReference(sft.getSourceFile())); } } }
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1;
void emitStmt(Stmt stmt) { LineNumberTag lnTag = (LineNumberTag) stmt.getTag("LineNumberTag"); if (lnTag != null) { emit(".line " + lnTag.getLineNumber());
void emitInst(Inst inst) { LineNumberTag lnTag = (LineNumberTag) inst.getTag("LineNumberTag"); if (lnTag != null) { emit(".line " + lnTag.getLineNumber());
@Override public String toString() { StringBuilder sb = new StringBuilder(stmt.toString()); if (stmt.hasTag("LineNumberTag")) sb.append(" on line ").append(((LineNumberTag) stmt.getTag("LineNumberTag")).getLineNumber()); return sb.toString(); }
@Override public String toString() { StringBuilder sb = new StringBuilder(stmt == null ? accessPath.toString() : stmt.toString()); if (stmt != null && stmt.hasTag("LineNumberTag")) sb.append(" on line ").append(((LineNumberTag) stmt.getTag("LineNumberTag")).getLineNumber()); return sb.toString(); }
private boolean coversLineNumber(int lineNumber, Host host) { { SourceLnPosTag tag = (SourceLnPosTag) host.getTag("SourceLnPosTag"); if(tag!=null) { if(tag.startLn()<=lineNumber && tag.endLn()>=lineNumber) { return true; } } } { LineNumberTag tag = (LineNumberTag) host.getTag("LineNumberTag"); if(tag!=null) { if(tag.getLineNumber()==lineNumber) { return true; } } } return false; }
private boolean coversLineNumber(int lineNumber, Host host) { { SourceLnPosTag tag = (SourceLnPosTag) host.getTag("SourceLnPosTag"); if(tag!=null) { if(tag.startLn()<=lineNumber && tag.endLn()>=lineNumber) { return true; } } } { LineNumberTag tag = (LineNumberTag) host.getTag("LineNumberTag"); if(tag!=null) { if(tag.getLineNumber()==lineNumber) { return true; } } } return false; }
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1;
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1;