[Soot-list] counting number of lines in jimple

DIVYA IYER sirius.strider at gmail.com
Wed May 26 12:27:17 EDT 2010


Hello everybody,

I am trying to write a program that takes a java class file...converts it
into corresponding jimple code and prints out the jimple statements along
with their line numbers. Then I would like to pick out those lines from the
jimple code which have a "virtual invoke". The code that I have written
looks like below:

import soot.*;
import java.util.*;
import soot.util.*;
import soot.jimple.Stmt;
import soot.tagkit.LineNumberTag;
import soot.baf.*;
import java.io.*;

public class GetStmts4 extends BodyTransformer implements RetInst
{
    private static GetStmts4 instance = new GetStmts4();

    private GetStmts4() {};

    public static GetStmts4 v()
    {
    return instance;
    }

    public static void main(String args[])
    {
    soot.options.Options.v().set_keep_line_number(true);
    //soot.options.Options.v().set_whole_program(true);
    //soot.options.Options.v().setPhaseOption("cg","verbose:true");
        PackManager.v().getPack("jtp").add(new Transform
("jtp.annotexample",GetStmts4.v()));
    soot.Main.main(args);

    }

    protected void internalTransform(Body b, String phaseName, Map options)
    {
    int linenum = 0;
    int count = 0;
    int array[] = new int[20];
    PatchingChain units = b.getUnits();
    Iterator unitsIt = units.iterator();

    while(unitsIt.hasNext())
        {
        Unit unit = (Unit)unitsIt.next();
        LineNumberTag tag = (LineNumberTag) unit.getTag("LineNumberTag");
        int index = rt.getIndex();  //to get the index of the jimple
line??is this correct??
        System.out.println("Index is :" + index);
       System.out.println(unit);
        if (tag != null)

//wrote the following piece of code but it gives me the line number in the
source code...and not the jimple line number
            {
            System.out.println("java line number:"+tag.getLineNumber());
            //System.out.println("tag name:"+tag.getName());
            String string = unit.toString();
            if(string.matches("\\s*.*virtualinvoke.*"))
                {
                count++;
                System.out.println("line number with
virtualinvoke:"+tag.getLineNumber());
                array[count] = tag.getLineNumber();
                System.out.println("the " +count+ " element in array is : "
+array[count]);
                }
            }
        }
    for(int k = 1;k <= count; k++)
        {
        System.out.println(array[k]);
        }
      }
   }

Would be really grateful if somebody could help me out with this.
Thanks!!!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20100526/5871eb43/attachment.html 


More information about the Soot-list mailing list