[Soot-list] How to add transformation without modifying the Soot source code

Mario Mendez mario at cs.unm.edu
Thu Apr 12 02:00:29 EDT 2007


Hi again, guys

First of all, thank you for your quick response in the last question. 
you were so diligent that I have another one ;-)

I have my BodyTransformer; for making it work it was necessary to
a)Add the transformation phase in soot.PackManager

         addPack(p = new JimpleBodyPack());
         {
	    // ...	
             p.add(new Transform("jb.pl",CiaoGenerator.v()));
         }
b)Force it to actually transform bodies when iterating through them in 
soot.JimpleBodyPack

    private void applyPhaseOptions(JimpleBody b, Map opts)
     {
	// ...
         PackManager.v().getTransform( "jb.pl" ).apply( b ); 

     }

c) add the singleton retrieval in Singletons

     private soot.jimple.toolkits.ciao.CiaoGenerator 
instance_soot_jimple_toolkits_scalar_CiaoGenerator;

     public soot.jimple.toolkits.ciao.CiaoGenerator 
soot_jimple_toolkits_scalar_CiaoGenerator() {
         if( instance_soot_jimple_toolkits_scalar_CiaoGenerator == null 
) instance_soot_jimple_toolkits_scalar_CiaoGenerator = new 
soot.jimple.toolkits.ciao.CiaoGenerator( g );
         return instance_soot_jimple_toolkits_scalar_CiaoGenerator;
     }

d) ...and all the corresponding options in Options


So the question is: for doing so, I'm modifying you code. This is 
problematic for many reason, including that I share my source with other 
people in my group. So rather than telling them: "download Soot and then 
overwrite this 4 files and add this one here and..." I would like to 
create a Main of my own, which does all the above using the API instead 
of overwriting your code. Something like

class MyMain extends soot.Main{
	/...
	
	public int run(String[] args) {

	    PackManager.v().add(myTransformer)
	    tell PackManager to actually use myTransformer, instead of modify 
JimpleBodyPack.java  	
	    add the singleton to Singletons through some interface, instead of 
modifying Singletons.java 	
	    super.run(args)
	}


Probably there is a way of doing this. If that is the case, my code will 
be completely separated from yours, so if for example you release a new 
version my transformation will work right away. Can you guys help me a 
little? Thanks!












More information about the Soot-list mailing list