From: Christophe Rhodes Date: Wed, 25 Aug 2010 17:14:19 +0000 (+0100) Subject: factor out backtraceForEmacs() into `swank:backtrace` X-Git-Url: http://christophe.rhodes.io/gitweb/?p=swankr.git;a=commitdiff_plain;h=98e89761b295de170b77d10779a979f9da1a3d84;hp=574dfdfecdc1bb179c60e79e680092469303404a factor out backtraceForEmacs() into `swank:backtrace` write `swank:debugger-info-for-emacs` out, and hence delete debuggerInfoForEmacs(). Now wandering past the --more-- prompt in sldb gives an infinite sequence of NULLs, but at least it's not a cascade of errors any more. --- diff --git a/swank.R b/swank.R index 1826944..0684ab0 100644 --- a/swank.R +++ b/swank.R @@ -65,7 +65,7 @@ makeSldbState <- function(condition, level, id) { sldbLoop <- function(io, sldbState, id) { tryCatch({ - sendToEmacs(io, c(list(quote(`:debug`), id, sldbState$level), debuggerInfoForEmacs(sldbState))) + sendToEmacs(io, c(list(quote(`:debug`), id, sldbState$level), `swank:debugger-info-for-emacs`(io, sldbState))) sendToEmacs(io, list(quote(`:debug-activate`), id, sldbState$level, FALSE)) while(TRUE) { dispatch(io, readPacket(io), sldbState) @@ -73,29 +73,6 @@ sldbLoop <- function(io, sldbState, id) { }, finally=sendToEmacs(io, c(list(quote(`:debug-return`), id, sldbState$level, FALSE)))) } -debuggerInfoForEmacs <- function(sldbState, from=0, to=NULL) { - backtraceForEmacs <- function() { - calls <- sldbState$calls - if(is.null(to)) to <- length(calls) - from <- from+1 - calls <- lapply(calls[from:to], { frameNumber <- from-1; - function (x) { ret <- list(frameNumber, paste(format(x), sep="", collapse=" ")); frameNumber <<- 1+frameNumber; ret }}) - } - computeRestartsForEmacs <- function () { - lapply(sldbState$restarts, - function(x) { - ## this is all a little bit internalsy - restartName <- x[[1]][[1]] - description <- restartDescription(x) - list(restartName, if(is.null(description)) restartName else description) - }) - } - list(list(as.character(sldbState$condition), sprintf(" [%s]", class(sldbState$condition)[[1]]), FALSE), - computeRestartsForEmacs(), - backtraceForEmacs(), - list(sldbState$id)) -} - readPacket <- function(io) { header <- readChunk(io, 6) len <- strtoi(header, base=16) @@ -270,8 +247,35 @@ printToString <- function(val) { signalCondition(condition) } -`swank:debugger-info-for-emacs` <- function(io, sldbState, from, to) { - debuggerInfoForEmacs(sldbState, from=from, to=to) +`swank:backtrace` <- function(io, sldbState, from=0, to=NULL) { + calls <- sldbState$calls + if(is.null(to)) to <- length(calls) + from <- from+1 + calls <- lapply(calls[from:to], + { frameNumber <- from-1; + function (x) { + ret <- list(frameNumber, paste(format(x), sep="", collapse=" ")) + frameNumber <<- 1+frameNumber + ret + } + }) +} + +computeRestartsForEmacs <- function (sldbState) { + lapply(sldbState$restarts, + function(x) { + ## this is all a little bit internalsy + restartName <- x[[1]][[1]] + description <- restartDescription(x) + list(restartName, if(is.null(description)) restartName else description) + }) +} + +`swank:debugger-info-for-emacs` <- function(io, sldbState, from=0, to=NULL) { + list(list(as.character(sldbState$condition), sprintf(" [%s]", class(sldbState$condition)[[1]]), FALSE), + computeRestartsForEmacs(sldbState), + `swank:backtrace`(io, sldbState, from, to), + list(sldbState$id)) } `swank:invoke-nth-restart-for-emacs` <- function(io, sldbState, level, n) {