Conditional halt

#haltIf:


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."

	| cntxt |

	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

	].

O comentário do método #haltIf: é bem esclarecedor:

“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.”

que em português ficaria:

“Esta é a típica mensagem para inserir breakpoints (ponto de interrupção) durante o
debugging (depuração). O parâmetro pode ser um bloco ou expressão, parando a execução do programa se retornar true.
Se o bloco tem um argumento, o receptor (self) é passado para mesmo.
Se a condição é um selector (seletor de mensagem ou método), é verificado se está no callchain (sequência de invocações na pilha de chamadas). Para a execução se o seletor de qualquer método coincide com o seletor passado como argumento.”

Veja abaixo como usar #haltIf: com uma expressão:

Para ilustrar o uso de #halIf: com um bloco veja os screenshots abaixo:

Para demonstrar a detecção de um seletor no callchain é preciso um pouco mais de elaboração:

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s