Hi all,
would you mind if I merged these changes (#haltOnceIf:)? As they have worked well for me so far, I will merge them next week if no one objects. See also KernelTests-ct.374. :-)
Best,
Christoph
---
Sent from Squeak Inbox Talk
On 2020-01-09T14:42:46+00:00, commits@source.squeak.org wrote:
> A new version of Kernel was added to project The Inbox:
> http://source.squeak.org/inbox/Kernel-ct.1294.mcz
>
> ==================== Summary ====================
>
> Name: Kernel-ct.1294
> Author: ct
> Time: 9 January 2020, 3:42:36.672555 pm
> UUID: 7409dcc3-160e-9d44-9712-f266e0f25973
> Ancestors: Kernel-nice.1292
>
> Proposal: Add #haltOnceIf: to Object, which combines the strengths of #haltOnce and #haltIf:. Especially useful in performance-critical situations: It HaltOnce is disabled, the condition will not be evaluated at all.
>
> =============== Diff against Kernel-nice.1292 ===============
>
> Item was changed:
> ----- Method: Object>>haltIf: (in category 'debugging') -----
> + haltIf: aCondition
> + "This is the typical message to use for inserting breakpoints during debugging. Param can be a block or expression, halt if true.
> - haltIf: condition
> - "This is the typical message to use for inserting breakpoints during
> - debugging. Param can be a block or expression, halt if true.
> If the Block has one arg, the receiver is bound to that.
> + If the condition is a selector, we look up in the callchain. Halt if any method's selector equals selector."
> - If the condition is a selector, we look up in the callchain. Halt if
> - any method's selector equals selector."
> - | cntxt |
>
> + ^ (self meetsHaltCondition: aCondition)
> + ifTrue: [self halt]!
> - condition isSymbol ifTrue:[
> - "only halt if a method with selector symbol is in callchain"
> - cntxt := thisContext.
> - [cntxt sender isNil] whileFalse: [
> - cntxt := cntxt sender.
> - (cntxt selector = condition) ifTrue: [Halt signal].
> - ].
> - ^self.
> - ].
> - (condition isBlock
> - ifTrue: [condition cull: self]
> - ifFalse: [condition]
> - ) ifTrue: [
> - Halt signal
> - ].!
>
> Item was added:
> + ----- Method: Object>>haltOnceIf: (in category 'debugging') -----
> + haltOnceIf: aCondition
> + "Check aCondition and halt, unless we have already done it once. See #meetsHaltCondition:."
> +
> + self haltOnceEnabled ifFalse: [^ self].
> + ^ (self meetsHaltCondition: aCondition)
> + ifTrue: [
> + self clearHaltOnce; halt].!
>
> Item was added:
> + ----- Method: Object>>meetsHaltCondition: (in category 'debugging') -----
> + meetsHaltCondition: aCondition
> + "If the Block has one arg, the receiver is bound to that.
> + If the condition is a selector, we look up in the callchain. Halt if any method's selector equals selector."
> +
> + aCondition isSymbol ifTrue: [ | ctxt |
> + "only halt if a method with selector symbol is in callchain"
> + ctxt := thisContext.
> + [(ctxt := ctxt sender) isNil] whileFalse: [
> + (ctxt selector = aCondition) ifTrue: [^ true] ].
> + ^ false ].
> + ^ aCondition isBlock
> + ifTrue: [aCondition cull: self]
> + ifFalse: [aCondition value]!
>
>