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 <yuriy.tymchuk@me.com> 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 <tudor@tudorgirba.com> 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 <nicolaihess@web.de> wrote:
2015-05-17 11:34 GMT+02:00 stepharo <stepharo@free.fr>:
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"