Plaster

common-lisp
(defmacro with-continuable (&body body) (u:with-gensyms (debugger-entry-time debugger-leave-time previous-hook pause-time) (let ((hook #+sbcl 'sb-ext:*invoke-debugger-hook* #-sbcl '*debugger-hook*)) `(let* ((,debugger-entry-time nil) (,debugger-leave-time nil) (,previous-hook ,hook) (,hook (lambda (condition hook) (declare (ignore hook)) (log:debug :ndjinn "Entered debugger") (setf ,debugger-entry-time (get-time)) (unwind-protect (when ,previous-hook (funcall ,previous-hook condition ,previous-hook)) (when ,debugger-entry-time (let ((,pause-time (- (get-time) ,debugger-entry-time))) (incf (pause-time) ,pause-time) (log:debug :ndjinn "Spent ~3$ seconds in the debugger" ,pause-time))))))) (with-simple-restart (abort "Ndjinn: Skip processing the currently executing frame") ,@body)))))