library(compiler) # This tests tracking of source file references options(keep.source=TRUE) ln <- function() attr(sys.call(), "srcref")[1] # NOTE: the block below is sensitive to formatting (newlines) code <- quote({ start <- ln() plus1 <- ln() # start + 1 stopifnot(identical(plus1, start+1L)) { plus4 <- ln() # start + 4 } stopifnot(identical(plus4, start+4L)) plus9 <- 0 f <- function() { plus9 <<- ln() # start + 9 } f() stopifnot(identical(plus9, start+9L)) g <- function(x = ln()) x # start + 13 plus13 <- g() stopifnot(identical(plus13, start+13L)) plus16 <- g(ln()) # start + 16 stopifnot(identical(plus16, start+13L) || identical(plus16, start+16L)) ### NOTE: see compatibility note below for(i in 1) plus18 <- ln() # start + 18 stopifnot(identical(plus18, start+18L)) for(i in 1) { plus20 <- ln() } # start + 20 stopifnot(identical(plus20, start+20L)) for(i in 1) { plus23 <- ln() # start + 23 } stopifnot(identical(plus23, start+23L)) ff <- function() for(i in 1) return(ln()) # start + 26 plus26 <- ff() stopifnot(identical(plus26, start+26L)) ff1 <- function() { for(i in 1) return(ln()) # start + 30 } plus30 <- ff1() stopifnot(identical(plus30, start+30L)) }) ## Compatibility note ## ## in the example above, "plus16" with the AST interpreter gets line number ## start+13, but with the compiler, it gets start+16. The latter seems to ## be more correct, as line start+16 is where the spelling of "ln()" is. oldoptimize <- getCompilerOption("optimize") oldjit <- enableJIT(0) l <- function() 1 body(l) <- code for(jit in 0:2) { enableJIT(jit) for (opt in 0:3) { if (opt >=2 || jit <=2) { setCompilerOptions(optimize=opt) eval(code) eval(compile(code)) body(l) <- code l() body(l) <- code cmpfun(l)() local(eval(code)) do.call("local", list(code)) } } } setCompilerOptions(optimize = oldoptimize) enableJIT(oldjit)