78 lines
2.2 KiB
R
78 lines
2.2 KiB
R
|
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)
|