[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bcel-dev
Subject:    Re: Constructor Instrumentation : super()
From:       "Nikhil C. Khedkar" <nikhilckhedkar () yahoo ! com>
Date:       2004-02-19 9:48:48
Message-ID: 20040219094849.89605.qmail () web13609 ! mail ! yahoo ! com
[Download RAW message or body]

Hi Erik and Andrew,
	Finally able to get this thing fixed. Here's the
approach I have followed (Just for everyone's
information).

1)Firstly detect that a method is constructor from its
name "<init>".
2)Put a try catch block.
3)Take care to skip super() calls which should be the
first line in the constructor. [Andrew won't agree
with this. He has indeed provided me with some code,
but I think my assumption is true for normal Sun javac
compiler. Andrew please confirm]
4)Now the approach to find super() call and
distinguish it from an explict new() call.
Scan all the instructions in the constructor from 0
onwards. Keep a counter initialized at 0. Increment
the counter when you encounter a NEW instruction.
Decrement it when you encounter a INVOKESPECIAL
(that's how you create an object). When this counter
becomes negative, you have encountered a super() call.
When this counter becomes 0, its the new() call.
[Thanks Eric]

That's all.

Thanks,
	Nikhil Khedkar


Here's my problem statement if you haven't read it
previously:

Hi,
	I have a query regarding the instrumentation of the
constructor. I have read all the archived mail in this
regard, but none of them served useful. I have the
same requirement i.e. put a method call at each method
start and method end. Have already put a try catch for
that. Now the task is to skip super() call before I
put my method call in the constructor.
	
	I have a code that works for 99% of the cases. 
	
	for(int j = 1; j < ihs.length; j++)
	{
		if(ihs[j].getInstruction() instanceof INVOKESPECIAL)
		{
			il.append(ihs[j], instrumentedPatchList);
			break;
		}
	}
	
	It works for 
	
	1)public ABCD(XYZ obj)
	{
		super(obj);
	}
	
	Now a more complicated case
	
	2)public Tree(int type, MainPanel mainPanel)
	{
		super(new DefaultTreeModel(new RuleNode("Rules")));
		method1();
		method2();
	}
	
	The above code fails because the Special Instruction
is not at first position. Hence A refined approach
will be to get the first instruction handle of the
second line in the constructor (first instruction
handle for method1()). Now I scan all the instructions
of the first line (super(new DefaultTreeModel(new
RuleNode("Rules")))). If there is any INVOKESPECIAL in
this list I put my code at the end of first line. This
thing works fine.
	
	A bit more complex case
	
	3)private XYZHandler(EventHandler commandHandler)
	{
		super(
			ABCD.getInstance(),
			Helper.getInstance(),
			commandHandler,
			100);
		method1();
	}
	
	Now the above mentioned approach doesn't work and I
end up putting my method call before super() and get
VerifyError. Has anyone (especially the ones who have
posted those questions on constructor instrumentation
previously) been able to build a fullproof code?
	
Thanks,
	Nikhil Khedkar

__________________________________
Do you Yahoo!?
Yahoo! Mail SpamGuard - Read only the mail you want.
http://antispam.yahoo.com/tools

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

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic