[Rd] Frames in compiled functions

Winston Chang winstonchang1 at gmail.com
Fri Nov 11 21:07:36 CET 2016


It looks like the byte compiler is optimizing local() to an
immediately-invoked function, instead of using eval() and substitute(). I
don't know if that's exactly how it's implemented internally, but that's
what it looks like here:

compiler::enableJIT(0)

fun <- function(x) {
   local(sys.calls())
}
fun(1)
## [[1]]
## fun(1)
##
## [[2]]
## local(sys.calls())
##
## [[3]]
## eval.parent(substitute(eval(quote(expr), envir)))
##
## [[4]]
## eval(expr, p)
##
## [[5]]
## eval(expr, envir, enclos)
## call
## [[6]]
## eval(quote(sys.calls()), new.env())
##
## [[7]]
## eval(expr, envir, enclos)


compiler::cmpfun(fun)(1)
## [[1]]
## (compiler::cmpfun(fun))(1)
##
## [[2]]
## (function() sys.calls())()


-Winston


On Fri, Nov 11, 2016 at 1:13 PM, brodie gaslam via R-devel <
r-devel at r-project.org> wrote:

> I noticed some problems that cropped in the latest versions of R-devel
> (2016-11-08 r71639 in my case) for one of my packages.  I _think_ I have
> narrowed it down to the changes to what gets byte-compiled by default.  The
> following example run illustrates the problem I'm having:
>
>   compiler::enableJIT(0)
>   fun <- function(x) local(as.list(parent.frame(2)))
>   fun(1)
>   ## $x
>   ## [1] 1
>   ##
>
>
>
>   compiler::cmpfun(fun)(1)
>   ## <contents of .GlobalEnv>
>
>
> Is this considered problematic at all?  If so, might it make sense to
> broaden the list of functions that disable JIT compilation beyond
> `browser`?  I'm pretty sure I can work around this issue in my specific use
> case, but figured it is worth mentioning here since it is a change in
> behavior.
>
>
> Regards,
>
> B.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list