Hi, great point Marcus.  I was wondering why cant a compiled method
know the "ast" that generated it?

It would ease the queries + manipulation, in the tools a lot!

CompiledMethod>>getSourceReplacingSelectorWith: aSelector
....

would be instead:

CompiledMethod>>withSelector: aSelector
  ^ (self ast withSelector: aSelector) source.


I've been using an AST, instead of the CompiledMethods directly for
this reason, to deal with more expressive power.

Fernando

On Tue, Aug 14, 2012 at 2:56 PM, Marcus Denker <marcus.den...@inria.fr> wrote:
>
> On Aug 14, 2012, at 2:01 PM, Mariano Martinez Peck <marianop...@gmail.com> 
> wrote:
>
>> Hi guys. Today, there is a part of the system coupled with Compiler. Issue 
>> is: http://code.google.com/p/pharo/issues/detail?id=6110
>>
>> Now, if you see the method:
>>
>> getSourceReplacingSelectorWith: newSelector
>>       | oldKeywords newKeywords args newSelectorWithArgs source oldSelector 
>> s |
>>       source := self sourceCode.
>>       oldSelector := self parserClass new parseSelector: source.
>>       oldSelector = newSelector ifTrue: [ ^ source ].
>>       oldKeywords := oldSelector keywords.
>>       newKeywords := (newSelector ifNil: [self defaultSelector]) keywords.
>>       [oldKeywords size = newKeywords size] assert.
>>       args := (self methodClass parserClass new
>>               parseArgsAndTemps: source string notifying: nil) copyFrom: 1 
>> to: self numArgs.
>>       newSelectorWithArgs := String streamContents: [:stream |
>>               newKeywords withIndexDo: [:keyword :index |
>>                       stream nextPutAll: keyword.
>>                       stream space.
>>                       args size >= index ifTrue: [
>>                               stream nextPutAll: (args at: index); space]]].
>>       s := source string readStream.
>>       oldKeywords do: [ :each | s match: each ].
>>       args isEmpty ifFalse: [ s match: args last ].
>>       ^newSelectorWithArgs trimBoth, s upToEnd
>>
>> The 2 magic lines are:
>>
>> oldSelector := self parserClass new parseSelector: source.
>>       oldSelector = newSelector ifTrue: [ ^ source ].
>>
>> So, why we cannot just replace "self parserClass new parseSelector: source." 
>> with "self selector". Well, I think (talking with Guille) this ONLY because 
>> of Trait transformation/aliases that associates a selector with a method of 
>> a different selector.
>>
>> If this is the case, it means that 99% of the cases,"oldSelector = 
>> newSelector ifTrue: [ ^ source ].  "  is true. Because those aliases are 
>> only used in one trait in all the image ().
>>
>> So...if that is the case, can't we get the oldSelector from elsewhere  
>> rather than needing to use the Compiler to get the selector from the source 
>> code ?
>>
> As we now encode the selector in the CompiledMethod itself, this can be 
> relaced with
>
>         oldSelector := self selector.
>
>
> But what you have left is the arguments...
>
> args := (self methodClass parserClass new
>                 parseArgsAndTemps: source string notifying: nil) copyFrom: 1 
> to: self numArgs.
>
> The only way to get the the argument names (temps) of a method is to compile 
> the source... no way around it.
>
> (I personally think this is another example why bytecode as the model for 
> reflection is just wrong)
>
>
>         Marcus
>
>
> --
> Marcus Denker -- http://marcusdenker.de
>
>

Reply via email to