Thanks you!!


El 07/05/2012, a las 15:27, Eliot Miranda <[email protected]> escribió:

> Hi Carla,
> 
> On Sun, May 6, 2012 at 2:12 AM, Carla F. Griggio <[email protected]> 
> wrote:
> Yay! It works beautifully :D
> 
> I 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 <[email protected]> 
> wrote:
> Thanks Guille! That gives me more tools to play with :P
> 
> 
> On Sun, May 6, 2012 at 5:49 AM, Guillermo Polito <[email protected]> 
> 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.
> 
> Guille
> 
> 
> On Sun, May 6, 2012 at 10:38 AM, Carla F. Griggio <[email protected]> 
> 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>

Reply via email to