blob: 012d6e1ba4d6431b699331ff57b3f453d9ccf3c6 [file] [log] [blame]
# File src/library/base/R/traceback.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2016 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
.traceback <- function(x = NULL) {
if(is.null(x) && !is.null(x <- get0(".Traceback", envir = baseenv())))
{}
else if (is.numeric(x))
x <- .Internal(traceback(x))
x
}
traceback <- function(x = NULL, max.lines = getOption("deparse.max.lines"))
{
n <- length(x <- .traceback(x))
if(n == 0L)
cat(gettext("No traceback available"), "\n")
else {
for(i in 1L:n) {
xi <- x[[i]]
label <- paste0(n-i+1L, ": ")
m <- length(xi)
## Find source location (NULL if not available)
srcloc <- if (!is.null(srcref <- attr(xi, "srcref"))) {
srcfile <- attr(srcref, "srcfile")
paste0(" at ", basename(srcfile$filename), "#", srcref[1L])
}
## Truncate deparsed code (destroys attributes of xi)
if(is.numeric(max.lines) && max.lines > 0L && max.lines < m) {
xi <- c(xi[seq_len(max.lines)], " ...")
m <- length(xi)
}
if (!is.null(srcloc)) {
xi[m] <- paste0(xi[m], srcloc)
}
if(m > 1)
label <- c(label, rep(substr(" ", 1L,
nchar(label, type="w")),
m - 1L))
cat(paste0(label, xi), sep="\n")
}
}
invisible(x)
}