On Wed, Apr 19, 2000 at 03:57:27PM -0700, Dan Ingalls wrote:
Does anyone know of better code available of a prefereable way of doing this?
ST/X has a similar but more powerfull Breakpoint-system:
With the "MessageTracer" it is possible to wrap methods with blocks that are evaluated on entry or exit of the wrapped method.
MassageTracer allows both class-based and object-based method-wrapping. The normal Behaviour-hierarchy is used for building special classes, no "lightwight" classes are used.
Method-based:
MessageTracer wrapMethod:aMethod onEntry:entryBlock onExit:exitBlock
Object-based:
MessageTracer wrap:anObject selector:aSelector onEntry:entryBlock onExit:exitBlock
MessageTraver provides many predefined Entry/Exit-Blocks and shortcuts: (breakpointing, tracing, timing, memory-usage, modifications)
BreakPoint on Selector:
MessageTracer trap:anObject selector:aSelector
A trace is installed by:
MessageTracer trace:anObject selector:aSelector
this arranges that a trace message is printed to the standard error output (Stderr), both upon entry and exit to/from the method.
BreakPoint when an instancevariable is changed:
MessageTracer trapModificationsIn:anObject
MethodWrapping is a very powerfull tool, e.g. it can be used for conditional Breakpointing:
|p|
p := Point new. MessageTracer wrap:p selector:#x: onEntry:[:con | (con args at:1) > 5 ifTrue:[ Debugger enter:con withMessage:'hit breakPoint; arg > 5' ] ] onExit:nil.
p x:4. "nothing happens" p x:-1. "nothing happens." p x:10. "bummm"
Or for counting method-invocations:
Smalltalk at:#MyCount put:0 .
MessageTracer wrapMethod:(Float compiledMethodAt:#+) onEntry:[:con | MyCount := MyCount + 1] onExit:[:con :ret | ].
All wrapped methods are removed with
MessageTracer unwrapAllMethods
-- Marcus Denker marcus@ira.uka.de phone@home:(0721)614235 @work:(0721)608-2749