Hi Carla,On Sun, May 6, 2012 at 2:12 AM, Carla F. Griggio <carla.griggio@gmail.com> wrote:Yay! It works beautifully :DI added this method in CompiledMethod as an extension of my project:CompiledMethod>>referredInstVars|theClass idx|theClass := self methodClass.^theClass instVarNames select: [ :varName |idx := theClass instVarIndexFor: varName.(self readsField: idx) or: [ self writesField: idx ]]Here's an order N way, instead of an order N^2.referredInstVars| allInstVarNames instVarNames |allInstVarNames := self methodClass allInstVarNames.self isReturnField ifTrue:[^Set with: (allInstVarNames at: self returnField + 1)].instVarNames := Set new.self abstractBytecodeMessagesDo:[:msg|(#(#popIntoReceiverVariable:#pushReceiverVariable:#storeIntoReceiverVariable:) includes: msg selector) ifTrue:[instVarNames add: (allInstVarNames at: msg argument + 1)]].^instVarNames"Dictionary newFromPairs: (Point selectors collect: [:s| { s. (Point >> s) referredInstVars}])"On Sun, May 6, 2012 at 6:04 AM, Carla F. Griggio <carla.griggio@gmail.com> wrote:Thanks Guille! That gives me more tools to play with :POn Sun, May 6, 2012 at 5:49 AM, Guillermo Polito <guillermopolito@gmail.com> wrote:
L��der,
you can do something like:
class := myCompiledMethod methodClass.
class instVarNames select: [ :varName |
idx := class instVarIndexFor: varName.
myCompiledMethod readsField: idx or: [ myCompiledMethod writesField: idx ]
]
because #readsField: and #writesField: are index based.
You can also see as an example: Behavior>>#whichSelectorsAccess: that is var named based, but over all class selectors.
GuilleOn Sun, May 6, 2012 at 10:38 AM, Carla F. Griggio <carla.griggio@gmail.com> wrote:Hi!I'm playing with some metaprogramming, and I'm stuck at trying to find out which instance variables are referred inside a method.I've found that a CompiledMethod understands hasInstVarRefs, but I don't recognize a method that could tell just me what I'm looking for.Any leads?Thanks!Carla.
--
best,Eliot
<CompiledMethod-referredInstVars.st>