do you know that you can create class silently? so that you do not
have to remove them from the log?

Stef

On Sat, Sep 23, 2017 at 10:33 PM, Nicolás Papagna Maldonado
<[email protected]> wrote:
> Im writing some tests that needs to create classes dynamically. During the
> tearDown phase, i remove these classes using #removeFromSystem.
>
> I noticed that running these tests became more and more slower as i kept
> adding more tests.
> Using "Run Profiled" from Test Runner, i found out
> ChangesLog>>#logClassRemoved: was responsible of about 43% of the execution
> time:
>
> logClassRemoved: annoucement
>         annoucement classRemoved acceptsLoggingOfCompilation ifTrue: [
>                 self logChange: 'Smalltalk globals removeClassNamed: #',
> annoucement
> classRemoved name
>         ].
>
> Based on that, i overrided #acceptsLoggingOfCompilation on the new classes
> to avoid these changes being written down to disk (the classes are
> disposable after all), but ChangeSet kept doing it.
>
> I confirmed this by inspecting annoucement classRemoved
> acceptsLoggingOfCompilation which returns true, ignoring the overriding
> implementation i provided.
>
> #acceptsLoggingOfCompilation overriding implementation seems to be lost
> during the #removeFromSystem call. Specifically, during Behavior>>#obsolete,
> which is called during
>
> Class>>#obsolete
>         "Change the receiver and all of its subclasses to an obsolete
> class."
>         self == Object
>                 ifTrue: [^self error: 'Object is NOT obsolete'].
>         self setName: 'AnObsolete' , self name.
>         Object class instSize + 1 to: self classSide instSize do:
>                 [:i | self instVarAt: i put: nil]. "Store nil over class
> instVars."
>         self classPool: nil.
>         self sharedPools: nil.
>         self hasClassSide ifTrue: [ self theMetaClass obsolete]. <=======
> HERE
>         self propertyAt: #obsolete put: true.
>         super obsolete.
>
> When i checked Behavior>>#obsolete, i found out the method dictionary is
> emptied, losing my implementation of #acceptsLoggingOfCompilation
>
> Behavior>>obsolete
>         "Invalidate and recycle local methods,
>         e.g., zap the method dictionary if can be done safely."
>         self canZapMethodDictionary
>                 ifTrue: [self methodDict: self emptyMethodDictionary].
> <======= HERE
>         self hasTraitComposition ifTrue: [
>                 self traitComposition traits do: [:each |
>                         each removeUser: self]]
>
> I don't know if this is by design or not, but it seems that the class that
> gets announced when removed, is not exactly the same as the original.
>
> Any thoughts/recommendations?
>
>
>
> --
> Sent from: http://forum.world.st/Pharo-Smalltalk-Developers-f1294837.html
>

Reply via email to