Re: InstructionFactory, design issue, createDUP
"Dave Brosius" <[email protected]> Thu, 20 Nov 2008 19:47:24 -0500
| Newsgroups | gmane.comp.jakarta.bcel.user |
|---|---|
| Message-ID | <009b01c94b72$b8cb5ca0$6401a8c0@MeBigFatGuy> |
Please add an issue to Bugzilla https://issues.apache.org/bugzilla/index.cgi ----- Original Message ----- From: <[email protected]> To: <[email protected]> Sent: Wednesday, November 19, 2008 1:09 PM Subject: InstructionFactory, design issue, createDUP > Hi, > > maybe I misunderstand the feature or the idea behind the > InstructionFactory but in the case I use it, the implementation of the > creation of some instructions e.g. DUPs it is really misleading. If you > create an invokeinstruction or an constant like ldc a new instruction > object is created. Pretty straight forward! But if you create a DUP > instruction you always will get the same object back. This is of course is > great for saving memory, but in the following example it leads to lots of > problems. > > Imagine you instrument a code sequence and add your own instructions one > after the other. You add invokestatic instructionsbut also the dups. At > the end you iterate again over the whole list to add some missing > instructions ( doing it in the first iteration is not possible or too much > work, due to the semantics of the algorithm). If you add new instructions > again it will not work properly if your insertion point is a DUP! The new > instruction will be inserted at the first match of the list. > e.g. > i1,... are instructions other than dup, > dup_ are DUP instructions created with InstructionFactory.createDUP(); > > you iterate from i1 to i6; > > init: i1, i2, i3, dup_1, i4, i5, dup_2, i6 > > 1.) insert(i3, new_i) > result: i1, i2, new_i, i3, dup_1, i4, i5, dup_2, i6 > > 2.) insert(dup_1, new_i2) > result: i1, i2, new_i, i3, new_i2, dup_1, i4, i5, dup_2, i6 > > 3.) insert(dup_2, new_i3) > result: i1, i2, new_i, i3, new_i2, new_i3, dup_1, i4, i5, dup_2, i6 > > The reason for this is that dup_1 dup_2 point to the same static DUP > instance (there is always one). Your call to insert() > calls a method findInstruction() and this method only compares references > (==) and returns the first match. > Even if you use copy() you get the same reference! To omit this problem > you have to create an instance without the factory by using a constructor. > > My point is, you can implement it this way BUT you have to mention this in > the API doc that this createDUP method does not behave like a createInvoke > method and always returns the same reference. I know usually the code is > the documentation but I think a lot of pain could be spared with a tiny > little sentence in the doc. > > > -- > Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: > http://www.gmx.net/de/go/multimessenger > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] >