file: job.t package: muf status: alpha
The ]invokeDebugger function is a standard
way for a Muq program to enter the debugger.
If @$s.debuggerHook is a compiled function,
it will be called with the event block and the
value of @$s.debuggerHook itself. We pass
the latter because @$s.debuggerHook is set to
nil while the hook function is executing.
If @$s.debuggerHook returns, then if
@$s.debugger is a compiled function, it is
invoked with the event as argument. (The event
is first converted from a stackblock to a vector
via ]makeVector.) This function
should never return. (If it does,
]invokeDebugger will in desperation kill the
job.)
Note that @$s.debugger is set at login to the
value of me$s.debugger: thus the way to
"permanently" change to another debugger is to set
me$s.debugger to the desired function.
By default, the standard Muq db binds me$s.debugger
to mufDebugger. See section mufDebugger.
For a very simple example, try:
withTag my-tag do{
[ :function :: { -> ! } 'my-tag goto ;
:name 'my-restart
:reportFunction "Continue from 'my-tag"
| ]withRestartDo{
[ | ]invokeDebugger
}
my-tag
}
This will invoke the debugger after establishing a restart which lets you continue from where you left off.
The ]invokeDebugger function is currently implemented as:
: ]invokeDebugger { [] -> @ ! }
( Invoke debugger_hook, if present: )
@$s.debuggerHook -> dh
dh compiledFunction? if
( We're supposed to bind rather than )
( set, but we'll cheat, since we do )
( not have binding implemented yet: )
after{
nil --> @$s.debuggerHook
|dup[ dh dh
call{ [] $ -> }
}alwaysDo{
dh --> @$s.debugger_hook
}
fi
( Since debuggerHook returned, )
( invoke standard debugger: )
]makeVector -> event
@$s.debugger -> debugger
debugger compiledFunction? if
event debugger call{ $ -> @ }
fi
( If no debugger, kill job: )
"]invokeDebugger: Invalid @$s.debugger, killing job." ,
nil endJob
;
']invokeDebugger export
Go to the first, previous, next, last section, table of contents.