| # 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) |
| } |