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
Description: Binary data
