[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Performing a scene transformation _after_ body transforms...



I'm not sure about BodyTransformers masquerading as SceneTransformers.
However, I would agree with Steve that we need a more powerful way to
apply transformations. Something along the lines of:

  1. do SceneTr A
  2. while (cond1)
       do SceneTr B
       do BodyTr a
       while (cond2)       
         do BodyTr b
       do BodyTr c
  3. do BodyTr d
  4. do SceneTr C n times
  ...

My approach would be to develop a custom Pack (a better name, i.e. a la
Design Patterns, might be Strategy) object and modify Scene.java and
Main.java to apply my custom Pack. One might even consider writing a
small compiler that could create a Strategy class or object from some
definition file. Perhaps others have some thoughts on how to do this.

Rhodes


On Tue, 2002-02-12 at 16:55, Stephen Andrew Neuendorffer wrote:
> 
> Well, it still seems pretty limiting...  What if I want to run a 
> SceneTransformation,
> a BodyTransformation and then another SceneTransformation?
> 
> What I've done is to implement an Adaptor that turns BodyTransformations 
> into SceneTransformations:
> 
> public class TransformerAdapter extends SceneTransformer {
>      /** Construct a new transformer
>       */
>      public TransformerAdapter(BodyTransformer transformer) {
>          _transformer = transformer;
>      }
> 
>      protected void internalTransform(String phaseName, Map options) {
>          System.out.println("TransformerAdapter.internalTransform("
>                  + phaseName + ", " + options + ")");
> 
>          Iterator classes = Scene.v().getApplicationClasses().iterator();
>          while(classes.hasNext()) {
>              SootClass theClass = (SootClass)classes.next();
>              Iterator methods = theClass.getMethods().iterator();
>              while(methods.hasNext()) {
>                  SootMethod m = (SootMethod) methods.next();
>                  if(!m.isConcrete())
>                      continue;
> 
>                  JimpleBody body = (JimpleBody) m.retrieveActiveBody();
> 
>                  // FIXME: pass in the options.
>                  // Currently this is not possible because the
>                  // internalTransform method is protected.
>                  _transformer.transform(body, phaseName, "");
>              }
>          }
>      }
> 
>      private BodyTransformer _transformer;
> }
> 
> This is much cleaner than the instanceof check that currently exists 
> somewhere (Scene, I think?) to handle
> the two types of classes separately...  it also fixes the annoyance with 
> the required ordering between
> the two types of transformers...
> 
> My current problem is that the whole idea of the way transforms are 
> organized in soot:
> 1) means that I have to know what transformations I want to execute before 
> looking at my program
> 2) The topology of the transformations is a list...
> 
> Consider the following....  I want to inline all static methods, 
> unfortunately, static methods may all other static methods.
> This means I have to iterate until there are no invocations that can be 
> inlined...
> There is no way to build this within Soot transformation mechanism, 
> starting from a transformation that inlines all the method invocations that
> are currently available...
> while(sites can be inlined) {
>          inlineAllAvailableSites();
> }
> 
> Another...  I write a tranformation that is fast, but makes certain 
> assumptions about the code.... I write another that is slow, but makes no 
> assumptions...  I write an analysis that determines if the assumptions hold:
> 
> if(assumptions hold) {
>          doFast();
> } else {
>          doSlow();
> }
> There is no way to build the comparison within the transformation mechanism...
> 
> Yes, I can do both of these by creating an action method, and then calling 
> that action method from a transformation that implements the comparison, or 
> the loop, but then I am not leveraging the Transformation mechanism, and 
> the nice interface to the transformations is lost.
> One way of thinking about this, is that an unconditional sequential list is 
> not a terribly rich language for describing the ordering of transformations
> 
> My actual problem is this problem, scaled up...  Basically I am creating 
> classes as copies of other classes and transforming them (approximately 25 
> individual transformations), but I don't
> know what classes I want to create beforehand (it depends on input to the 
> 'compiler')  Furthermore, Some of the generated classes themselves need to 
> be copied and transformed themselves recursively.  This can happen an 
> arbitrary number of times... There is (unfortunately) no way to describe 
> this using the transformation mechanism....
> 
> BTW, any outlook on the new version of soot?
> 
> Steve
> 
>

 
-- 
Rhodes Brown
Sable Research - McGill University

Web:    http://www.sable.mcgill.ca
Email:  rhodesb@sable.mcgill.ca