[Rd] PROTECT help

Prof Brian Ripley
Tue, 27 Mar 2012 13:41:21 -0000

On 27/03/2012 14:22, Terry Therneau wrote:
> I received the following note this AM. The problem is, I'm not quite
> sure how to fix it.
> Can one use PROTECT(coxlist(eval(PROTECT.... , do I create an
> intermediate variable, or otherwise?

You can, but I find it easiest to follow if you create an intermediate
variable.  Look for example at unique.c:

             SEXP call, r;
             PROTECT(call = lang2(install("as.character"), s));
             PROTECT(r = eval(call, env));
             UNPROTECT(2);
             return r;



>
> I'm willing to update the code if someone will give me a pointer to the
> right documentation. This particular chunk was written when there was a
> lot of change going on in the callback mechanism and so there might be a
> safer and/or simpler and/or more standard aproach by now. The routine in
> question has to do with penalized Cox models, the C code needs to get
> the value of the penalty and the penalty is an arbitrary S expression
> passed down from top level.
>
> Terry T
>
> ----------------------------
>
> In survival_2.36-12 (and earlier), in the function cox_callback() at
> cox_Rcallback.c:40:
>
> PROTECT(coxlist=eval(lang2(fexpr,data),rho));
>
> the return value of the call to lang2() is vulnerable if allocations
> within eval() give rise to garbage collection.
>
> (Discovered during CXXR development.)
>
> Andrew
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel


--
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595