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); } }
private int getJavaLnOfHost(Host h) { Iterator<Tag> it = h.getTags().iterator(); while (it.hasNext()) { Tag t = it.next(); if (t instanceof SourceLnPosTag) { return ((SourceLnPosTag) t).startLn(); } else if (t instanceof LineNumberTag) { return (new Integer(((LineNumberTag) t).toString())).intValue(); } } return 0; }
/** * 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) { int idx = 0; PatchingChain<Unit> units = b.getUnits(); Iterator<Unit> it = units.iterator(); while (it.hasNext()) { Inst i = (Inst) it.next(); List<Tag> tags = i.getTags(); for (int k = 0; k < tags.size(); k++) { Tag t = (Tag) tags.get(k); if (t instanceof LineNumberTag) { tags.remove(k); break; } } if (i instanceof IdentityInst) { continue; } i.addTag(new LineNumberTag(idx++)); } } }
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"); } }
private void createTag(soot.Value value, ASTNode node) { if(node == null || tagMap.containsKey(value)) return; if(node.getStart() != 0 && node.getEnd() != 0) { int line = node.getLine(node.getStart()); int column = node.getColumn(node.getStart()); int endLine = node.getLine(node.getEnd()); int endColumn = node.getColumn(node.getEnd()); String s = node.sourceFile(); s = s != null ? s.substring(s.lastIndexOf(java.io.File.separatorChar)+1) : "Unknown"; tagMap.put(value, new soot.tagkit.SourceLnNamePosTag(s, line, endLine, column, endColumn)); } else { tagMap.put(value, new soot.tagkit.LineNumberTag(node.lineNumber())); } }
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1; meth.addTag(new LineNumberTag(line_num + 1)); meth.addTag(new LineNumberTag(line_num));
@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; }
/** * Fixes the line numbers. If there is a unit without a line number, it gets the line number of the last (transitive) * predecessor that has a line number. */ protected void fixLineNumbers() { int prevLn = -1; for (DexlibAbstractInstruction instruction : instructions) { Unit unit = instruction.getUnit(); int lineNumber = unit.getJavaSourceStartLineNumber(); if (lineNumber < 0) { if (prevLn >= 0) { unit.addTag(new LineNumberTag(prevLn)); unit.addTag(new SourceLineNumberTag(prevLn)); } } else { prevLn = lineNumber; } } }
private int getJavaLnOfHost(Host h) { Iterator<Tag> it = h.getTags().iterator(); while (it.hasNext()) { Tag t = it.next(); // logger.debug(""+t.getClass().toString()); if (t instanceof SourceLnPosTag) { // logger.debug("t is LineNumberTag"); return ((SourceLnPosTag) t).startLn(); } else if (t instanceof LineNumberTag) { return (new Integer(((LineNumberTag) t).toString())).intValue(); } } return 0; }
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1; meth.addTag(new LineNumberTag(line_num + 1)); meth.addTag(new LineNumberTag(line_num));
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; }
LineNumberTag lntag = new LineNumberTag(element0.line_number); stmtstags.put(start_stmt, lntag); startstmts.add(start_stmt);
private void printAttributeTag(Tag t) { if (t instanceof LineNumberTag) { int lnNum = (new Integer(((LineNumberTag) t).toString())).intValue(); printJavaLnAttr(lnNum, lnNum); } else if (t instanceof JimpleLineNumberTag) {
lineToMeth.put(new Integer(tag.getLineNumber()), meth); int line_num = tag.getLineNumber() - 1; meth.addTag(new LineNumberTag(line_num + 1)); meth.addTag(new LineNumberTag(line_num));
/** * 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())); } } }
public void setLine(ASTNode node) { if(node.getStart() != 0 && node.getEnd() != 0) { int line = node.getLine(node.getStart()); int column = node.getColumn(node.getStart()); int endLine = node.getLine(node.getEnd()); int endColumn = node.getColumn(node.getEnd()); String s = node.sourceFile(); s = s != null ? s.substring(s.lastIndexOf(java.io.File.separatorChar)+1) : "Unknown"; lineTag = new soot.tagkit.SourceLnNamePosTag(s, line, endLine, column, endColumn); } else { lineTag = new soot.tagkit.LineNumberTag(node.lineNumber()); } }
public void addTag(Tag t) { if (t instanceof LineNumberTag) { int lnNum = (new Integer(((LineNumberTag) t).toString())).intValue(); javaStartLn(lnNum); javaEndLn(lnNum);
void emitStmt(Stmt stmt) { LineNumberTag lnTag = (LineNumberTag) stmt.getTag("LineNumberTag"); if (lnTag != null) { emit(".line " + lnTag.getLineNumber());
/** * Tag the passed host with: - this instructions line number (if one is set) - the original bytecode offset * * @param host * the host to tag */ protected void addTags(Host host) { Options options = Options.v(); if (options.keep_line_number() && lineNumber != -1) { host.addTag(new LineNumberTag(lineNumber)); host.addTag(new SourceLineNumberTag(lineNumber)); } if (options.keep_offset()) { host.addTag(new BytecodeOffsetTag(codeAddress)); } }