jakarta-bcel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From zagiatakrapo...@gmx.ch
Subject Re: Bug#: 46254
Date Tue, 27 Jan 2009 20:44:00 GMT
@all: Hi again, 
@Matthew Wilson: thx for your comments

It is my 5th month now I'm working fulltime on an academic project that is based on BCEL.
The problem discussed here is an important one for me. I try to solve it, but weeks pass and
I'm still not satisfied with the solution. Maybe you can provide some more comment on this
topic in order to propose a better solution and maybe to better understand the design issue
I try to explain.

The design problem is the following.
We have an InstructionList, we want to insert new instructions at certain points. We are using
a visitor class implementing the visitor interface to visit the whole instruction list and
do the changes to it.

Let's say our loop over the InstructionList is in a class A, our Visitor is class B.
In A the loop looks the following:

for(InstructionHandle currIH: iList.getInstructionHandles() )
{
      currIH.accept(instanceOfVisitorClassB);
}


one certain method in the( visitor ) class B looks  something like this:
  public void visitASTORE( ASTORE obj ) {
      ...
      InstructionList il = new InstructionList();
      ... // fill the new il
      // insert instructions before actual ASTORE instruction
      iList.insert( obj, il );
      iList.setPositions();
      super.visitASTORE( obj );
    }

So if the ASTORE instruction is visited we call the method 
insert(Instruction, InstructionList) which causes the error described before (insertion point
may be wrong because of == equal refrence match on instructions).

Therefore we shouldn't visit the INSTRUCTIONS but the INSTRUCTIONHANDLES but as far as I know
there isnt' a visitor which has the interface 
visitASTORE( ASTOREHANDLE obj ) or something like that.

My dirty, quickfix, hack is the following:
Class B I put as inner class into A, the loop in class A sets a public field currentVisitedInstructionHandle,
then the visitor method I changed to:
     public void visitASTORE( ASTORE obj ) {
      ...
     // insert instructions before actual ASTORE instruction
      _textsegment_il.insert( currentVisitedInstructionHandle, il );
      _textsegment_il.setPositions();
     }
THE DIFFERENCE IS:
insert(InstructionHandle, InstructionList) is called, and because InstructionHandles are unique
our insertion is correct.

NOW: I think this is somehow ugly, right?
I tried to write an InstructionHandle visitor, I already wrapped all the Instruction class
automatically, but then I realized that it is far too much work for one guy.

Do you see my point? I think the design of the visitor (which is a great concept!) should
be somehow changed to better address a problem like that.

If you have any better solution, or if I'm doing something wrong, please let me now!

@Matthew: do you have an idea?


kind regards
zagi
 


-- 
NUR NOCH BIS 31.01.! GMX FreeDSL - Telefonanschluss + DSL 
für nur 16,37 EURO/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a

---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-dev-help@jakarta.apache.org


Mime
View raw message