That is my suggestion, too. See the bug entry.

Now, we might choose to not do it at the CompiledMethod level, but in
RGMethodDefinition. That is why I would like to have a discussion about it.

Cheers,
Doru

On Sun, May 17, 2015 at 4:14 PM, Yuriy Tymchuk <[email protected]> wrote:

> Can we add an implementation for method and the one for class will reuse
> it?
>
> Uko
>
> Sent from my iPhone
>
> On 17 May 2015, at 16:01, Tudor Girba <[email protected]> wrote:
>
> Indeed. I took again a look at it, and I found two bugs. The method looks
> like this:
>
> TBehavior>>referencedClasses
> "Return the set of classes that are directly referenced by my methods"
> | answer |
> answer := Set new.
> self methods do: [ :cm |
> answer addAll:
> ( cm literals select: [ :l | l isKindOf: Association ] thenCollect: #value
> ) ].
> ^ answer
>
>
> 1. The last literal of a method because the last literal always points to
> the class of the method.
>
> Object methods collectAsSet: [ : cm | cm literals last value ]
> ==>  "a Set(Object)"
>
> So, we need to ignore the last literal
>
>
> 2. The literals that are Associations can also point to other global
> literals that are not classes:
> (ASTCache class>>#initialize) literals allButLast
> select: [ :l | l isKindOf: Association ]
> thenCollect: #value
> ==> "{Smalltalk}"
>
> So, a better implementation for a method is:
>
>
> (Object>>#actionMap)  literals *allButLast*
> select: [ :l | l *value* isKindOf: *Class* ]
> thenCollect: #value
>
> I opened a bug:
>
> https://pharo.fogbugz.com/f/cases/15550/TBehavior-referencedClasses-is-wrong
>
> Cheers,
> Doru
>
>
>
> On Sun, May 17, 2015 at 12:24 PM, Nicolai Hess <[email protected]> wrote:
>
>>
>>
>> 2015-05-17 11:34 GMT+02:00 stepharo <[email protected]>:
>>
>>>
>>>
>>> Le 17/5/15 11:07, Yuriy Tymchuk a écrit :
>>>
>>>> Hi, it want to rewrite the SmallLint rule which checks whether an
>>>> abstract class is referenced. First question is whether the rule is really
>>>> important, because sometimes there are abstract classes with some utility
>>>> class methods, so maybe we should check whether they are “instantiated”
>>>> with #new or #basicNew.
>>>>
>>>
>>> indeed this rule is not really revelant.
>>>
>>>
>>>> Now the real question is how do you get all classes referenced by a
>>>> method. So instead of performing a rule check on a class, do it on a method
>>>> and find if any of the accessed classes is abstract.
>>>>
>>>
>>> check the literal frame of the methods. When a method refers to a class
>>> the class binding is in the literal frame of the compiled method.
>>>
>>
>> There is one method to get all referenced classes by a class
>>
>> Morph referencedClasses -> MorphLostFocus MorphChanged PolygonMorph
>> SystemWindow IdentityTransform GLMUIThemeExtraIcons RGMethodDefinition
>> GTObjectPrinter .....
>>
>> It is defined by TBehavior.
>>
>>
>>
>>
>>
>>
>>>
>>>
>>>> Uko
>>>>
>>>>
>>>
>>>
>>
>
>
> --
> www.tudorgirba.com
>
> "Every thing has its own flow"
>
>


-- 
www.tudorgirba.com

"Every thing has its own flow"

Reply via email to