Skip to Main Content

Java Programming

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

java-soot issue - jimple line numbers??

807580May 26 2010 — edited May 26 2010
Hello everybody,

I am trying to write a piece of java code that will convert a java class to jimple, print the jimple code along withe the line numbers and then give the line numbers for lines with "virtual invoke".

The code that I have written so far 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");
		RetInst rt = (RetInst)unit;
		int index = rt.getIndex();  // to get the index of the jimple lines ???
		System.out.println("Index is :" + index);
	    	System.out.println(unit);
		if (tag != null)
//the following piece of code gives me the line number but its in the java source code....i need the line numbers of jimple code.
		    {
			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]);
	    }
	}
 }
So I am getting the following error message:
GetStmts4.java:9: GetStmts4 is not abstract and does not override abstract method setIndex(int) in soot.baf.RetInst
public class GetStmts4 extends BodyTransformer implements RetInst

Thanks!!
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 23 2010
Added on May 26 2010
6 comments
1,155 views