blob: 2e67e1e3e22596d4996ab7d5baf5eddb7cc4716e [file] [log] [blame]
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)