Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
February 2013
- 79 participants
- 1346 messages
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by Nicolas Cellier
Hi Stephane,
I added the exception just to instrument code and trace the usage of
degenerated Rectangles.
You must execute the MessageTally snippet in a workspace and then do
some normal Pharo activity (since I presume you have some developer
activity, open a MC browser or system browser, select a method, browse
implementors, etc...)
The snippet does emulate the World activity, but is catching the
DegeneratedRectangle notification and tallying the call stack each
time this notification is raised.
You then get a nice report of each and every call stack that raised a
DegeneratedRectangle...
Inserting a halt in place of the notification in the hope to debug it
is impossible (try it)
Otherwise you can try and use haltOnce, but IMO it's too limited.
Nicolas
2013/2/14 stephane ducasse <stephane.ducasse(a)free.fr>:
> Nicolas
>
> I did what you suggest
>
>> Notification subclass: #DegeneratedRectangle
>> instanceVariableNames: ''
>> classVariableNames: ''
>> poolDictionaries: ''
>> category: 'Kernel-BasicObjects'
>>
>> Rectangle>>setOrigin: topLeft corner: bottomRight
>> origin := topLeft.
>> corner := bottomRight.
>> (self width < 0 or: [ self height < 0 ]) ifTrue: [
>> DegeneratedRectangle signal ]
>>
>> Then in a workspace:
>>
>> tally := MessageTally new.
>> tally spyEvery: 100 on: ['em ezilaitini ot si siht' reverse].
>> tally class: World class method: World class>>#doOneCycle.
>> "middle lines begin"
>> tallyEnd := false.
>> [(Delay forSeconds: 300) wait. tallyEnd := true] fork.
>> [[World doOneCycle. Processor yield.tallyEnd] whileFalse]
>> on: DegeneratedRectangle
>> do: [:exc | tally tally: exc signalerContext by: 1.
>> exc resume].
>> (StringHolder new contents:
>> (String streamContents: [:s | tally report: s]))
>> openLabel: 'DegeneratedRectangle Spy Results'.
>> "middle lines end"
>> tally close.
>>
>
> But I get nothing 20531
> Then I do not understand the trace you sent where is the information about the wrong rectangle in it.
>
>
>
>
>> and here we go:
>>
>> - 371 tallies, 2 msec.
>>
>> **Tree**
>> --------------------------------
>> Process: other processes
>> --------------------------------
>> 38.3% {1ms} NautilusUI(AbstractNautilusUI)>>browseMessages
>> 38.3% {1ms} NautilusUI(AbstractTool)>>browseMessagesFrom:
>> 38.3% {1ms}
>> NautilusUI(AbstractTool)>>getSelectorAndSendQuery:to:with:selector:
>> 38.3% {1ms} SystemNavigation>>browseAllImplementorsOf:
>> 38.3% {1ms} SystemNavigation>>browseImplementorsOf:name:autoSelect:
>> 38.3% {1ms} SystemNavigation>>browseMessageList:name:autoSelect:
>> 38.3% {1ms} MessageBrowser class>>openMessageList:name:autoSelect:
>> 38.3% {1ms} MessageBrowser>>openWithSpec
>> 38.3% {1ms} MessageBrowser(ComposableModel)>>openWithSpec
>> 38.3% {1ms} MessageBrowser(ComposableModel)>>openWithSpec:
>> 38.3% {1ms} WindowModel>>openWithSpec:
>> 32.1% {1ms} WindowModel>>buildWithSpec:
>> |24.8% {0ms} WindowModel>>addModelIn:withSpec:
>> | |22.9% {0ms}
>> MessageBrowser(ComposableModel)>>buildWithSpec:
>> | | |19.4% {0ms} SpecInterpreter
>> class>>buildWidgetFor:withSpec:
>> | | | |19.4% {0ms} SpecInterpreter
>> class>>interpretASpec:model:
>> | | | | 19.4% {0ms} SpecInterpreter
>> class>>interpretASpec:model:superSpec:
>> | | | | 19.4% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | 19.4% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | | 9.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | |9.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | 9.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | | 9.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | | 9.7%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | 9.7%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | | | 9.7%
>> {0ms} SpecInterpreter>>retreiveSpecFrom:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | | |
>> |4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | | |
>> 4.9% {0ms} MultiColumnListModel(ComposableModel)>>private_buildWithSpec
>> | | | | | |
>> 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
>> | | | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | | | |
>> 4.9% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | | |
>> 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | | | |
>> |2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> | 2.7% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec
>> | | | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec:
>> | | | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>instance
>> | | | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>initializeInstance
>> | | | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | | |
>> | |1.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> | | 1.3% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | | | |
>> | | 1.3%
>> {0ms} DropListMorph class(Behavior)>>new
>> | | | | | |
>> | | 1.3%
>> {0ms} DropListMorph>>initialize
>> | | | | | |
>> | 1.3% {0ms}
>> RawSpec>>defaultReceiver:model:
>> | | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | | | |
>> | 1.3%
>> {0ms} DropListMorph class(Behavior)>>new
>> | | | | | |
>> |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>instance
>> | | | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>initializeInstance
>> | | | | | |
>> 2.2% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | | |
>> 4.9% {0ms} RawSpec>>defaultReceiver:model:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter class>>private_interpretASpec:model:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | |
>> 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
>> | | | | |
>> 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> 4.9% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | |
>> 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | | |
>> |2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> | 2.7% {0ms} SpecInterpreter>>interpretASpec:
>> | | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec
>> | | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec:
>> | | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>instance
>> | | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>initializeInstance
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | |
>> | |1.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | | |
>> | | 1.3%
>> {0ms} DropListMorph class(Behavior)>>new
>> | | | | |
>> | |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | | |
>> | 1.3% {0ms}
>> RawSpec>>defaultReceiver:model:
>> | | | | |
>> | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | | |
>> |
>> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | | |
>> |
>> 1.3% {0ms} DropListMorph class(Behavior)>>new
>> | | | | |
>> |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>instance
>> | | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>initializeInstance
>> | | | | |
>> 2.2% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | | 9.7% {0ms}
>> RawSpec>>defaultReceiver:model:
>> | | | | 9.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | | 9.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | | 9.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | 9.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | | 9.7%
>> {0ms} SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | | 9.7%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | | 9.7%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> 9.7% {0ms} SpecInterpreter>>retreiveSpecFrom:
>> | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | |
>> |4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
>> | | | |
>> | 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
>> | | | |
>> | 4.9% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | |
>> | 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> | 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | 4.9% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | |
>> | |2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | 2.7% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec
>> | | | |
>> | | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec:
>> | | | |
>> | | 2.7% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | |
>> | | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | |
>> | | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>instance
>> | | | |
>> | | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>initializeInstance
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | | 2.7% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | |
>> | | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | |
>> | | |1.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | | | 1.3%
>> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | |
>> | | | 1.3%
>> {0ms} DropListMorph class(Behavior)>>new
>> | | | |
>> | | |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | |
>> | | 1.3% {0ms}
>> RawSpec>>defaultReceiver:model:
>> | | | |
>> | | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | |
>> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | |
>> | |
>> 1.3% {0ms} DropListMorph class(Behavior)>>new
>> | | | |
>> | |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | |
>> | 2.2% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | |
>> | 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>instance
>> | | | |
>> | 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>initializeInstance
>> | | | |
>> | 2.2% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> | 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | 2.2% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | |
>> 4.9% {0ms} RawSpec>>defaultReceiver:model:
>> | | | |
>> 4.9% {0ms} SpecInterpreter class>>private_interpretASpec:model:
>> | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
>> | | | |
>> 4.9% {0ms}
>> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
>> | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | |
>> 4.9% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | |
>> 4.9% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> 4.9% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:superSpec:
>> | | | |
>> |2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec
>> | | | |
>> | 2.7% {0ms}
>> DropListModel(ComposableModel)>>private_buildWithSpec:
>> | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | | | |
>> | 2.7% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>instance
>> | | | |
>> | 2.7% {0ms}
>> DropListSpec(AbstractSpec)>>initializeInstance
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> | 2.7% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | | |
>> | 1.3% {0ms}
>> SpecInterpreter class>>private_interpretASpec:model:superSpec:
>> | | | |
>> | |1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> | | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> | |
>> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | |
>> | |
>> 1.3% {0ms} DropListMorph class(Behavior)>>new
>> | | | |
>> | |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | |
>> | 1.3% {0ms}
>> RawSpec>>defaultReceiver:model:
>> | | | |
>> | 1.3%
>> {0ms} SpecInterpreter class>>private_interpretASpec:model:
>> | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:
>> | | | |
>> | 1.3%
>> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> |
>> 1.3% {0ms} SpecInterpreter>>interpretASpec:
>> | | | |
>> |
>> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
>> | | | |
>> |
>> 1.3% {0ms} DropListMorph class(Behavior)>>new
>> | | | |
>> |
>> 1.3% {0ms} DropListMorph>>initialize
>> | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>instance
>> | | | |
>> 2.2% {0ms}
>> MultiColumnListSpec(AbstractSpec)>>initializeInstance
>> | | | |
>> 2.2% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:
>> | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>interpretASpec:
>> | | | |
>> 2.2% {0ms}
>> SpecInterpreter>>retreiveSpecFrom:
>> | | |3.5% {0ms}
>> MessageBrowser(ComposableModel)>>ensureExtentFor:
>> | | | 3.5% {0ms} PanelMorph(Morph)>>extent:
>> | | | 3.5% {0ms} PanelMorph(Morph)>>changed
>> | | | 3.5% {0ms}
>> PanelMorph(Morph)>>privateFullBounds
>> | | | 3.5% {0ms}
>> PanelMorph(Morph)>>submorphBounds
>> | | | 3.5% {0ms}
>> PanelMorph(Morph)>>fullBounds
>> | | | 3.5% {0ms}
>> PanelMorph(Morph)>>doLayoutIn:
>> | | | 3.5% {0ms}
>> ProportionalLayout>>layout:in:
>> | | | 3.5% {0ms}
>> PluggableTextMorph(Morph)>>layoutProportionallyIn:
>> | | | 3.2% {0ms}
>> PluggableTextMorph(Morph)>>layoutInBounds:
>> | | | 2.7% {0ms}
>> PluggableTextMorph(Morph)>>bounds:
>> | | | 1.6% {0ms}
>> PluggableTextMorph>>extent:
>> | |1.9% {0ms}
>> StandardWindow(SystemWindow)>>addMorph:frame:
>> | | 1.9% {0ms}
>> StandardWindow(SystemWindow)>>addMorph:fullFrame:
>> | | 1.9% {0ms} PanelMorph>>adoptPaneColor:
>> | | 1.9% {0ms} PanelMorph(Morph)>>color:
>> | | 1.9% {0ms} PanelMorph(Morph)>>changed
>> | | 1.9% {0ms}
>> PanelMorph(Morph)>>privateFullBounds
>> | | 1.9% {0ms}
>> PanelMorph(Morph)>>submorphBounds
>> | | 1.9% {0ms}
>> PanelMorph(Morph)>>fullBounds
>> | | 1.9% {0ms}
>> PanelMorph(Morph)>>doLayoutIn:
>> | | 1.9% {0ms}
>> ProportionalLayout>>layout:in:
>> | | 1.9% {0ms}
>> PluggableTextMorph(Morph)>>layoutProportionallyIn:
>> | | 1.6% {0ms}
>> PluggableTextMorph(Morph)>>layoutInBounds:
>> |7.3% {0ms} SpecInterpreter
>> class>>private_buildWidgetFor:withSpec:
>> | 7.3% {0ms} SpecInterpreter
>> class>>private_interpretASpec:model:
>> | 7.3% {0ms} SpecInterpreter>>interpretASpec:model:
>> | 7.3% {0ms}
>> SpecInterpreter>>interpretASpec:model:superSpec:
>> | 7.3% {0ms} SpecInterpreter>>interpretASpec:
>> | 7.3% {0ms}
>> SpecInterpreter>>actionToPerformWithSelector:arguments:
>> | 7.3% {0ms}
>> WindowSpec(AbstractSpec)>>instance
>> | 7.3% {0ms} WindowSpec>>initializeInstance
>> | 7.3% {0ms} StandardWindow
>> class(Behavior)>>new
>> | 7.3% {0ms} StandardWindow>>initialize
>> | 3.8% {0ms}
>> StandardWindow(SystemWindow)>>initialize
>> | |3.5% {0ms}
>> StandardWindow(SystemWindow)>>extent:
>> | | 3.5% {0ms}
>> StandardWindow(Morph)>>extent:
>> | | 3.5% {0ms}
>> StandardWindow(Morph)>>changed
>> | | 3.5% {0ms}
>> StandardWindow(Morph)>>privateFullBounds
>> | | 3.5% {0ms}
>> StandardWindow(Morph)>>submorphBounds
>> | | 3.5% {0ms}
>> AlignmentMorph(Morph)>>fullBounds
>> | | 3.2% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> | | 3.2%
>> {0ms} RowLayout>>layout:in:
>> | | 3.0%
>> {0ms} Point>>extent:
>> | | 3.0%
>> {0ms} Rectangle class>>origin:extent:
>> | |
>> 3.0% {0ms} Rectangle>>setOrigin:corner:
>> | 3.5% {0ms}
>> StandardWindow(SystemWindow)>>setWindowColor:
>> | 3.5% {0ms}
>> StandardWindow(SystemWindow)>>setStripeColorsFrom:
>> | 3.5% {0ms}
>> StandardWindow(Morph)>>fillStyle:
>> | 3.5% {0ms}
>> StandardWindow(Morph)>>changed
>> | 3.5% {0ms}
>> StandardWindow(Morph)>>privateFullBounds
>> | 3.5% {0ms}
>> StandardWindow(Morph)>>submorphBounds
>> | 3.5% {0ms}
>> AlignmentMorph(Morph)>>fullBounds
>> | 3.2% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> | 3.2%
>> {0ms} RowLayout>>layout:in:
>> | 3.0%
>> {0ms} Point>>extent:
>> | 3.0%
>> {0ms} Rectangle class>>origin:extent:
>> |
>> 3.0% {0ms} Rectangle>>setOrigin:corner:
>> 6.2% {0ms} StandardWindow(Morph)>>openInWorld
>> 6.2% {0ms} StandardWindow(SystemWindow)>>openInWorld:
>> 3.5% {0ms} StandardWindow(Morph)>>bounds:
>> |3.5% {0ms} StandardWindow(SystemWindow)>>position:
>> | 3.5% {0ms} StandardWindow(Morph)>>position:
>> | 3.5% {0ms} StandardWindow(Morph)>>fullBounds
>> | 3.5% {0ms} StandardWindow(Morph)>>doLayoutIn:
>> | 3.5% {0ms} ProportionalLayout>>layout:in:
>> | 3.5% {0ms}
>> AlignmentMorph(Morph)>>layoutProportionallyIn:
>> | 3.5% {0ms}
>> AlignmentMorph(Morph)>>fullBounds
>> | 3.2% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> | 3.2% {0ms} RowLayout>>layout:in:
>> | 3.0% {0ms} Point>>extent:
>> | 3.0% {0ms} Rectangle
>> class>>origin:extent:
>> | 3.0% {0ms}
>> Rectangle>>setOrigin:corner:
>> 2.7% {0ms} StandardWindow>>openAsIsIn:
>> 2.7% {0ms} StandardWindow(SystemWindow)>>openAsIsIn:
>> 2.7% {0ms} StandardWindow(SystemWindow)>>activate
>> 2.7% {0ms}
>> StandardWindow(SystemWindow)>>navigateFocusForward
>> 2.7% {0ms}
>> StandardWindow(Morph)>>navigateFocusForward
>> 2.7% {0ms}
>> PluggableTextMorph(Morph)>>takeKeyboardFocus
>> 2.7% {0ms} HandMorph>>newKeyboardFocus:
>> 2.7% {0ms}
>> PluggableTextMorph>>keyboardFocusChange:
>> 2.7% {0ms}
>> TextMorphForEditView(Morph)>>takeKeyboardFocus
>> 2.7% {0ms}
>> HandMorph>>newKeyboardFocus:
>> 2.7% {0ms}
>> TextMorphForEditView>>keyboardFocusChange:
>> 2.7% {0ms}
>> SmalltalkEditor(TextEditor)>>focused:
>> 2.7% {0ms}
>> SmalltalkEditingState>>focused:from:
>> 2.7% {0ms}
>> SmalltalkEditingState(EditingState)>>focused:from:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow class>>on:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow>>on:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(StandardWindow)>>model:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(SystemWindow)>>model:
>> 2.7%
>> {0ms} EditorFindReplaceDialogWindow(Morph)>>fillStyle:
>> 2.7%
>> {0ms} EditorFindReplaceDialogWindow(Morph)>>changed
>> 2.7%
>> {0ms} EditorFindReplaceDialogWindow(Morph)>>privateFullBounds
>>
>> 2.7% {0ms} EditorFindReplaceDialogWindow(Morph)>>submorphBounds
>>
>> 2.7% {0ms} AlignmentMorph(Morph)>>fullBounds
>>
>> 2.4% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>>
>> 2.4% {0ms} RowLayout>>layout:in:
>>
>> 2.2% {0ms} Point>>extent:
>>
>> 2.2% {0ms} Rectangle class>>origin:extent:
>>
>> 2.2% {0ms} Rectangle>>setOrigin:corner:
>> 38.3% {1ms} MethodToolbar>>versionMethod
>> 38.3% {1ms} AbstractTool>>browseVersionsFrom:
>> 38.3% {1ms} VersionsBrowser
>> class>>browseVersionsOf:class:meta:category:selector:
>> 38.3% {1ms} VersionsBrowser
>> class>>browseVersionsOf:class:meta:category:selector:lostMethodPointer:
>> 38.3% {1ms} VersionsBrowser class(ChangeList
>> class)>>open:name:multiSelect:
>> 38.3% {1ms} VersionsBrowser class(ChangeList
>> class)>>openAsMorph:name:multiSelect:
>> 38.3% {1ms}
>> VersionsBrowser(ChangeList)>>openAsMorphName:multiSelect:
>> 28.0% {1ms} SystemWindow(Morph)>>openInWorld
>> |28.0% {1ms} SystemWindow>>openInWorld:
>> | 15.1% {0ms} SystemWindow(Morph)>>bounds:
>> | |15.1% {0ms} SystemWindow>>position:
>> | | 15.1% {0ms} SystemWindow(Morph)>>position:
>> | | 15.1% {0ms} SystemWindow(Morph)>>fullBounds
>> | | 15.1% {0ms} SystemWindow(Morph)>>doLayoutIn:
>> | | 14.8% {0ms} ProportionalLayout>>layout:in:
>> | | 14.8% {0ms}
>> AlignmentMorph(Morph)>>layoutProportionallyIn:
>> | | 13.2% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | | |12.9% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> | | | 12.4% {0ms}
>> ProportionalLayout>>layout:in:
>> | | | 12.4% {0ms}
>> PanelMorph(Morph)>>layoutProportionallyIn:
>> | | | 11.9% {0ms}
>> PanelMorph(Morph)>>layoutInBounds:
>> | | | 10.2% {0ms}
>> PanelMorph(Morph)>>bounds:
>> | | | 8.1% {0ms}
>> PanelMorph(Morph)>>position:
>> | | | 6.5% {0ms}
>> PanelMorph(Morph)>>fullBounds
>> | | | 5.7% {0ms}
>> PanelMorph(Morph)>>doLayoutIn:
>> | | | 4.0% {0ms}
>> TableLayout>>layout:in:
>> | | | |3.2% {0ms}
>> TableLayout>>placeCells:in:horizontal:target:
>> | | | | 3.2% {0ms}
>> PluggableTextMorph(Morph)>>layoutInBounds:
>> | | | | 3.2% {0ms}
>> PluggableTextMorph(Morph)>>bounds:
>> | | | | 3.2%
>> {0ms} PluggableTextMorph>>extent:
>> | | | | 1.6%
>> {0ms} TextMorphForEditView(TextMorph)>>extent:
>> | | | | 1.3%
>> {0ms} PluggableTextMorph(ScrollPane)>>extent:
>> | | | 1.6% {0ms}
>> PanelMorph(Morph)>>privateFullBounds
>> | | 1.6% {0ms}
>> AlignmentMorph(Morph)>>layoutInBounds:
>> | | 1.6% {0ms} AlignmentMorph(Morph)>>bounds:
>> | 12.9% {0ms} SystemWindow>>openAsIsIn:
>> | 12.7% {0ms} SystemWindow>>activate
>> | 12.7% {0ms} SystemWindow>>basicActivate
>> | 7.8% {0ms} SystemWindow(Morph)>>changed
>> | |7.8% {0ms} SystemWindow(Morph)>>privateFullBounds
>> | | 7.8% {0ms} SystemWindow(Morph)>>submorphBounds
>> | | 7.8% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | | 7.8% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> | | 7.8% {0ms} ProportionalLayout>>layout:in:
>> | | 7.8% {0ms}
>> PanelMorph(Morph)>>layoutProportionallyIn:
>> | | 7.8% {0ms} PanelMorph(Morph)>>fullBounds
>> | | 7.8% {0ms}
>> PanelMorph(Morph)>>doLayoutIn:
>> | | 7.8% {0ms} TableLayout>>layout:in:
>> | | 6.2% {0ms}
>> TableLayout>>placeCells:in:horizontal:target:
>> | | |6.2% {0ms}
>> DiffMorph(Morph)>>layoutInBounds:
>> | | | 6.2% {0ms}
>> DiffMorph(Morph)>>bounds:
>> | | | 5.7% {0ms}
>> DiffMorph>>extent:
>> | | | 5.7% {0ms}
>> DiffMorph>>calibrateScrollbar
>> | | | 5.7% {0ms}
>> DiffMorph(Morph)>>fullBounds
>> | | | 5.7% {0ms}
>> DiffMorph(Morph)>>doLayoutIn:
>> | | | 5.7%
>> {0ms} ProportionalLayout>>layout:in:
>> | | | 5.7%
>> {0ms} PanelMorph(Morph)>>layoutProportionallyIn:
>> | | | 5.4%
>> {0ms} PanelMorph(Morph)>>layoutInBounds:
>> | | |
>> 4.6% {0ms} PanelMorph(Morph)>>bounds:
>> | | |
>> 3.5% {0ms} PanelMorph(Morph)>>position:
>> | | |
>> 2.7% {0ms} PanelMorph(Morph)>>fullBounds
>> | | |
>> 2.2% {0ms} PanelMorph(Morph)>>doLayoutIn:
>> | | |
>> 1.3% {0ms} PanelMorph(Morph)>>privateFullBounds
>> | | 1.6% {0ms}
>> TableLayout>>computeCellSizes:in:horizontal:
>> | | 1.6% {0ms}
>> DiffMorph(Morph)>>minExtent
>> | | 1.6% {0ms}
>> ProportionalLayout>>minExtentOf:in:
>> | | 1.6% {0ms}
>> PanelMorph(Morph)>>minExtent
>> | | 1.6% {0ms}
>> PanelMorph(Morph)>>layoutBounds
>> | 4.9% {0ms} VersionsBrowser(CodeHolder)>>modelWakeUpIn:
>> | 4.9% {0ms} VersionsBrowser>>updateListsAndCodeIn:
>> | 4.9% {0ms} VersionsBrowser>>reformulateList
>> | 4.9% {0ms} VersionsBrowser>>contentsChanged
>> | 4.9% {0ms} VersionsBrowser>>buildDiffCodePane
>> | 4.9% {0ms}
>> VersionsBrowser>>buildDiffMorphFromOldString:toNewString:contextClass:
>> | 4.6% {0ms} DiffMorph class(Behavior)>>new
>> | 4.6% {0ms} DiffMorph>>initialize
>> | 4.6% {0ms} DiffMorph>>extent:
>> | 4.6% {0ms}
>> DiffMorph>>calibrateScrollbar
>> | 4.6% {0ms}
>> DiffMorph(Morph)>>fullBounds
>> | 4.6% {0ms}
>> DiffMorph(Morph)>>doLayoutIn:
>> | 2.7% {0ms}
>> DiffMorph(Morph)>>privateFullBounds
>> | |2.7% {0ms}
>> DiffMorph(Morph)>>submorphBounds
>> | | 2.7% {0ms}
>> PanelMorph(Morph)>>fullBounds
>> | | 2.2% {0ms}
>> PanelMorph(Morph)>>doLayoutIn:
>> | | 1.3% {0ms}
>> PanelMorph(Morph)>>privateFullBounds
>> | 1.9% {0ms}
>> ProportionalLayout>>layout:in:
>> | 1.9% {0ms}
>> PanelMorph(Morph)>>layoutProportionallyIn:
>> | 1.6% {0ms}
>> PanelMorph(Morph)>>layoutInBounds:
>> 3.8% {0ms} SystemWindow class>>labelled:
>> |3.8% {0ms} SystemWindow class(Behavior)>>new
>> | 3.8% {0ms} SystemWindow>>initialize
>> | 3.5% {0ms} SystemWindow>>extent:
>> | 3.5% {0ms} SystemWindow(Morph)>>extent:
>> | 3.5% {0ms} SystemWindow(Morph)>>changed
>> | 3.5% {0ms} SystemWindow(Morph)>>privateFullBounds
>> | 3.5% {0ms} SystemWindow(Morph)>>submorphBounds
>> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> | 3.2% {0ms} RowLayout>>layout:in:
>> | 3.0% {0ms} Point>>extent:
>> | 3.0% {0ms} Rectangle
>> class>>origin:extent:
>> | 3.0% {0ms} Rectangle>>setOrigin:corner:
>> 3.5% {0ms} SystemWindow>>model:
>> |3.5% {0ms} SystemWindow(Morph)>>fillStyle:
>> | 3.5% {0ms} SystemWindow(Morph)>>changed
>> | 3.5% {0ms} SystemWindow(Morph)>>privateFullBounds
>> | 3.5% {0ms} SystemWindow(Morph)>>submorphBounds
>> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> | 3.2% {0ms} RowLayout>>layout:in:
>> | 3.0% {0ms} Point>>extent:
>> | 3.0% {0ms} Rectangle class>>origin:extent:
>> | 3.0% {0ms} Rectangle>>setOrigin:corner:
>> 1.9% {0ms} VersionsBrowser(CodeHolder)>>addLowerPanesTo:at:with:
>> 1.9% {0ms}
>> VersionsBrowser(CodeHolder)>>addOptionalButtonsTo:at:plus:
>> 17.5% {0ms} ToolRegistry>>openClassBrowser
>> 17.5% {0ms} Nautilus class>>open
>> 17.5% {0ms} Nautilus class>>openInEnvironment:
>> 17.5% {0ms} Nautilus>>open
>> 17.5% {0ms} NautilusUI>>open
>> 17.5% {0ms} NautilusUI(AbstractNautilusUI)>>open
>> 7.3% {0ms} NautilusWindow class(Behavior)>>new
>> |7.3% {0ms} NautilusWindow(StandardWindow)>>initialize
>> | 3.8% {0ms} NautilusWindow(SystemWindow)>>initialize
>> | |3.5% {0ms} NautilusWindow(SystemWindow)>>extent:
>> | | 3.5% {0ms} NautilusWindow(Morph)>>extent:
>> | | 3.5% {0ms} NautilusWindow(Morph)>>changed
>> | | 3.5% {0ms} NautilusWindow(Morph)>>privateFullBounds
>> | | 3.5% {0ms} NautilusWindow(Morph)>>submorphBounds
>> | | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> | | 3.2% {0ms} RowLayout>>layout:in:
>> | | 3.0% {0ms} Point>>extent:
>> | | 3.0% {0ms} Rectangle class>>origin:extent:
>> | | 3.0% {0ms} Rectangle>>setOrigin:corner:
>> | 3.5% {0ms} NautilusWindow(SystemWindow)>>setWindowColor:
>> | 3.5% {0ms} NautilusWindow(SystemWindow)>>setStripeColorsFrom:
>> | 3.5% {0ms} NautilusWindow(Morph)>>fillStyle:
>> | 3.5% {0ms} NautilusWindow(Morph)>>changed
>> | 3.5% {0ms} NautilusWindow(Morph)>>privateFullBounds
>> | 3.5% {0ms} NautilusWindow(Morph)>>submorphBounds
>> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
>> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> | 3.2% {0ms} RowLayout>>layout:in:
>> | 3.0% {0ms} Point>>extent:
>> | 3.0% {0ms} Rectangle class>>origin:extent:
>> | 3.0% {0ms} Rectangle>>setOrigin:corner:
>> 6.7% {0ms} NautilusUI>>addAll:
>> |5.7% {0ms} NautilusUI>>buildColumns:height:
>> | 1.3% {0ms} NautilusUI>>buildNavigationList
>> | 1.3% {0ms} DropListMorph
>> class>>on:list:selected:changeSelected:
>> | 1.3% {0ms} DropListMorph class(Behavior)>>new
>> | 1.3% {0ms} DropListMorph>>initialize
>> 3.5% {0ms} NautilusWindow(Morph)>>openInWorld
>> 3.5% {0ms} NautilusWindow(SystemWindow)>>openInWorld:
>> 3.5% {0ms} NautilusWindow(Morph)>>bounds:
>> 3.5% {0ms} NautilusWindow(SystemWindow)>>position:
>> 3.5% {0ms} NautilusWindow(Morph)>>position:
>> 3.5% {0ms} NautilusWindow(Morph)>>fullBounds
>> 3.5% {0ms} NautilusWindow(Morph)>>doLayoutIn:
>> 3.5% {0ms} ProportionalLayout>>layout:in:
>> 3.5% {0ms}
>> AlignmentMorph(Morph)>>layoutProportionallyIn:
>> 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
>> 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>> 3.2% {0ms} RowLayout>>layout:in:
>> 3.0% {0ms} Point>>extent:
>> 3.0% {0ms} Rectangle class>>origin:extent:
>> 3.0% {0ms} Rectangle>>setOrigin:corner:
>> 3.2% {0ms} WorldState>>doOneCycleNowFor:
>> 3.2% {0ms} HandMorph>>processEvents
>> 3.2% {0ms} HandMorph>>handleEvent:
>> 3.2% {0ms} HandMorph>>sendMouseEvent:
>> 3.2% {0ms} HandMorph>>sendEvent:focus:clear:
>> 3.2% {0ms} PasteUpMorph(Morph)>>processEvent:
>> 3.2% {0ms} PasteUpMorph>>processEvent:using:
>> 3.2% {0ms} PasteUpMorph(Morph)>>processEvent:using:
>> 3.2% {0ms} MorphicEventDispatcher>>dispatchEvent:with:
>> 3.2% {0ms} MorphicEventDispatcher>>dispatchMouseDown:with:
>> 3.2% {0ms} PasteUpMorph(Morph)>>handleEvent:
>> 3.2% {0ms} MouseButtonEvent>>sentTo:
>> 3.2% {0ms} PasteUpMorph(Morph)>>handleMouseDown:
>> 3.2% {0ms} PasteUpMorph>>mouseDown:
>> 3.2% {0ms} PasteUpMorph>>invokeWorldMenu:
>> 3.2% {0ms} MenuMorph>>popUpEvent:in:
>> 3.2% {0ms} MenuMorph>>popUpAt:forHand:in:
>> 3.2% {0ms}
>> MenuMorph>>popUpAt:forHand:in:allowKeyboard:
>> 3.2% {0ms}
>> MenuMorph>>positionAt:relativeTo:inWorld:
>> 3.2% {0ms} MenuMorph(Morph)>>fullBounds
>> 3.2% {0ms} MenuMorph(Morph)>>doLayoutIn:
>> 3.2% {0ms} TableLayout>>layout:in:
>> 3.2% {0ms}
>> TableLayout>>layoutTopToBottom:in:
>> 2.4% {0ms}
>> AlignmentMorph(Morph)>>layoutInBounds:
>> 1.6% {0ms}
>> AlignmentMorph(Morph)>>bounds:
>> 1.6% {0ms}
>> AlignmentMorph(Morph)>>position:
>> 1.6% {0ms}
>> AlignmentMorph(Morph)>>fullBounds
>> 1.3% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> 2.7% {0ms} NautilusWindow(SystemWindow)>>closeBoxHit
>> 2.7% {0ms} NautilusWindow>>delete
>> 2.7% {0ms} NautilusWindow(StandardWindow)>>delete
>> 2.7% {0ms} NautilusWindow(SystemWindow)>>delete
>> 2.7% {0ms} SystemWindow class>>noteTopWindowIn:
>> 2.7% {0ms} SystemWindow>>activate
>> 2.7% {0ms} SystemWindow>>navigateFocusForward
>> 2.7% {0ms} SystemWindow(Morph)>>navigateFocusForward
>> 2.7% {0ms} PluggableTextMorph(Morph)>>takeKeyboardFocus
>> 2.7% {0ms} HandMorph>>newKeyboardFocus:
>> 2.7% {0ms} PluggableTextMorph>>keyboardFocusChange:
>> 2.7% {0ms} TextMorphForEditView(Morph)>>takeKeyboardFocus
>> 2.7% {0ms} HandMorph>>newKeyboardFocus:
>> 2.7% {0ms} TextMorphForEditView>>keyboardFocusChange:
>> 2.7% {0ms} SmalltalkEditor(TextEditor)>>focused:
>> 2.7% {0ms} SmalltalkEditingState>>focused:from:
>> 2.7% {0ms}
>> SmalltalkEditingState(EditingState)>>focused:from:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow class>>on:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow>>on:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(StandardWindow)>>model:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(SystemWindow)>>model:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(Morph)>>fillStyle:
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(Morph)>>changed
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(Morph)>>privateFullBounds
>> 2.7% {0ms}
>> EditorFindReplaceDialogWindow(Morph)>>submorphBounds
>> 2.7% {0ms}
>> AlignmentMorph(Morph)>>fullBounds
>> 2.4% {0ms}
>> AlignmentMorph(Morph)>>doLayoutIn:
>> 2.4% {0ms}
>> RowLayout>>layout:in:
>> 2.2% {0ms}
>> Point>>extent:
>> 2.2% {0ms}
>> Rectangle class>>origin:extent:
>> 2.2% {0ms}
>> Rectangle>>setOrigin:corner:
>>
>> **Leaves**
>> 100.0% {2ms} Rectangle>>setOrigin:corner:
>>
>> **Memory**
>> old +0 bytes
>> young +4,588 bytes
>> used +4,588 bytes
>> free -4,588 bytes
>>
>> **GCs**
>> full 0 totalling 0ms (0.0% uptime)
>> incr 0 totalling 0ms (0.0% uptime)
>> tenures 0
>> root table 0 overflows
>>
>> My feeling is that you are not thru with degenerated rectangles :)
>> You'd better enforce the invariant in
>> http://code.google.com/p/pharo/issues/detail?id=2601
>> rathert than remove it as requested in
>> http://code.google.com/p/pharo/issues/detail?id=2441
>>
>> Nicolas
>>
>> 2013/2/13 Nicolas Cellier <nicolas.cellier.aka.nice(a)gmail.com>:
>>> I tried to put a halt in Rectangle>>setOrigin: topLeft corner: bottomRight
>>> in latest Pharo (20543) if width < 0 or height < 0 and of course the
>>> image hung...
>>> which means that degenerated Rectangles are pretty much in use
>>>
>>> I think I will juts raise a Notification, and catch it with a
>>> MessageTally hack to track the senders
>>> (as documented at
>>> http://bugs.squeak.org/bug_view_advanced_page.php?bug_id=6755 )
>>>
>>> Nicolas
>>>
>>> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>>>> yes.. and i'd like to add that in some places i replaced senders of
>>>>
>>>> rect1 intersect: rect2
>>>>
>>>> with:
>>>>
>>>> rect1 intersect: rect2 ifNone: [ self error: 'should not happen'].
>>>>
>>>> as it appears, it happens in some places... because of the above inconsistency.
>>>>
>>>>
>>>> --
>>>> Best regards,
>>>> Igor Stasenko.
>>>>
>>
>
>
Feb. 14, 2013
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by Goubier Thierry
Le 13/02/2013 22:32, Igor Stasenko a écrit :
>
> now, since i was on a crusade to replace all senders of #intersect:
> with #intersect:ifNone: (for a good reason ;)
> this inconsistency strikes us back..
Oh, then I know who I have to send a bug report to with
intersect:ifNone:... It's breaking the Announcer spy GUI.
Thierry
--
Thierry Goubier
CEA list
Laboratoire des Fondations des Systèmes Temps Réel Embarqués
91191 Gif sur Yvette Cedex
France
Phone/Fax: +33 (0) 1 69 08 32 92 / 83 95
Feb. 14, 2013
[Pharo-project] [update 2.0] #20544
by Marcus Denker
20544
-----
Issue 7291: Monticello asks for credentials when none are required
http://code.google.com/p/pharo/issues/detail?id=7291
Issue 7503: MC Browser System Category Order Changes
http://code.google.com/p/pharo/issues/detail?id=7503
Issue 7014: downloadSources without Zinc
http://code.google.com/p/pharo/issues/detail?id=7014
Diff information:
http://ss3.gemstone.com/ss/Pharo20/Zinc-System-Support-MarcusDenker.2.diff
http://ss3.gemstone.com/ss/Pharo20/System-Support-MarcusDenker.786.diff
http://ss3.gemstone.com/ss/Pharo20/Monticello-MarcusDenker.767.diff
Feb. 14, 2013
Re: [Pharo-project] [Vm-dev] Fwd: A question about lookup and message reification
by stephane ducasse
>
> So just run an image with the simulator and stop at any of commonSend, internalFindNewMethod, lookupMethodInClass: and you'll see the call chain form the relevant send bytecode.
>
> Here's an expression that loads and runs an image with the StackInterpreter:
cool I will see if I can show that during my lecture.
>
> | vm |
> StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
> vm := StackInterpreterSimulator new.
> vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
> vm openAsMorph; run
>
> and if you break on entry to internalFindNewMethod you'll see this stack:
>
> StackInterpreterSimulatorLSB(Object)>>break
> StackInterpreterSimulatorLSB(StackInterpreter)>>internalFindNewMethod
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>internalFindNewMethod
> StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
> UndefinedObject>>DoIt
>
> If you find out what the selector is (e.g. self printOop: messageSelector) you can then use the simulator;s own breakpoint facilities:
>
> | vm |
> StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
> vm := StackInterpreterSimulator new.
> vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
> vm setBreakSelector: #&.
> vm openAsMorph; run
>
> and now it'll stop in sendBreak:point:receiver: and you'll get this stack:
>
> StackInterpreterSimulatorLSB(Object)>>halt:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>sendBreak:point:receiver:
> StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
> UndefinedObject>>DoIt
>>> - what is the invariant?
>>> that currentclass always point to the currently looked up class and
>>> newMethod is the found method?
>>
>>
>> The input arguments are messageSelector, argumentCount and its argument, class. The VM suffers somewhat from being cluttered with global variables, which is I think a legacy of the blue-book specification (the Smalltalk code that was used to implement Interpreter in VMMaker) being derived from the Alto and Dorado implementations in microcode. It would be nicer if there were fewer variables, but e.g. supplying argumentCount as a parameter throughout all the message handling routines can be difficult, especially when things like perform: and MNU change the argumentCount during message send.
>
> I clearly see what you mean.
>
>>> - why lookupMethodFor: selector InDictionary: dictionary is defined in StackInterpreter but never used
>>> only in CoInterpreter?
>>
>>
>> Well, it belongs in StackInterpreter and could be used in the other lookup methods. I was probably considering rewriting the other lookup routines to use lookupMethodFor: InDictionary: but didn't get round to it.
>
> ok I see.
>
> While reading directly the see code I was wondering why you generate the ifdef for different bytecode set?
> Is it that you would have to call another object and that it would not have the same instance variables.
> Because I was thinking that such variation points could be handled by the different interpreter subclasses.
>
> Bytecode dispatch is performance-critical in the context and stack interpreters. The ifdef means that if one is not using multiple bytecode sets dispatch is simpler and hence faster.
>
> Subclassing is very difficult because the simulators are not traits and so subclass each interpreter class. hence adding a subclass to handle this difference means adding another simulator, and they're big and tedious to maintain. IMO the multiple bytecode set work just isn't worth that kind of load. The VM would be nicer if more fully decomposed. I've done a fair amount (moving the objectMemory into an instance variable, putting the Cogit in its own class hierarchy, adding support for struct classes that define data types like a stack page or an abstract instruction or machine-code method in the JIT) but there's always more that one can do.
>
> cheers!
>>> Thanks
>>>
>>>
>>> lookupMethodInClass: class
>>> | currentClass dictionary found |
>>> <inline: false>
>>> self assert: class ~= objectMemory nilObject.
>>> currentClass := class.
>>> [currentClass ~= objectMemory nilObject]
>>> whileTrue:
>>> [dictionary := objectMemory fetchPointer: MethodDictionaryIndex ofObject: currentClass.
>>>
>>> *** trick with the cannotInterpret ***
>>> dictionary = objectMemory nilObject ifTrue:
>>> ["MethodDict pointer is nil (hopefully due a swapped out stub)
>>> -- raise exception #cannotInterpret:."
>>> self createActualMessageTo: class.
>>> messageSelector := objectMemory splObj: SelectorCannotInterpret.
>>> self sendBreak: messageSelector + BaseHeaderSize
>>> point: (objectMemory lengthOf: messageSelector)
>>> receiver: nil.
>>> ^self lookupMethodInClass: (self superclassOf: currentClass)].
>>> *** trick with the cannotInterpret end ***
>>>
>>> found := self lookupMethodInDictionary: dictionary.
>>> found ifTrue: [^currentClass].
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^
>>>
>>> currentClass := self superclassOf: currentClass].
>>>
>>> "Could not find #doesNotUnderstand: -- unrecoverable error."
>>> messageSelector = (objectMemory splObj: SelectorDoesNotUnderstand) ifTrue:
>>> [self error: 'Recursive not understood error encountered'].
>>>
>>> "Cound not find a normal message -- raise exception #doesNotUnderstand:"
>>> self createActualMessageTo: class.
>>> messageSelector := objectMemory splObj: SelectorDoesNotUnderstand.
>>> self sendBreak: messageSelector + BaseHeaderSize
>>> point: (objectMemory lengthOf: messageSelector)
>>> receiver: nil.
>>> ^self lookupMethodInClass: class
>>>
>>>
>>> if (found) {
>>> return currentClass;
>>> }
>>>
>>>
>>> static sqInt
>>> lookupMethodInClass(sqInt class)
>>> {
>>> // StackInterpreter>>#lookupMethodInClass: DECL_MAYBE_SQ_GLOBAL_STRUCT
>>> sqInt currentClass;
>>> sqInt dictionary;
>>> sqInt found;
>>> sqInt header;
>>> sqInt index;
>>> sqInt length;
>>> sqInt mask;
>>> sqInt methodArray;
>>> sqInt nextSelector;
>>> sqInt sz;
>>> sqInt wrapAround;
>>>
>>> assert(class != (nilObject()));
>>> currentClass = class;
>>> while (currentClass != GIV(nilObj)) {
>>> dictionary = longAt((currentClass + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord));
>>> if (dictionary == GIV(nilObj)) {
>>>
>>> /* ifTrue: */
>>>
>>> createActualMessageTo(class);
>>> GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorCannotInterpret << ShiftForWord));
>>> sendBreakpointreceiver(GIV(messageSelector) + BaseHeaderSize, lengthOf(GIV(messageSelector)), null);
>>> return lookupMethodInClass(longAt((currentClass + BaseHeaderSize) + (SuperclassIndex << ShiftForWord)));
>>> }
>>> /* begin lookupMethodInDictionary: */
>>> /* begin fetchWordLengthOf: */
>>> /* begin sizeBitsOf: */
>>> header = longAt(dictionary);
>>> sz = ((header & TypeMask) == HeaderTypeSizeAndClass
>>> ? (longAt(dictionary - (BytesPerWord * 2))) & LongSizeMask
>>> : header & SizeMask);
>>> length = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
>>> mask = (length - SelectorStart) - 1;
>>>
>>> /* messageSelector */
>>>
>>> index = SelectorStart + (mask & (((GIV(messageSelector) & 1)
>>> ? (GIV(messageSelector) >> 1)
>>> : (((usqInt) (longAt(GIV(messageSelector)))) >> HashBitsOffset) & HashMaskUnshifted)));
>>> wrapAround = 0;
>>> while (1) {
>>> nextSelector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
>>> if (nextSelector == GIV(nilObj)) {
>>> found = 0;
>>> goto l1;
>>> }
>>> if (nextSelector == GIV(messageSelector)) {
>>> methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex << ShiftForWord));
>>> GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
>>> found = 1;
>>> goto l1;
>>> }
>>> index += 1;
>>> if (index == length) {
>>> if (wrapAround) {
>>> found = 0;
>>> goto l1;
>>> }
>>> wrapAround = 1;
>>> index = SelectorStart;
>>> }
>>> }
>>> found = 0;
>>> l1: /* end lookupMethodInDictionary: */;
>>> if (found) {
>>> return currentClass;
>>> }
>>> currentClass = longAt((currentClass + BaseHeaderSize) + (SuperclassIndex << ShiftForWord));
>>> }
>>> if (GIV(messageSelector) == (longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorDoesNotUnderstand << ShiftForWord)))) {
>>> error("Recursive not understood error encountered");
>>> }
>>> createActualMessageTo(class);
>>> GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorDoesNotUnderstand << ShiftForWord));
>>> sendBreakpointreceiver(GIV(messageSelector) + BaseHeaderSize, lengthOf(GIV(messageSelector)), null);
>>> return lookupMethodInClass(class);
>>> }
>>>
>>>
>>>
>>>
>>
>>
>>
>>
>> --
>> best,
>> Eliot
>
>
>
>
> --
> best,
> Eliot
Feb. 14, 2013
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by stephane ducasse
Nicolas
I did what you suggest
> Notification subclass: #DegeneratedRectangle
> instanceVariableNames: ''
> classVariableNames: ''
> poolDictionaries: ''
> category: 'Kernel-BasicObjects'
>
> Rectangle>>setOrigin: topLeft corner: bottomRight
> origin := topLeft.
> corner := bottomRight.
> (self width < 0 or: [ self height < 0 ]) ifTrue: [
> DegeneratedRectangle signal ]
>
> Then in a workspace:
>
> tally := MessageTally new.
> tally spyEvery: 100 on: ['em ezilaitini ot si siht' reverse].
> tally class: World class method: World class>>#doOneCycle.
> "middle lines begin"
> tallyEnd := false.
> [(Delay forSeconds: 300) wait. tallyEnd := true] fork.
> [[World doOneCycle. Processor yield.tallyEnd] whileFalse]
> on: DegeneratedRectangle
> do: [:exc | tally tally: exc signalerContext by: 1.
> exc resume].
> (StringHolder new contents:
> (String streamContents: [:s | tally report: s]))
> openLabel: 'DegeneratedRectangle Spy Results'.
> "middle lines end"
> tally close.
>
But I get nothing 20531
Then I do not understand the trace you sent where is the information about the wrong rectangle in it.
> and here we go:
>
> - 371 tallies, 2 msec.
>
> **Tree**
> --------------------------------
> Process: other processes
> --------------------------------
> 38.3% {1ms} NautilusUI(AbstractNautilusUI)>>browseMessages
> 38.3% {1ms} NautilusUI(AbstractTool)>>browseMessagesFrom:
> 38.3% {1ms}
> NautilusUI(AbstractTool)>>getSelectorAndSendQuery:to:with:selector:
> 38.3% {1ms} SystemNavigation>>browseAllImplementorsOf:
> 38.3% {1ms} SystemNavigation>>browseImplementorsOf:name:autoSelect:
> 38.3% {1ms} SystemNavigation>>browseMessageList:name:autoSelect:
> 38.3% {1ms} MessageBrowser class>>openMessageList:name:autoSelect:
> 38.3% {1ms} MessageBrowser>>openWithSpec
> 38.3% {1ms} MessageBrowser(ComposableModel)>>openWithSpec
> 38.3% {1ms} MessageBrowser(ComposableModel)>>openWithSpec:
> 38.3% {1ms} WindowModel>>openWithSpec:
> 32.1% {1ms} WindowModel>>buildWithSpec:
> |24.8% {0ms} WindowModel>>addModelIn:withSpec:
> | |22.9% {0ms}
> MessageBrowser(ComposableModel)>>buildWithSpec:
> | | |19.4% {0ms} SpecInterpreter
> class>>buildWidgetFor:withSpec:
> | | | |19.4% {0ms} SpecInterpreter
> class>>interpretASpec:model:
> | | | | 19.4% {0ms} SpecInterpreter
> class>>interpretASpec:model:superSpec:
> | | | | 19.4% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | | 19.4% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | 19.4% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | 19.4% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | 19.4% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | 19.4% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | 19.4% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | | 9.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | |9.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | 9.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | | 9.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | | 9.7%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | 9.7%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | | | 9.7%
> {0ms} SpecInterpreter>>retreiveSpecFrom:
> | | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | | |
> |4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | | | |
> 4.9% {0ms} MultiColumnListModel(ComposableModel)>>private_buildWithSpec
> | | | | | |
> 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
> | | | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | | | |
> 4.9% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | | | |
> 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | | | |
> |2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> | 2.7% {0ms} SpecInterpreter>>interpretASpec:
> | | | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec
> | | | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec:
> | | | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>instance
> | | | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>initializeInstance
> | | | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | | | |
> | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | | |
> | |1.3% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> | | 1.3% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | | | |
> | | 1.3%
> {0ms} DropListMorph class(Behavior)>>new
> | | | | | |
> | | 1.3%
> {0ms} DropListMorph>>initialize
> | | | | | |
> | 1.3% {0ms}
> RawSpec>>defaultReceiver:model:
> | | | | | |
> | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | | | |
> | 1.3% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | | |
> | 1.3% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | | | |
> | 1.3%
> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | | | |
> | 1.3%
> {0ms} DropListMorph class(Behavior)>>new
> | | | | | |
> |
> 1.3% {0ms} DropListMorph>>initialize
> | | | | | |
> 2.2% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>instance
> | | | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>initializeInstance
> | | | | | |
> 2.2% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | | |
> 2.2% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | | |
> 4.9% {0ms} RawSpec>>defaultReceiver:model:
> | | | | |
> 4.9% {0ms} SpecInterpreter class>>private_interpretASpec:model:
> | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | | |
> 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
> | | | | |
> 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
> | | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | | |
> 4.9% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | | |
> 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | | |
> |2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> | 2.7% {0ms} SpecInterpreter>>interpretASpec:
> | | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec
> | | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec:
> | | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>instance
> | | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>initializeInstance
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | |
> | 2.7% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | | |
> | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | |
> | |1.3% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | | |
> | | 1.3%
> {0ms} DropListMorph class(Behavior)>>new
> | | | | |
> | |
> 1.3% {0ms} DropListMorph>>initialize
> | | | | |
> | 1.3% {0ms}
> RawSpec>>defaultReceiver:model:
> | | | | |
> | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:
> | | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | | |
> |
> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | | |
> |
> 1.3% {0ms} DropListMorph class(Behavior)>>new
> | | | | |
> |
> 1.3% {0ms} DropListMorph>>initialize
> | | | | |
> 2.2% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>instance
> | | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>initializeInstance
> | | | | |
> 2.2% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | |
> 2.2% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | | 9.7% {0ms}
> RawSpec>>defaultReceiver:model:
> | | | | 9.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | | 9.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | | 9.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | 9.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | | 9.7%
> {0ms} SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | | 9.7%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | | 9.7%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> 9.7% {0ms} SpecInterpreter>>retreiveSpecFrom:
> | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | |
> |4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
> | | | |
> | 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
> | | | |
> | 4.9% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | |
> | 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> | 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | |
> | 4.9% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | |
> | |2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | 2.7% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec
> | | | |
> | | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec:
> | | | |
> | | 2.7% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | |
> | | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | |
> | | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>instance
> | | | |
> | | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>initializeInstance
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | | 2.7% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | |
> | | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | |
> | | |1.3% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | | | 1.3%
> {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | |
> | | | 1.3%
> {0ms} DropListMorph class(Behavior)>>new
> | | | |
> | | |
> 1.3% {0ms} DropListMorph>>initialize
> | | | |
> | | 1.3% {0ms}
> RawSpec>>defaultReceiver:model:
> | | | |
> | | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:
> | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | |
> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | |
> | |
> 1.3% {0ms} DropListMorph class(Behavior)>>new
> | | | |
> | |
> 1.3% {0ms} DropListMorph>>initialize
> | | | |
> | 2.2% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | |
> | 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>instance
> | | | |
> | 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>initializeInstance
> | | | |
> | 2.2% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> | 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> | 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 2.2% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | 2.2% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | |
> 4.9% {0ms} RawSpec>>defaultReceiver:model:
> | | | |
> 4.9% {0ms} SpecInterpreter class>>private_interpretASpec:model:
> | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec
> | | | |
> 4.9% {0ms}
> MultiColumnListModel(ComposableModel)>>private_buildWithSpec:
> | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | |
> 4.9% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:model:
> | | | |
> 4.9% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> 4.9% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:superSpec:
> | | | |
> |2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec
> | | | |
> | 2.7% {0ms}
> DropListModel(ComposableModel)>>private_buildWithSpec:
> | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | | | |
> | 2.7% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>instance
> | | | |
> | 2.7% {0ms}
> DropListSpec(AbstractSpec)>>initializeInstance
> | | | |
> | 2.7% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> | 2.7% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | | |
> | 1.3% {0ms}
> SpecInterpreter class>>private_interpretASpec:model:superSpec:
> | | | |
> | |1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> | | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> | |
> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | |
> | |
> 1.3% {0ms} DropListMorph class(Behavior)>>new
> | | | |
> | |
> 1.3% {0ms} DropListMorph>>initialize
> | | | |
> | 1.3% {0ms}
> RawSpec>>defaultReceiver:model:
> | | | |
> | 1.3%
> {0ms} SpecInterpreter class>>private_interpretASpec:model:
> | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:
> | | | |
> | 1.3%
> {0ms} SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> |
> 1.3% {0ms} SpecInterpreter>>interpretASpec:
> | | | |
> |
> 1.3% {0ms} SpecInterpreter>>convertSymbolOfClassToInstance:
> | | | |
> |
> 1.3% {0ms} DropListMorph class(Behavior)>>new
> | | | |
> |
> 1.3% {0ms} DropListMorph>>initialize
> | | | |
> 2.2% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>instance
> | | | |
> 2.2% {0ms}
> MultiColumnListSpec(AbstractSpec)>>initializeInstance
> | | | |
> 2.2% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:
> | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | | | |
> 2.2% {0ms}
> SpecInterpreter>>interpretASpec:
> | | | |
> 2.2% {0ms}
> SpecInterpreter>>retreiveSpecFrom:
> | | |3.5% {0ms}
> MessageBrowser(ComposableModel)>>ensureExtentFor:
> | | | 3.5% {0ms} PanelMorph(Morph)>>extent:
> | | | 3.5% {0ms} PanelMorph(Morph)>>changed
> | | | 3.5% {0ms}
> PanelMorph(Morph)>>privateFullBounds
> | | | 3.5% {0ms}
> PanelMorph(Morph)>>submorphBounds
> | | | 3.5% {0ms}
> PanelMorph(Morph)>>fullBounds
> | | | 3.5% {0ms}
> PanelMorph(Morph)>>doLayoutIn:
> | | | 3.5% {0ms}
> ProportionalLayout>>layout:in:
> | | | 3.5% {0ms}
> PluggableTextMorph(Morph)>>layoutProportionallyIn:
> | | | 3.2% {0ms}
> PluggableTextMorph(Morph)>>layoutInBounds:
> | | | 2.7% {0ms}
> PluggableTextMorph(Morph)>>bounds:
> | | | 1.6% {0ms}
> PluggableTextMorph>>extent:
> | |1.9% {0ms}
> StandardWindow(SystemWindow)>>addMorph:frame:
> | | 1.9% {0ms}
> StandardWindow(SystemWindow)>>addMorph:fullFrame:
> | | 1.9% {0ms} PanelMorph>>adoptPaneColor:
> | | 1.9% {0ms} PanelMorph(Morph)>>color:
> | | 1.9% {0ms} PanelMorph(Morph)>>changed
> | | 1.9% {0ms}
> PanelMorph(Morph)>>privateFullBounds
> | | 1.9% {0ms}
> PanelMorph(Morph)>>submorphBounds
> | | 1.9% {0ms}
> PanelMorph(Morph)>>fullBounds
> | | 1.9% {0ms}
> PanelMorph(Morph)>>doLayoutIn:
> | | 1.9% {0ms}
> ProportionalLayout>>layout:in:
> | | 1.9% {0ms}
> PluggableTextMorph(Morph)>>layoutProportionallyIn:
> | | 1.6% {0ms}
> PluggableTextMorph(Morph)>>layoutInBounds:
> |7.3% {0ms} SpecInterpreter
> class>>private_buildWidgetFor:withSpec:
> | 7.3% {0ms} SpecInterpreter
> class>>private_interpretASpec:model:
> | 7.3% {0ms} SpecInterpreter>>interpretASpec:model:
> | 7.3% {0ms}
> SpecInterpreter>>interpretASpec:model:superSpec:
> | 7.3% {0ms} SpecInterpreter>>interpretASpec:
> | 7.3% {0ms}
> SpecInterpreter>>actionToPerformWithSelector:arguments:
> | 7.3% {0ms}
> WindowSpec(AbstractSpec)>>instance
> | 7.3% {0ms} WindowSpec>>initializeInstance
> | 7.3% {0ms} StandardWindow
> class(Behavior)>>new
> | 7.3% {0ms} StandardWindow>>initialize
> | 3.8% {0ms}
> StandardWindow(SystemWindow)>>initialize
> | |3.5% {0ms}
> StandardWindow(SystemWindow)>>extent:
> | | 3.5% {0ms}
> StandardWindow(Morph)>>extent:
> | | 3.5% {0ms}
> StandardWindow(Morph)>>changed
> | | 3.5% {0ms}
> StandardWindow(Morph)>>privateFullBounds
> | | 3.5% {0ms}
> StandardWindow(Morph)>>submorphBounds
> | | 3.5% {0ms}
> AlignmentMorph(Morph)>>fullBounds
> | | 3.2% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> | | 3.2%
> {0ms} RowLayout>>layout:in:
> | | 3.0%
> {0ms} Point>>extent:
> | | 3.0%
> {0ms} Rectangle class>>origin:extent:
> | |
> 3.0% {0ms} Rectangle>>setOrigin:corner:
> | 3.5% {0ms}
> StandardWindow(SystemWindow)>>setWindowColor:
> | 3.5% {0ms}
> StandardWindow(SystemWindow)>>setStripeColorsFrom:
> | 3.5% {0ms}
> StandardWindow(Morph)>>fillStyle:
> | 3.5% {0ms}
> StandardWindow(Morph)>>changed
> | 3.5% {0ms}
> StandardWindow(Morph)>>privateFullBounds
> | 3.5% {0ms}
> StandardWindow(Morph)>>submorphBounds
> | 3.5% {0ms}
> AlignmentMorph(Morph)>>fullBounds
> | 3.2% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> | 3.2%
> {0ms} RowLayout>>layout:in:
> | 3.0%
> {0ms} Point>>extent:
> | 3.0%
> {0ms} Rectangle class>>origin:extent:
> |
> 3.0% {0ms} Rectangle>>setOrigin:corner:
> 6.2% {0ms} StandardWindow(Morph)>>openInWorld
> 6.2% {0ms} StandardWindow(SystemWindow)>>openInWorld:
> 3.5% {0ms} StandardWindow(Morph)>>bounds:
> |3.5% {0ms} StandardWindow(SystemWindow)>>position:
> | 3.5% {0ms} StandardWindow(Morph)>>position:
> | 3.5% {0ms} StandardWindow(Morph)>>fullBounds
> | 3.5% {0ms} StandardWindow(Morph)>>doLayoutIn:
> | 3.5% {0ms} ProportionalLayout>>layout:in:
> | 3.5% {0ms}
> AlignmentMorph(Morph)>>layoutProportionallyIn:
> | 3.5% {0ms}
> AlignmentMorph(Morph)>>fullBounds
> | 3.2% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> | 3.2% {0ms} RowLayout>>layout:in:
> | 3.0% {0ms} Point>>extent:
> | 3.0% {0ms} Rectangle
> class>>origin:extent:
> | 3.0% {0ms}
> Rectangle>>setOrigin:corner:
> 2.7% {0ms} StandardWindow>>openAsIsIn:
> 2.7% {0ms} StandardWindow(SystemWindow)>>openAsIsIn:
> 2.7% {0ms} StandardWindow(SystemWindow)>>activate
> 2.7% {0ms}
> StandardWindow(SystemWindow)>>navigateFocusForward
> 2.7% {0ms}
> StandardWindow(Morph)>>navigateFocusForward
> 2.7% {0ms}
> PluggableTextMorph(Morph)>>takeKeyboardFocus
> 2.7% {0ms} HandMorph>>newKeyboardFocus:
> 2.7% {0ms}
> PluggableTextMorph>>keyboardFocusChange:
> 2.7% {0ms}
> TextMorphForEditView(Morph)>>takeKeyboardFocus
> 2.7% {0ms}
> HandMorph>>newKeyboardFocus:
> 2.7% {0ms}
> TextMorphForEditView>>keyboardFocusChange:
> 2.7% {0ms}
> SmalltalkEditor(TextEditor)>>focused:
> 2.7% {0ms}
> SmalltalkEditingState>>focused:from:
> 2.7% {0ms}
> SmalltalkEditingState(EditingState)>>focused:from:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow class>>on:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow>>on:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(StandardWindow)>>model:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(SystemWindow)>>model:
> 2.7%
> {0ms} EditorFindReplaceDialogWindow(Morph)>>fillStyle:
> 2.7%
> {0ms} EditorFindReplaceDialogWindow(Morph)>>changed
> 2.7%
> {0ms} EditorFindReplaceDialogWindow(Morph)>>privateFullBounds
>
> 2.7% {0ms} EditorFindReplaceDialogWindow(Morph)>>submorphBounds
>
> 2.7% {0ms} AlignmentMorph(Morph)>>fullBounds
>
> 2.4% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
>
> 2.4% {0ms} RowLayout>>layout:in:
>
> 2.2% {0ms} Point>>extent:
>
> 2.2% {0ms} Rectangle class>>origin:extent:
>
> 2.2% {0ms} Rectangle>>setOrigin:corner:
> 38.3% {1ms} MethodToolbar>>versionMethod
> 38.3% {1ms} AbstractTool>>browseVersionsFrom:
> 38.3% {1ms} VersionsBrowser
> class>>browseVersionsOf:class:meta:category:selector:
> 38.3% {1ms} VersionsBrowser
> class>>browseVersionsOf:class:meta:category:selector:lostMethodPointer:
> 38.3% {1ms} VersionsBrowser class(ChangeList
> class)>>open:name:multiSelect:
> 38.3% {1ms} VersionsBrowser class(ChangeList
> class)>>openAsMorph:name:multiSelect:
> 38.3% {1ms}
> VersionsBrowser(ChangeList)>>openAsMorphName:multiSelect:
> 28.0% {1ms} SystemWindow(Morph)>>openInWorld
> |28.0% {1ms} SystemWindow>>openInWorld:
> | 15.1% {0ms} SystemWindow(Morph)>>bounds:
> | |15.1% {0ms} SystemWindow>>position:
> | | 15.1% {0ms} SystemWindow(Morph)>>position:
> | | 15.1% {0ms} SystemWindow(Morph)>>fullBounds
> | | 15.1% {0ms} SystemWindow(Morph)>>doLayoutIn:
> | | 14.8% {0ms} ProportionalLayout>>layout:in:
> | | 14.8% {0ms}
> AlignmentMorph(Morph)>>layoutProportionallyIn:
> | | 13.2% {0ms} AlignmentMorph(Morph)>>fullBounds
> | | |12.9% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> | | | 12.4% {0ms}
> ProportionalLayout>>layout:in:
> | | | 12.4% {0ms}
> PanelMorph(Morph)>>layoutProportionallyIn:
> | | | 11.9% {0ms}
> PanelMorph(Morph)>>layoutInBounds:
> | | | 10.2% {0ms}
> PanelMorph(Morph)>>bounds:
> | | | 8.1% {0ms}
> PanelMorph(Morph)>>position:
> | | | 6.5% {0ms}
> PanelMorph(Morph)>>fullBounds
> | | | 5.7% {0ms}
> PanelMorph(Morph)>>doLayoutIn:
> | | | 4.0% {0ms}
> TableLayout>>layout:in:
> | | | |3.2% {0ms}
> TableLayout>>placeCells:in:horizontal:target:
> | | | | 3.2% {0ms}
> PluggableTextMorph(Morph)>>layoutInBounds:
> | | | | 3.2% {0ms}
> PluggableTextMorph(Morph)>>bounds:
> | | | | 3.2%
> {0ms} PluggableTextMorph>>extent:
> | | | | 1.6%
> {0ms} TextMorphForEditView(TextMorph)>>extent:
> | | | | 1.3%
> {0ms} PluggableTextMorph(ScrollPane)>>extent:
> | | | 1.6% {0ms}
> PanelMorph(Morph)>>privateFullBounds
> | | 1.6% {0ms}
> AlignmentMorph(Morph)>>layoutInBounds:
> | | 1.6% {0ms} AlignmentMorph(Morph)>>bounds:
> | 12.9% {0ms} SystemWindow>>openAsIsIn:
> | 12.7% {0ms} SystemWindow>>activate
> | 12.7% {0ms} SystemWindow>>basicActivate
> | 7.8% {0ms} SystemWindow(Morph)>>changed
> | |7.8% {0ms} SystemWindow(Morph)>>privateFullBounds
> | | 7.8% {0ms} SystemWindow(Morph)>>submorphBounds
> | | 7.8% {0ms} AlignmentMorph(Morph)>>fullBounds
> | | 7.8% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> | | 7.8% {0ms} ProportionalLayout>>layout:in:
> | | 7.8% {0ms}
> PanelMorph(Morph)>>layoutProportionallyIn:
> | | 7.8% {0ms} PanelMorph(Morph)>>fullBounds
> | | 7.8% {0ms}
> PanelMorph(Morph)>>doLayoutIn:
> | | 7.8% {0ms} TableLayout>>layout:in:
> | | 6.2% {0ms}
> TableLayout>>placeCells:in:horizontal:target:
> | | |6.2% {0ms}
> DiffMorph(Morph)>>layoutInBounds:
> | | | 6.2% {0ms}
> DiffMorph(Morph)>>bounds:
> | | | 5.7% {0ms}
> DiffMorph>>extent:
> | | | 5.7% {0ms}
> DiffMorph>>calibrateScrollbar
> | | | 5.7% {0ms}
> DiffMorph(Morph)>>fullBounds
> | | | 5.7% {0ms}
> DiffMorph(Morph)>>doLayoutIn:
> | | | 5.7%
> {0ms} ProportionalLayout>>layout:in:
> | | | 5.7%
> {0ms} PanelMorph(Morph)>>layoutProportionallyIn:
> | | | 5.4%
> {0ms} PanelMorph(Morph)>>layoutInBounds:
> | | |
> 4.6% {0ms} PanelMorph(Morph)>>bounds:
> | | |
> 3.5% {0ms} PanelMorph(Morph)>>position:
> | | |
> 2.7% {0ms} PanelMorph(Morph)>>fullBounds
> | | |
> 2.2% {0ms} PanelMorph(Morph)>>doLayoutIn:
> | | |
> 1.3% {0ms} PanelMorph(Morph)>>privateFullBounds
> | | 1.6% {0ms}
> TableLayout>>computeCellSizes:in:horizontal:
> | | 1.6% {0ms}
> DiffMorph(Morph)>>minExtent
> | | 1.6% {0ms}
> ProportionalLayout>>minExtentOf:in:
> | | 1.6% {0ms}
> PanelMorph(Morph)>>minExtent
> | | 1.6% {0ms}
> PanelMorph(Morph)>>layoutBounds
> | 4.9% {0ms} VersionsBrowser(CodeHolder)>>modelWakeUpIn:
> | 4.9% {0ms} VersionsBrowser>>updateListsAndCodeIn:
> | 4.9% {0ms} VersionsBrowser>>reformulateList
> | 4.9% {0ms} VersionsBrowser>>contentsChanged
> | 4.9% {0ms} VersionsBrowser>>buildDiffCodePane
> | 4.9% {0ms}
> VersionsBrowser>>buildDiffMorphFromOldString:toNewString:contextClass:
> | 4.6% {0ms} DiffMorph class(Behavior)>>new
> | 4.6% {0ms} DiffMorph>>initialize
> | 4.6% {0ms} DiffMorph>>extent:
> | 4.6% {0ms}
> DiffMorph>>calibrateScrollbar
> | 4.6% {0ms}
> DiffMorph(Morph)>>fullBounds
> | 4.6% {0ms}
> DiffMorph(Morph)>>doLayoutIn:
> | 2.7% {0ms}
> DiffMorph(Morph)>>privateFullBounds
> | |2.7% {0ms}
> DiffMorph(Morph)>>submorphBounds
> | | 2.7% {0ms}
> PanelMorph(Morph)>>fullBounds
> | | 2.2% {0ms}
> PanelMorph(Morph)>>doLayoutIn:
> | | 1.3% {0ms}
> PanelMorph(Morph)>>privateFullBounds
> | 1.9% {0ms}
> ProportionalLayout>>layout:in:
> | 1.9% {0ms}
> PanelMorph(Morph)>>layoutProportionallyIn:
> | 1.6% {0ms}
> PanelMorph(Morph)>>layoutInBounds:
> 3.8% {0ms} SystemWindow class>>labelled:
> |3.8% {0ms} SystemWindow class(Behavior)>>new
> | 3.8% {0ms} SystemWindow>>initialize
> | 3.5% {0ms} SystemWindow>>extent:
> | 3.5% {0ms} SystemWindow(Morph)>>extent:
> | 3.5% {0ms} SystemWindow(Morph)>>changed
> | 3.5% {0ms} SystemWindow(Morph)>>privateFullBounds
> | 3.5% {0ms} SystemWindow(Morph)>>submorphBounds
> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> | 3.2% {0ms} RowLayout>>layout:in:
> | 3.0% {0ms} Point>>extent:
> | 3.0% {0ms} Rectangle
> class>>origin:extent:
> | 3.0% {0ms} Rectangle>>setOrigin:corner:
> 3.5% {0ms} SystemWindow>>model:
> |3.5% {0ms} SystemWindow(Morph)>>fillStyle:
> | 3.5% {0ms} SystemWindow(Morph)>>changed
> | 3.5% {0ms} SystemWindow(Morph)>>privateFullBounds
> | 3.5% {0ms} SystemWindow(Morph)>>submorphBounds
> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> | 3.2% {0ms} RowLayout>>layout:in:
> | 3.0% {0ms} Point>>extent:
> | 3.0% {0ms} Rectangle class>>origin:extent:
> | 3.0% {0ms} Rectangle>>setOrigin:corner:
> 1.9% {0ms} VersionsBrowser(CodeHolder)>>addLowerPanesTo:at:with:
> 1.9% {0ms}
> VersionsBrowser(CodeHolder)>>addOptionalButtonsTo:at:plus:
> 17.5% {0ms} ToolRegistry>>openClassBrowser
> 17.5% {0ms} Nautilus class>>open
> 17.5% {0ms} Nautilus class>>openInEnvironment:
> 17.5% {0ms} Nautilus>>open
> 17.5% {0ms} NautilusUI>>open
> 17.5% {0ms} NautilusUI(AbstractNautilusUI)>>open
> 7.3% {0ms} NautilusWindow class(Behavior)>>new
> |7.3% {0ms} NautilusWindow(StandardWindow)>>initialize
> | 3.8% {0ms} NautilusWindow(SystemWindow)>>initialize
> | |3.5% {0ms} NautilusWindow(SystemWindow)>>extent:
> | | 3.5% {0ms} NautilusWindow(Morph)>>extent:
> | | 3.5% {0ms} NautilusWindow(Morph)>>changed
> | | 3.5% {0ms} NautilusWindow(Morph)>>privateFullBounds
> | | 3.5% {0ms} NautilusWindow(Morph)>>submorphBounds
> | | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
> | | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> | | 3.2% {0ms} RowLayout>>layout:in:
> | | 3.0% {0ms} Point>>extent:
> | | 3.0% {0ms} Rectangle class>>origin:extent:
> | | 3.0% {0ms} Rectangle>>setOrigin:corner:
> | 3.5% {0ms} NautilusWindow(SystemWindow)>>setWindowColor:
> | 3.5% {0ms} NautilusWindow(SystemWindow)>>setStripeColorsFrom:
> | 3.5% {0ms} NautilusWindow(Morph)>>fillStyle:
> | 3.5% {0ms} NautilusWindow(Morph)>>changed
> | 3.5% {0ms} NautilusWindow(Morph)>>privateFullBounds
> | 3.5% {0ms} NautilusWindow(Morph)>>submorphBounds
> | 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
> | 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> | 3.2% {0ms} RowLayout>>layout:in:
> | 3.0% {0ms} Point>>extent:
> | 3.0% {0ms} Rectangle class>>origin:extent:
> | 3.0% {0ms} Rectangle>>setOrigin:corner:
> 6.7% {0ms} NautilusUI>>addAll:
> |5.7% {0ms} NautilusUI>>buildColumns:height:
> | 1.3% {0ms} NautilusUI>>buildNavigationList
> | 1.3% {0ms} DropListMorph
> class>>on:list:selected:changeSelected:
> | 1.3% {0ms} DropListMorph class(Behavior)>>new
> | 1.3% {0ms} DropListMorph>>initialize
> 3.5% {0ms} NautilusWindow(Morph)>>openInWorld
> 3.5% {0ms} NautilusWindow(SystemWindow)>>openInWorld:
> 3.5% {0ms} NautilusWindow(Morph)>>bounds:
> 3.5% {0ms} NautilusWindow(SystemWindow)>>position:
> 3.5% {0ms} NautilusWindow(Morph)>>position:
> 3.5% {0ms} NautilusWindow(Morph)>>fullBounds
> 3.5% {0ms} NautilusWindow(Morph)>>doLayoutIn:
> 3.5% {0ms} ProportionalLayout>>layout:in:
> 3.5% {0ms}
> AlignmentMorph(Morph)>>layoutProportionallyIn:
> 3.5% {0ms} AlignmentMorph(Morph)>>fullBounds
> 3.2% {0ms} AlignmentMorph(Morph)>>doLayoutIn:
> 3.2% {0ms} RowLayout>>layout:in:
> 3.0% {0ms} Point>>extent:
> 3.0% {0ms} Rectangle class>>origin:extent:
> 3.0% {0ms} Rectangle>>setOrigin:corner:
> 3.2% {0ms} WorldState>>doOneCycleNowFor:
> 3.2% {0ms} HandMorph>>processEvents
> 3.2% {0ms} HandMorph>>handleEvent:
> 3.2% {0ms} HandMorph>>sendMouseEvent:
> 3.2% {0ms} HandMorph>>sendEvent:focus:clear:
> 3.2% {0ms} PasteUpMorph(Morph)>>processEvent:
> 3.2% {0ms} PasteUpMorph>>processEvent:using:
> 3.2% {0ms} PasteUpMorph(Morph)>>processEvent:using:
> 3.2% {0ms} MorphicEventDispatcher>>dispatchEvent:with:
> 3.2% {0ms} MorphicEventDispatcher>>dispatchMouseDown:with:
> 3.2% {0ms} PasteUpMorph(Morph)>>handleEvent:
> 3.2% {0ms} MouseButtonEvent>>sentTo:
> 3.2% {0ms} PasteUpMorph(Morph)>>handleMouseDown:
> 3.2% {0ms} PasteUpMorph>>mouseDown:
> 3.2% {0ms} PasteUpMorph>>invokeWorldMenu:
> 3.2% {0ms} MenuMorph>>popUpEvent:in:
> 3.2% {0ms} MenuMorph>>popUpAt:forHand:in:
> 3.2% {0ms}
> MenuMorph>>popUpAt:forHand:in:allowKeyboard:
> 3.2% {0ms}
> MenuMorph>>positionAt:relativeTo:inWorld:
> 3.2% {0ms} MenuMorph(Morph)>>fullBounds
> 3.2% {0ms} MenuMorph(Morph)>>doLayoutIn:
> 3.2% {0ms} TableLayout>>layout:in:
> 3.2% {0ms}
> TableLayout>>layoutTopToBottom:in:
> 2.4% {0ms}
> AlignmentMorph(Morph)>>layoutInBounds:
> 1.6% {0ms}
> AlignmentMorph(Morph)>>bounds:
> 1.6% {0ms}
> AlignmentMorph(Morph)>>position:
> 1.6% {0ms}
> AlignmentMorph(Morph)>>fullBounds
> 1.3% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> 2.7% {0ms} NautilusWindow(SystemWindow)>>closeBoxHit
> 2.7% {0ms} NautilusWindow>>delete
> 2.7% {0ms} NautilusWindow(StandardWindow)>>delete
> 2.7% {0ms} NautilusWindow(SystemWindow)>>delete
> 2.7% {0ms} SystemWindow class>>noteTopWindowIn:
> 2.7% {0ms} SystemWindow>>activate
> 2.7% {0ms} SystemWindow>>navigateFocusForward
> 2.7% {0ms} SystemWindow(Morph)>>navigateFocusForward
> 2.7% {0ms} PluggableTextMorph(Morph)>>takeKeyboardFocus
> 2.7% {0ms} HandMorph>>newKeyboardFocus:
> 2.7% {0ms} PluggableTextMorph>>keyboardFocusChange:
> 2.7% {0ms} TextMorphForEditView(Morph)>>takeKeyboardFocus
> 2.7% {0ms} HandMorph>>newKeyboardFocus:
> 2.7% {0ms} TextMorphForEditView>>keyboardFocusChange:
> 2.7% {0ms} SmalltalkEditor(TextEditor)>>focused:
> 2.7% {0ms} SmalltalkEditingState>>focused:from:
> 2.7% {0ms}
> SmalltalkEditingState(EditingState)>>focused:from:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow class>>on:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow>>on:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(StandardWindow)>>model:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(SystemWindow)>>model:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(Morph)>>fillStyle:
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(Morph)>>changed
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(Morph)>>privateFullBounds
> 2.7% {0ms}
> EditorFindReplaceDialogWindow(Morph)>>submorphBounds
> 2.7% {0ms}
> AlignmentMorph(Morph)>>fullBounds
> 2.4% {0ms}
> AlignmentMorph(Morph)>>doLayoutIn:
> 2.4% {0ms}
> RowLayout>>layout:in:
> 2.2% {0ms}
> Point>>extent:
> 2.2% {0ms}
> Rectangle class>>origin:extent:
> 2.2% {0ms}
> Rectangle>>setOrigin:corner:
>
> **Leaves**
> 100.0% {2ms} Rectangle>>setOrigin:corner:
>
> **Memory**
> old +0 bytes
> young +4,588 bytes
> used +4,588 bytes
> free -4,588 bytes
>
> **GCs**
> full 0 totalling 0ms (0.0% uptime)
> incr 0 totalling 0ms (0.0% uptime)
> tenures 0
> root table 0 overflows
>
> My feeling is that you are not thru with degenerated rectangles :)
> You'd better enforce the invariant in
> http://code.google.com/p/pharo/issues/detail?id=2601
> rathert than remove it as requested in
> http://code.google.com/p/pharo/issues/detail?id=2441
>
> Nicolas
>
> 2013/2/13 Nicolas Cellier <nicolas.cellier.aka.nice(a)gmail.com>:
>> I tried to put a halt in Rectangle>>setOrigin: topLeft corner: bottomRight
>> in latest Pharo (20543) if width < 0 or height < 0 and of course the
>> image hung...
>> which means that degenerated Rectangles are pretty much in use
>>
>> I think I will juts raise a Notification, and catch it with a
>> MessageTally hack to track the senders
>> (as documented at
>> http://bugs.squeak.org/bug_view_advanced_page.php?bug_id=6755 )
>>
>> Nicolas
>>
>> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>>> yes.. and i'd like to add that in some places i replaced senders of
>>>
>>> rect1 intersect: rect2
>>>
>>> with:
>>>
>>> rect1 intersect: rect2 ifNone: [ self error: 'should not happen'].
>>>
>>> as it appears, it happens in some places... because of the above inconsistency.
>>>
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko.
>>>
>
Feb. 14, 2013
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by stephane ducasse
Hi nicolas
Thanks for the questions. Indeed we should get a strategy. I like your idea of raising an exception.
Now how would you do it? I'm so sad that the system is build on sand.
Stef
> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>> On 14 February 2013 00:15, Nicolas Cellier
>> <nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>> Please use my MessageTally trick above and you'll unfortunately see
>>> that intersect: is just one producer of empty Rectangle among many...
>>>
>>> So I think that the ifNone: protection is quite vain given the flow of
>>> empty rectangles, user is not in control at all, it's an illusion, and
>>> that a reasonnable decision is to enforce the invariant.
>>>
>>
>> but the way to enforce it is to make rect to have consistent answers
>> to #width and #height,
>> regardless in what order of origin:corner coordinates given.
>> First , you make rectangle to be consistent.. then the users of it..
>> i do not see other way to deal with it..
>>
>>
>> I repeat, the final intent was to change #setOrigin:corner: to:
>>
>> Rectangle>>setOrigin: topLeft corner: bottomRight
>> origin := (topLeft x min: bottomRight x) @ (topLeft y min:
>> bottomRight y).
>> corner := (topLeft x max: bottomRight x) @ (topLeft y max:
>> bottomRight y).
>>
>> like that, there is no way a #width or #height can answer negative values.
>>
>
> What I just want to remind you is that the base system is not at all
> ready for such a change and that you have a lot of work to clean it of
> degenerated Rectangle, it's not just cleaning intersect: and
> intersects:
>
> Are you sure you aint' gonna need an abstraction to represent an empty
> Rectangle?
> What if I try to inset a rectangle by more than half extent?
> What if I explicitely create a Rectangle with negative extent?
> (0@0 extent: -10@10) extent = (10@10) does not necessarily better meet
> my expectations...
>
> So what is your plan?
> - don't provide empty rectangle abstraction but equip each and every
> Rectangle producer with an ifEmpty: parameter?
> - create a class EmptyRectangle class with more explicit semantic than
> hasPositiveExtent not?
>
> Of course, if you can come with a cleaner model (less obscure
> features, and avoiding spreading guards everywhere in client code)
> then it is better to change the model rather than patch it.
>
> But it's not clear at all to me what your strategy is and where I can
> read about it?
> The bug reports I read are not informative and rather scary because
> they just completely ignore the old invariants. It's not a recipe for
> providing smooth transition.
>
> Also, when you change the invariants in the base system you have to
> provide a transition period to support the migration of client code.
>
> IMO, in the transition period, the code should better raise an Error
> rather than fixing things to what you THINK that is right in total
> contradiction with what users KNEW was right in the previous version.
>
> What are your plans concerning transition?
>
> Nicolas
>
>> But as i said, for that we needed to review all the code which was assumed that
>> rectangles internally keep origin @ corner points as they supplied
>> during construction..
>> but this is inherently wrong assumption.. one should not put any
>> assumptions on object's
>> internal storage. never! only on it's desired behavior.
>> And desired behavior for rectangle with two points (0,0) and (10,10)
>> regardless in what order
>> they given to answer 0 for #left, and 10 for #right.
>>
>> Because once we make assumptions about internal storage then what
>> prevents me from assuming that following should also work:
>>
>> extent := 10@10.
>> rect := Rectangle origin: 10@10 extent: extent.
>>
>> self assert: extent == rect extent
>>
>> Doing the small patches to fix minor stuff was not an intent of this
>> refactoring..
>> because it is counterproductive as to me: if model is wrong and
>> assumptions is wrong,
>> you will meet problems with it over and over again..
>> and as result, in a longer term you will spend more time fixing
>> glitches and dealing with inconsistencies here and there comparing to
>> just fixing the model and putting right assumptions in a first place,
>> once and for all.
>> This is the Pharo spirit :) well, at least to me :)
>>
>
> Agree, if you have enough power to do it.
>
>>> It's not ideal, but it's a wiser decision in the short term.
>>>
>>> Nicolas
>>>
>>> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>>>> On 14 February 2013 00:01, Nicolas Cellier
>>>> <nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>>>> So here is what I did:
>>>> .....
>>>>
>>>>>
>>>>> My feeling is that you are not thru with degenerated rectangles :)
>>>>> You'd better enforce the invariant in
>>>>> http://code.google.com/p/pharo/issues/detail?id=2601
>>>>> rathert than remove it as requested in
>>>>> http://code.google.com/p/pharo/issues/detail?id=2441
>>>>
>>>> After replacement of intersect: with intersect:ifNone:
>>>> there is no need to enforcing invariants in #intersect: anymore, because
>>>> users can decide by themselves what to do if two rects are not intersecting..
>>>>
>>>> the behavior of #intersect: for non-intersecting rects is totally
>>>> absurd and changing it to answer empty rect
>>>> (like with all zeroes) is not a good solution either, comparing to
>>>> providing a closure to handle it.
>>>>
>>>>>
>>>>> Nicolas
>>>>>
>>>>
>>>>
>>>> --
>>>> Best regards,
>>>> Igor Stasenko.
>>>>
>>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>
Feb. 14, 2013
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by Nicolas Cellier
2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
> On 14 February 2013 00:15, Nicolas Cellier
> <nicolas.cellier.aka.nice(a)gmail.com> wrote:
>> Please use my MessageTally trick above and you'll unfortunately see
>> that intersect: is just one producer of empty Rectangle among many...
>>
>> So I think that the ifNone: protection is quite vain given the flow of
>> empty rectangles, user is not in control at all, it's an illusion, and
>> that a reasonnable decision is to enforce the invariant.
>>
>
> but the way to enforce it is to make rect to have consistent answers
> to #width and #height,
> regardless in what order of origin:corner coordinates given.
> First , you make rectangle to be consistent.. then the users of it..
> i do not see other way to deal with it..
>
>
> I repeat, the final intent was to change #setOrigin:corner: to:
>
> Rectangle>>setOrigin: topLeft corner: bottomRight
> origin := (topLeft x min: bottomRight x) @ (topLeft y min:
> bottomRight y).
> corner := (topLeft x max: bottomRight x) @ (topLeft y max:
> bottomRight y).
>
> like that, there is no way a #width or #height can answer negative values.
>
What I just want to remind you is that the base system is not at all
ready for such a change and that you have a lot of work to clean it of
degenerated Rectangle, it's not just cleaning intersect: and
intersects:
Are you sure you aint' gonna need an abstraction to represent an empty
Rectangle?
What if I try to inset a rectangle by more than half extent?
What if I explicitely create a Rectangle with negative extent?
(0@0 extent: -10@10) extent = (10@10) does not necessarily better meet
my expectations...
So what is your plan?
- don't provide empty rectangle abstraction but equip each and every
Rectangle producer with an ifEmpty: parameter?
- create a class EmptyRectangle class with more explicit semantic than
hasPositiveExtent not?
Of course, if you can come with a cleaner model (less obscure
features, and avoiding spreading guards everywhere in client code)
then it is better to change the model rather than patch it.
But it's not clear at all to me what your strategy is and where I can
read about it?
The bug reports I read are not informative and rather scary because
they just completely ignore the old invariants. It's not a recipe for
providing smooth transition.
Also, when you change the invariants in the base system you have to
provide a transition period to support the migration of client code.
IMO, in the transition period, the code should better raise an Error
rather than fixing things to what you THINK that is right in total
contradiction with what users KNEW was right in the previous version.
What are your plans concerning transition?
Nicolas
> But as i said, for that we needed to review all the code which was assumed that
> rectangles internally keep origin @ corner points as they supplied
> during construction..
> but this is inherently wrong assumption.. one should not put any
> assumptions on object's
> internal storage. never! only on it's desired behavior.
> And desired behavior for rectangle with two points (0,0) and (10,10)
> regardless in what order
> they given to answer 0 for #left, and 10 for #right.
>
> Because once we make assumptions about internal storage then what
> prevents me from assuming that following should also work:
>
> extent := 10@10.
> rect := Rectangle origin: 10@10 extent: extent.
>
> self assert: extent == rect extent
>
> Doing the small patches to fix minor stuff was not an intent of this
> refactoring..
> because it is counterproductive as to me: if model is wrong and
> assumptions is wrong,
> you will meet problems with it over and over again..
> and as result, in a longer term you will spend more time fixing
> glitches and dealing with inconsistencies here and there comparing to
> just fixing the model and putting right assumptions in a first place,
> once and for all.
> This is the Pharo spirit :) well, at least to me :)
>
Agree, if you have enough power to do it.
>> It's not ideal, but it's a wiser decision in the short term.
>>
>> Nicolas
>>
>> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>>> On 14 February 2013 00:01, Nicolas Cellier
>>> <nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>>> So here is what I did:
>>> .....
>>>
>>>>
>>>> My feeling is that you are not thru with degenerated rectangles :)
>>>> You'd better enforce the invariant in
>>>> http://code.google.com/p/pharo/issues/detail?id=2601
>>>> rathert than remove it as requested in
>>>> http://code.google.com/p/pharo/issues/detail?id=2441
>>>
>>> After replacement of intersect: with intersect:ifNone:
>>> there is no need to enforcing invariants in #intersect: anymore, because
>>> users can decide by themselves what to do if two rects are not intersecting..
>>>
>>> the behavior of #intersect: for non-intersecting rects is totally
>>> absurd and changing it to answer empty rect
>>> (like with all zeroes) is not a good solution either, comparing to
>>> providing a closure to handle it.
>>>
>>>>
>>>> Nicolas
>>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Igor Stasenko.
>>>
>>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
Feb. 14, 2013
Re: [Pharo-project] [Vm-dev] Fwd: A question about lookup and message reification
by Igor Stasenko
On 14 February 2013 01:04, Eliot Miranda <eliot.miranda(a)gmail.com> wrote:
>
>
>
> On Wed, Feb 13, 2013 at 1:32 PM, Stéphane Ducasse <stephane.ducasse(a)inria.fr> wrote:
>>
>> Hi eliot
>>
>>> I repost the mail to the mailing-list since I do not see it in the vm-dev
>>
>>
>> did you post to vm-dev?
>>
>>
>> yes but since I'm travelling may be the mail was lost or I could not see appearing because one of my rules pushed it somewhere.
>> I changed machines and I have to get used to 10.8. My mail now decide to use the wrong account :(
>>
>>>
>>> Hi
>>>
>>> I was reading the following method in the VM code and I have a couple of questions:
>>>
>>> - I do not understand why lookupMethodInClass: may return a class. I was thinking that it would return a method.
>>
>>
>> It doesn't matter what it returns as it's return value is always ignored.
>>
>>
>> Ok I will read again the code. reading Slang is still nicer than plain generated C :)
>>
>> It assigns to newMethod. I suspect it returns currentClass because a) the return type was always sqInt because Slang didn't support void functions, and b) currentClass is a value in hand so probably in a register and hence cheap to return.
>>
>>
>>
>> Ok
>> I was looking for an example to show a real lookup for the students that are implementing ObjVlisp
>> Now I will see if I show them this method.
>
>
> So just run an image with the simulator and stop at any of commonSend, internalFindNewMethod, lookupMethodInClass: and you'll see the call chain form the relevant send bytecode.
>
> Here's an expression that loads and runs an image with the StackInterpreter:
>
> | vm |
> StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
> vm := StackInterpreterSimulator new.
> vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
> vm openAsMorph; run
>
> and if you break on entry to internalFindNewMethod you'll see this stack:
>
> StackInterpreterSimulatorLSB(Object)>>break
> StackInterpreterSimulatorLSB(StackInterpreter)>>internalFindNewMethod
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>internalFindNewMethod
> StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
> UndefinedObject>>DoIt
>
> If you find out what the selector is (e.g. self printOop: messageSelector) you can then use the simulator;s own breakpoint facilities:
>
> | vm |
> StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
> vm := StackInterpreterSimulator new.
> vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
> vm setBreakSelector: #&.
> vm openAsMorph; run
>
> and now it'll stop in sendBreak:point:receiver: and you'll get this stack:
>
> StackInterpreterSimulatorLSB(Object)>>halt:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>sendBreak:point:receiver:
> StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
> StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
> UndefinedObject>>DoIt
>>>
>>> - what is the invariant?
>>> that currentclass always point to the currently looked up class and
>>> newMethod is the found method?
>>
>>
>> The input arguments are messageSelector, argumentCount and its argument, class. The VM suffers somewhat from being cluttered with global variables, which is I think a legacy of the blue-book specification (the Smalltalk code that was used to implement Interpreter in VMMaker) being derived from the Alto and Dorado implementations in microcode. It would be nicer if there were fewer variables, but e.g. supplying argumentCount as a parameter throughout all the message handling routines can be difficult, especially when things like perform: and MNU change the argumentCount during message send.
>>
>>
>> I clearly see what you mean.
>>
>>> - why lookupMethodFor: selector InDictionary: dictionary is defined in StackInterpreter but never used
>>> only in CoInterpreter?
>>
>>
>> Well, it belongs in StackInterpreter and could be used in the other lookup methods. I was probably considering rewriting the other lookup routines to use lookupMethodFor: InDictionary: but didn't get round to it.
>>
>>
>> ok I see.
>>
>> While reading directly the see code I was wondering why you generate the ifdef for different bytecode set?
>> Is it that you would have to call another object and that it would not have the same instance variables.
>> Because I was thinking that such variation points could be handled by the different interpreter subclasses.
>
>
> Bytecode dispatch is performance-critical in the context and stack interpreters. The ifdef means that if one is not using multiple bytecode sets dispatch is simpler and hence faster.
>
> Subclassing is very difficult because the simulators are not traits and so subclass each interpreter class. hence adding a subclass to handle this difference means adding another simulator, and they're big and tedious to maintain. IMO the multiple bytecode set work just isn't worth that kind of load. The VM would be nicer if more fully decomposed. I've done a fair amount (moving the objectMemory into an instance variable, putting the Cogit in its own class hierarchy, adding support for struct classes that define data types like a stack page or an abstract instruction or machine-code method in the JIT) but there's always more that one can do.
>
yes.. the amount of code in one class cries for decomposition..
but it would require serious investment of manhours .. which i assume
we will never have,
because there's always more important things to do.
--
Best regards,
Igor Stasenko.
Feb. 13, 2013
Re: [Pharo-project] [Vm-dev] Fwd: A question about lookup and message reification
by Eliot Miranda
On Wed, Feb 13, 2013 at 1:32 PM, Stéphane Ducasse <stephane.ducasse(a)inria.fr
> wrote:
> Hi eliot
>
> I repost the mail to the mailing-list since I do not see it in the vm-dev
>>
>
> did you post to vm-dev?
>
>
> yes but since I'm travelling may be the mail was lost or I could not see
> appearing because one of my rules pushed it somewhere.
> I changed machines and I have to get used to 10.8. My mail now decide to
> use the wrong account :(
>
>
>> Hi
>>
>> I was reading the following method in the VM code and I have a couple of
>> questions:
>>
>> - I do not understand why lookupMethodInClass: may return a class. I was
>> thinking that it would return a method.
>>
>>
> It doesn't matter what it returns as it's return value is always ignored.
>
>
> Ok I will read again the code. reading Slang is still nicer than plain
> generated C :)
>
> It assigns to newMethod. I suspect it returns currentClass because a) the
> return type was always sqInt because Slang didn't support void functions,
> and b) currentClass is a value in hand so probably in a register and hence
> cheap to return.
>
>
>
> Ok
> I was looking for an example to show a real lookup for the students that
> are implementing ObjVlisp
> Now I will see if I show them this method.
>
So just run an image with the simulator and stop at any of commonSend,
internalFindNewMethod, lookupMethodInClass: and you'll see the call chain
form the relevant send bytecode.
Here's an expression that loads and runs an image with the StackInterpreter:
| vm |
StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
vm := StackInterpreterSimulator new.
vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
vm openAsMorph; run
and if you break on entry to internalFindNewMethod you'll see this stack:
StackInterpreterSimulatorLSB(Object)>>break
StackInterpreterSimulatorLSB(StackInterpreter)>>internalFindNewMethod
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>internalFindNewMethod
StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
UndefinedObject>>DoIt
If you find out what the selector is (e.g. self printOop: messageSelector)
you can then use the simulator;s own breakpoint facilities:
| vm |
StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
vm := StackInterpreterSimulator new.
vm openOn: '/Users/eliot/Squeak/Squeak4.4/trunk44.image'.
vm setBreakSelector: #&.
vm openAsMorph; run
and now it'll stop in sendBreak:point:receiver: and you'll get this stack:
StackInterpreterSimulatorLSB(Object)>>halt:
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>sendBreak:point:receiver:
StackInterpreterSimulatorLSB(StackInterpreter)>>commonSend
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>commonSend
StackInterpreterSimulatorLSB(StackInterpreter)>>normalSend
StackInterpreterSimulatorLSB(StackInterpreter)>>secondExtendedSendBytecode
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>dispatchOn:in:
StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>run
UndefinedObject>>DoIt
> - what is the invariant?
>> that currentclass always point to the currently looked up class and
>> newMethod is the found method?
>>
>>
> The input arguments are messageSelector, argumentCount and its argument,
> class. The VM suffers somewhat from being cluttered with global variables,
> which is I think a legacy of the blue-book specification (the Smalltalk
> code that was used to implement Interpreter in VMMaker) being derived from
> the Alto and Dorado implementations in microcode. It would be nicer if
> there were fewer variables, but e.g. supplying argumentCount as a parameter
> throughout all the message handling routines can be difficult, especially
> when things like perform: and MNU change the argumentCount during message
> send.
>
>
> I clearly see what you mean.
>
> - why lookupMethodFor: selector InDictionary: dictionary is defined in
>> StackInterpreter but never used
>> only in CoInterpreter?
>>
>>
> Well, it belongs in StackInterpreter and could be used in the other lookup
> methods. I was probably considering rewriting the other lookup routines to
> use lookupMethodFor: InDictionary: but didn't get round to it.
>
>
> ok I see.
>
> While reading directly the see code I was wondering why you generate the
> ifdef for different bytecode set?
> Is it that you would have to call another object and that it would not
> have the same instance variables.
> Because I was thinking that such variation points could be handled by the
> different interpreter subclasses.
>
Bytecode dispatch is performance-critical in the context and stack
interpreters. The ifdef means that if one is not using multiple bytecode
sets dispatch is simpler and hence faster.
Subclassing is very difficult because the simulators are not traits and so
subclass each interpreter class. hence adding a subclass to handle this
difference means adding another simulator, and they're big and tedious to
maintain. IMO the multiple bytecode set work just isn't worth that kind of
load. The VM would be nicer if more fully decomposed. I've done a fair
amount (moving the objectMemory into an instance variable, putting the
Cogit in its own class hierarchy, adding support for struct classes that
define data types like a stack page or an abstract instruction or
machine-code method in the JIT) but there's always more that one can do.
cheers!
> Thanks
>>
>>
>> lookupMethodInClass: class
>> | currentClass dictionary found |
>> <inline: false>
>> self assert: class ~= objectMemory nilObject.
>> currentClass := class.
>> [currentClass ~= objectMemory nilObject]
>> whileTrue:
>> [dictionary := objectMemory fetchPointer: MethodDictionaryIndex ofObject:
>> currentClass.
>>
>> *** trick with the cannotInterpret ***
>> dictionary = objectMemory nilObject ifTrue:
>> ["MethodDict pointer is nil (hopefully due a swapped out stub)
>> -- raise exception #cannotInterpret:."
>> self createActualMessageTo: class.
>> messageSelector := objectMemory splObj: SelectorCannotInterpret.
>> self sendBreak: messageSelector + BaseHeaderSize
>> point: (objectMemory lengthOf: messageSelector)
>> receiver: nil.
>> ^self lookupMethodInClass: (self superclassOf: currentClass)].
>> *** trick with the cannotInterpret end ***
>>
>> found := self lookupMethodInDictionary: dictionary.
>> found ifTrue: [^currentClass].
>> ^^^^^^^^^^^^^^^^^^^^^^^^^
>>
>> currentClass := self superclassOf: currentClass].
>>
>> "Could not find #doesNotUnderstand: -- unrecoverable error."
>> messageSelector = (objectMemory splObj: SelectorDoesNotUnderstand)
>> ifTrue:
>> [self error: 'Recursive not understood error encountered'].
>>
>> "Cound not find a normal message -- raise exception #doesNotUnderstand:"
>> self createActualMessageTo: class.
>> messageSelector := objectMemory splObj: SelectorDoesNotUnderstand.
>> self sendBreak: messageSelector + BaseHeaderSize
>> point: (objectMemory lengthOf: messageSelector)
>> receiver: nil.
>> ^self lookupMethodInClass: class
>>
>>
>> if (found) {
>> return currentClass;
>> }
>>
>>
>> static sqInt
>> lookupMethodInClass(sqInt class)
>> {
>> // StackInterpreter>>#lookupMethodInClass: DECL_MAYBE_SQ_GLOBAL_STRUCT
>> sqInt currentClass;
>> sqInt dictionary;
>> sqInt found;
>> sqInt header;
>> sqInt index;
>> sqInt length;
>> sqInt mask;
>> sqInt methodArray;
>> sqInt nextSelector;
>> sqInt sz;
>> sqInt wrapAround;
>>
>> assert(class != (nilObject()));
>> currentClass = class;
>> while (currentClass != GIV(nilObj)) {
>> dictionary = longAt((currentClass + BaseHeaderSize) +
>> (MethodDictionaryIndex << ShiftForWord));
>> if (dictionary == GIV(nilObj)) {
>>
>> /* ifTrue: */
>>
>> createActualMessageTo(class);
>> GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize) +
>> (SelectorCannotInterpret << ShiftForWord));
>> sendBreakpointreceiver(GIV(messageSelector) + BaseHeaderSize,
>> lengthOf(GIV(messageSelector)), null);
>> return lookupMethodInClass(longAt((currentClass + BaseHeaderSize) +
>> (SuperclassIndex << ShiftForWord)));
>> }
>> /* begin lookupMethodInDictionary: */
>> /* begin fetchWordLengthOf: */
>> /* begin sizeBitsOf: */
>> header = longAt(dictionary);
>> sz = ((header & TypeMask) == HeaderTypeSizeAndClass
>> ? (longAt(dictionary - (BytesPerWord * 2))) & LongSizeMask
>> : header & SizeMask);
>> length = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
>> mask = (length - SelectorStart) - 1;
>>
>> /* messageSelector */
>>
>> index = SelectorStart + (mask & (((GIV(messageSelector) & 1)
>> ? (GIV(messageSelector) >> 1)
>> : (((usqInt) (longAt(GIV(messageSelector)))) >> HashBitsOffset) &
>> HashMaskUnshifted)));
>> wrapAround = 0;
>> while (1) {
>> nextSelector = longAt((dictionary + BaseHeaderSize) + (index <<
>> ShiftForWord));
>> if (nextSelector == GIV(nilObj)) {
>> found = 0;
>> goto l1;
>> }
>> if (nextSelector == GIV(messageSelector)) {
>> methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex <<
>> ShiftForWord));
>> GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + ((index -
>> SelectorStart) << ShiftForWord));
>> found = 1;
>> goto l1;
>> }
>> index += 1;
>> if (index == length) {
>> if (wrapAround) {
>> found = 0;
>> goto l1;
>> }
>> wrapAround = 1;
>> index = SelectorStart;
>> }
>> }
>> found = 0;
>> l1: /* end lookupMethodInDictionary: */;
>> if (found) {
>> return currentClass;
>> }
>> currentClass = longAt((currentClass + BaseHeaderSize) + (SuperclassIndex
>> << ShiftForWord));
>> }
>> if (GIV(messageSelector) == (longAt((GIV(specialObjectsOop) +
>> BaseHeaderSize) + (SelectorDoesNotUnderstand << ShiftForWord)))) {
>> error("Recursive not understood error encountered");
>> }
>> createActualMessageTo(class);
>> GIV(messageSelector) = longAt((GIV(specialObjectsOop) + BaseHeaderSize)
>> + (SelectorDoesNotUnderstand << ShiftForWord));
>> sendBreakpointreceiver(GIV(messageSelector) + BaseHeaderSize,
>> lengthOf(GIV(messageSelector)), null);
>> return lookupMethodInClass(class);
>> }
>>
>>
>>
>>
>>
>>
>
>
> --
> best,
> Eliot
>
>
>
--
best,
Eliot
Feb. 13, 2013
Re: [Pharo-project] Rectangle>>intersects: change Rationale
by Igor Stasenko
On 14 February 2013 00:15, Nicolas Cellier
<nicolas.cellier.aka.nice(a)gmail.com> wrote:
> Please use my MessageTally trick above and you'll unfortunately see
> that intersect: is just one producer of empty Rectangle among many...
>
> So I think that the ifNone: protection is quite vain given the flow of
> empty rectangles, user is not in control at all, it's an illusion, and
> that a reasonnable decision is to enforce the invariant.
>
but the way to enforce it is to make rect to have consistent answers
to #width and #height,
regardless in what order of origin:corner coordinates given.
First , you make rectangle to be consistent.. then the users of it..
i do not see other way to deal with it..
I repeat, the final intent was to change #setOrigin:corner: to:
Rectangle>>setOrigin: topLeft corner: bottomRight
origin := (topLeft x min: bottomRight x) @ (topLeft y min:
bottomRight y).
corner := (topLeft x max: bottomRight x) @ (topLeft y max:
bottomRight y).
like that, there is no way a #width or #height can answer negative values.
But as i said, for that we needed to review all the code which was assumed that
rectangles internally keep origin @ corner points as they supplied
during construction..
but this is inherently wrong assumption.. one should not put any
assumptions on object's
internal storage. never! only on it's desired behavior.
And desired behavior for rectangle with two points (0,0) and (10,10)
regardless in what order
they given to answer 0 for #left, and 10 for #right.
Because once we make assumptions about internal storage then what
prevents me from assuming that following should also work:
extent := 10@10.
rect := Rectangle origin: 10@10 extent: extent.
self assert: extent == rect extent
Doing the small patches to fix minor stuff was not an intent of this
refactoring..
because it is counterproductive as to me: if model is wrong and
assumptions is wrong,
you will meet problems with it over and over again..
and as result, in a longer term you will spend more time fixing
glitches and dealing with inconsistencies here and there comparing to
just fixing the model and putting right assumptions in a first place,
once and for all.
This is the Pharo spirit :) well, at least to me :)
> It's not ideal, but it's a wiser decision in the short term.
>
> Nicolas
>
> 2013/2/13 Igor Stasenko <siguctua(a)gmail.com>:
>> On 14 February 2013 00:01, Nicolas Cellier
>> <nicolas.cellier.aka.nice(a)gmail.com> wrote:
>>> So here is what I did:
>> .....
>>
>>>
>>> My feeling is that you are not thru with degenerated rectangles :)
>>> You'd better enforce the invariant in
>>> http://code.google.com/p/pharo/issues/detail?id=2601
>>> rathert than remove it as requested in
>>> http://code.google.com/p/pharo/issues/detail?id=2441
>>
>> After replacement of intersect: with intersect:ifNone:
>> there is no need to enforcing invariants in #intersect: anymore, because
>> users can decide by themselves what to do if two rects are not intersecting..
>>
>> the behavior of #intersect: for non-intersecting rects is totally
>> absurd and changing it to answer empty rect
>> (like with all zeroes) is not a good solution either, comparing to
>> providing a closure to handle it.
>>
>>>
>>> Nicolas
>>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>
--
Best regards,
Igor Stasenko.
Feb. 13, 2013