[squeak-dev] The Inbox: Tools-ul.378.mcz
Levente Uzonyi
leves at elte.hu
Thu Sep 8 21:18:26 UTC 2011
On Thu, 8 Sep 2011, Eliot Miranda wrote:
> Levente, I object :) I find the findBinary:do:ifNone: extremely ugly and
> much prefer the findNearbyBinaryIndex: usage. Would you mind if we reverted
> to that?
I pushed it to the inbox, so there's nothing to revert. I prefer to
have as few implementations of binary search as possible.
Did you check the other changes? Are those acceptable?
Levente
P.S.: I just saw that Henrik wrote a mail about this method on the Pharo
list with some other simplifications.
>
> On Thu, Sep 8, 2011 at 2:04 PM, <commits at source.squeak.org> wrote:
>
>> A new version of Tools was added to project The Inbox:
>> http://source.squeak.org/inbox/Tools-ul.378.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Tools-ul.378
>> Author: ul
>> Time: 8 September 2011, 10:57:10.107 pm
>> UUID: 0262d60e-4ceb-b246-8d3f-96424d2aa1ce
>> Ancestors: Tools-eem.377
>>
>> Simplified DebuggerMethodMap >> #rangeForPC:contextIsActiveContext:.
>> - copy and sort the associations in a bit simpler and probably faster way
>> - removed unnecessary checks (#isNil after non-nil assignment)
>> - uses Array instead of SortedCollection :)
>> - uses Juan's general purpose binary search instead of a custom one (it
>> also handles all special cases)
>> - uses #detectMax: instead of a specialized #inject:into:
>>
>> =============== Diff against Tools-eem.377 ===============
>>
>> Item was changed:
>> ----- Method: DebuggerMethodMap>>rangeForPC:contextIsActiveContext: (in
>> category 'source mapping') -----
>> rangeForPC: contextsConcretePC contextIsActiveContext:
>> contextIsActiveContext
>> "Answer the indices in the source code for the supplied pc.
>> If the context is the actve context (is at the hot end of the
>> stack)
>> then its pc is the current pc. But if the context isn't, because
>> it is
>> suspended sending a message, then its current pc is the previous
>> pc."
>>
>> + | pc |
>> - | pc i end |
>> pc := self method abstractPCForConcretePC: (contextIsActiveContext
>>
>> ifTrue: [contextsConcretePC]
>>
>> ifFalse: [(self method pcPreviousTo:
>> contextsConcretePC)
>>
>> ifNotNil: [:prevpc|
>> prevpc]
>>
>> ifNil:
>> [contextsConcretePC]]).
>> (self abstractSourceMap includesKey: pc) ifTrue:
>> [^self abstractSourceMap at: pc].
>> + sortedSourceMap ifNil: [
>> + sortedSourceMap := self abstractSourceMap associations
>> + replace: [ :each | each copy ];
>> + sort ].
>> + ^sortedSourceMap
>> + findBinary: [ :assoc | pc - assoc key ]
>> + do: [ :item | item value ]
>> + ifNone: [ :lower :upper |
>> + lower
>> + ifNil: [ 1 to: 0 ]
>> + ifNotNil: [
>> + upper
>> + ifNotNil: [ upper value ]
>> "No match, but a nearby element."
>> + ifNil: [
>> + | end |
>> + end :=
>> sortedSourceMap detectMax: [ :each | each value last ].
>> + end + 1 to: end ] ]
>> ]
>> - sortedSourceMap ifNil:
>> - [sortedSourceMap := self abstractSourceMap.
>> - sortedSourceMap := (sortedSourceMap keys collect:
>> - [:key| key
>> -> (sortedSourceMap at: key)]) asSortedCollection].
>> - (sortedSourceMap isNil or: [sortedSourceMap isEmpty]) ifTrue: [^1
>> to: 0].
>> - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc
>> key].
>> - i < 1 ifTrue: [^1 to: 0].
>> - i > sortedSourceMap size ifTrue:
>> - [end := sortedSourceMap inject: 0 into:
>> - [:prev :this | prev max: this value last].
>> - ^end+1 to: end].
>> - ^(sortedSourceMap at: i) value
>>
>> "| method source scanner map |
>> method := DebuggerMethodMap compiledMethodAt:
>> #rangeForPC:contextIsActiveContext:.
>> source := method getSourceFromFile asString.
>> scanner := InstructionStream on: method.
>> map := method debuggerMap.
>> Array streamContents:
>> [:ranges|
>> [scanner atEnd] whileFalse:
>> [| range |
>> range := map rangeForPC: scanner pc
>> contextIsActiveContext: true.
>> ((map abstractSourceMap includesKey: scanner
>> abstractPC)
>> and: [range first ~= 0]) ifTrue:
>> [ranges nextPut: (source copyFrom: range
>> first to: range last)].
>> scanner interpretNextInstructionFor:
>> InstructionClient new]]"!
>>
>>
>>
>
>
> --
> best,
> Eliot
>
More information about the Squeak-dev
mailing list
|