You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-user@jakarta.apache.org by "Koduru, Rajendra Kumar Reddy" <ra...@sap.com> on 2005/02/15 16:25:01 UTC

Problem with instrumentation in constructors

Hi All, 
	
	problem with instrucion list seperation.

	I am trying to instrument my constructor as mentioned in
http://www.mail-archive.com/bcel-user@jakarta.apache.org/msg00475.html

	could you please let me know, where i am going wrong...
	
	instrMethod() {

	 InstructionList iList = mgen.getInstructionList ();
// I am getting my instruction list


	/* if init, I want to seperate this list into two instruction
lists, one containing 
	until super calls (let us say super list)and other containing
the iList,without the instructions till super calls
	*/

	  if ( mgen.getName().equals ( "<init>" ) ){

        superList = getIListSuper(iList);

      }

	// inserting try finally around the iList
	insertTryFinally (iList)
	
	if(superList != null){
        iList.insert ( iList.getStart (), superList );
        } 


	return mgen.getMethod ();
	}


	public InstructionList getIListSuper(InstructionList iList){
    
    int invkSpec = 0;

    InstructionHandle seperator = null;
   
    InstructionList superList = iList.copy(); // deep copy
    
    for ( Iterator i = superList.iterator (); i.hasNext (); ) {
      seperator = ( InstructionHandle ) i.next ();

      if(seperator.getInstruction() instanceof NEW )
          invkSpec++;

      if(seperator.getInstruction() instanceof INVOKESPECIAL )
        invkSpec--;

      if(invkSpec < 0 )
        break;
    }
    
    if(invkSpec < 0) {
    try {
      superList.delete(seperator.getNext(),iList.getEnd()); 	// i
collect here the instruction list till the seperator
	iList.delete(iList.getStart(), seperator);
// the iList that should be instrumented. // throwing target lost
exception

    } catch ( TargetLostException e ) {				
     e.printStackTrace();
    }
 
    return superList;
    }
  
	  return null;
    }



	The problem could be said as seperating an isntruction list into
two instruction lists based on InstructionHandle
	i.e, based on seperator (InstructionHandle), I want to divide
the incoming instructionList into two parts (one list till super call
and other staring
After super() until end)


	Please help me in this regard.

Thank you
Reddy



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


Re: Problem with instrumentation in constructors

Posted by Andrew Huntwork <as...@huntwork.net>.
First, note my objections to this method given in the thread you 
reference below.

It looks like you're saying below that your current problem is that 
you're getting TargetLostExceptions.  I would propose a slightly 
different idea for getIListSuper that would possibly solve several 
problems:

InstructionHandle getIListSuper(InstructionList il) {
  //do your NEW/INVOKESPECIAL counting here to find the super() call
  return separator;
}

now change insertTryFinally to have this signature:
void insertTryFinally(InstructionList il,InstructionHandle ih) and
pass it separator.  make the beginning of the try / finally be 
separator.  remove this block, since it's no longer necessary:


 > 	if(superList != null){
 >         iList.insert ( iList.getStart (), superList );
 >         }

i wonder how that will work.

Koduru, Rajendra Kumar Reddy wrote:
> Hi All, 
> 	
> 	problem with instrucion list seperation.
> 
> 	I am trying to instrument my constructor as mentioned in
> http://www.mail-archive.com/bcel-user@jakarta.apache.org/msg00475.html
> 
> 	could you please let me know, where i am going wrong...
> 	
> 	instrMethod() {
> 
> 	 InstructionList iList = mgen.getInstructionList ();
> // I am getting my instruction list
> 
> 
> 	/* if init, I want to seperate this list into two instruction
> lists, one containing 
> 	until super calls (let us say super list)and other containing
> the iList,without the instructions till super calls
> 	*/
> 
> 	  if ( mgen.getName().equals ( "<init>" ) ){
> 
>         superList = getIListSuper(iList);
> 
>       }
> 
> 	// inserting try finally around the iList
> 	insertTryFinally (iList)
> 	
> 	if(superList != null){
>         iList.insert ( iList.getStart (), superList );
>         } 
> 
> 
> 	return mgen.getMethod ();
> 	}
> 
> 
> 	public InstructionList getIListSuper(InstructionList iList){
>     
>     int invkSpec = 0;
> 
>     InstructionHandle seperator = null;
>    
>     InstructionList superList = iList.copy(); // deep copy
>     
>     for ( Iterator i = superList.iterator (); i.hasNext (); ) {
>       seperator = ( InstructionHandle ) i.next ();
> 
>       if(seperator.getInstruction() instanceof NEW )
>           invkSpec++;
> 
>       if(seperator.getInstruction() instanceof INVOKESPECIAL )
>         invkSpec--;
> 
>       if(invkSpec < 0 )
>         break;
>     }
>     
>     if(invkSpec < 0) {
>     try {
>       superList.delete(seperator.getNext(),iList.getEnd()); 	// i
> collect here the instruction list till the seperator
> 	iList.delete(iList.getStart(), seperator);
> // the iList that should be instrumented. // throwing target lost
> exception
> 
>     } catch ( TargetLostException e ) {				
>      e.printStackTrace();
>     }
>  
>     return superList;
>     }
>   
> 	  return null;
>     }
> 
> 
> 
> 	The problem could be said as seperating an isntruction list into
> two instruction lists based on InstructionHandle
> 	i.e, based on seperator (InstructionHandle), I want to divide
> the incoming instructionList into two parts (one list till super call
> and other staring
> After super() until end)
> 
> 
> 	Please help me in this regard.
> 
> Thank you
> Reddy
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: bcel-user-help@jakarta.apache.org
> 
> 

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