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.
|
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 <[hidden email]> wrote: Hi! |
Thanks Guille! That gives me more tools to play with :P
On Sun, May 6, 2012 at 5:49 AM, Guillermo Polito <[hidden email]> wrote: Líder, |
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 ] ]
On Sun, May 6, 2012 at 6:04 AM, Carla F. Griggio <[hidden email]> wrote: Thanks Guille! That gives me more tools to play with :P |
Hi Carla,
On Sun, May 6, 2012 at 2:12 AM, Carla F. Griggio <[hidden email]> wrote: Yay! It works beautifully :D
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}])"
best, Eliot CompiledMethod-referredInstVars.st (992 bytes) Download Attachment |
Thanks you!!
|
Free forum by Nabble | Edit this page |