[Rd] as.environment.list provides inconsistent results under torture

2011-01-11 Thread Romain Francois

Hello,

Using R-devel (rev 53950), I get inconsistent results with 
as.environment( VECSXP ) when gctorture is on.


Consider:

a - list( aa = rnorm, bb = runif )
gctorture(TRUE)
as.environment( a )

The last line sometimes produces the correct environment, but sometimes 
I get errors. Here are the three situations:


# good
 as.environment( a )
environment: 0x100b1c978

# not good
 as.environment( a )
Erreur dans length(x) : 'x' est manquant

# not good either
 as.environment( a )
Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
  correspondance partielle de chaînes de caractères incorrecte


Is it because the call made by lang4 is not protected while evaluated in 
this line :


case VECSXP: {
/* implement as.environment.list() {isObject(.) is false for a list} */
return(eval(lang4(install(list2env), arg,
  /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
rho));
}


(BTW, this was detected in a long Rcpp-devel thread. See 
http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)


Romain

--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/fT2rZM : highlight 0.2-5
|- http://bit.ly/gpCSpH : Evolution of Rcpp code size
`- http://bit.ly/hovakS : RcppGSL initial release

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] [Rcpp-devel] Loading a package using Rcpp Modules results in memory corruption

2011-01-11 Thread Dominick Samperi
On Tue, Jan 11, 2011 at 2:41 PM, Romain Francois
rom...@r-enthusiasts.comwrote:

 Le 11/01/11 19:57, Romain Francois a écrit :

  Le 11/01/11 19:46, Douglas Bates a écrit :

 On Tue, Jan 11, 2011 at 12:27 PM, Dominick
 Samperidjsamp...@gmail.com wrote:



 On Tue, Jan 11, 2011 at 1:20 PM, Romain
 Francoisrom...@r-enthusiasts.com
 wrote:


 Le 11/01/11 19:12, Davor Cubranic a écrit :


 I think an important point from Doug has been lost in the subsequent
 20-odd messages of flamebombing:

  I do not see this as compatible with the C++ Design principle we use
 whereby
 protection / unprotection occurs relative to the end of scope -- and
 not
 after every single assignment or allocation.

 In other words, gctorture() may well be a fine test for the C API
 and
 its
 PROTECT and UNPROTECT at every step but possibly not quite as
 much for
 Rcpp.


 I don't think so. In the situation that Dominick is describing the C
 API is being used (calls to Rf_install, Rf_lang1, Rf_eval, ...) and
 you have to play by the rules of the C API. Essentially every time
 that you call a function in the C API that can cause a memory
 allocation you are open yourself to the possibility of having the
 garbage collector run and getting unprotected SEXPs blown away. And,
 naturally, Rf_eval can cause memory allocation.

 I understood Dominick to be saying that in the code related to
 Modules
 and the evaluator and all that which we have been trying to debug
 there are such cases of the use of the C API that are unsafe.


 Can anyone comment whether this is correct?

 Davor


 Yep. Doug's analysis is right. Rcpp is implemented with the C R API,
 and
 apparently there were a few places where we were not careful enough.
 Most
 notably in calls to Rf_lcons and Rf_cons. This has been partially
 dealt with
 today.


 Just for the record, Doug is summarizing my analysis, based on several
 examples that I posted to this thread,
 and that I am pleased to see have inspired some remedial action.


 Sorry for not responding earlier. I'm in the middle of teaching a
 short course.

 Dominick is correct that it was his analysis that picked up the
 failures to PROTECT/UNPROTECT in cases that were causing at least some
 of the problems with loading Modules. Credit where credit is due.

 As Romain has indicated, some of the problems have been fixed but
 apparently problems still remain. Debugging memory protection
 problems is often very difficult.


 It is. Not sure what is my next step here. Remaining problems seem not
 directly related to Rcpp, but rather associated with lazy loading. See:


 This now by not be related to Rcpp. See the thread on R-devel:
 http://comments.gmane.org/gmane.comp.lang.r.devel/26504

 Please whoever is interested in fixing this, send your remarks and patches
 to the R-devel mailing list.


This looks like the same problem that appeared in Rcpp, an unprotected SEXP
in
R/src/main/envir.c, in the function do_as_environment(), case VECSXP of
the
switch. Here is modified code that seems to fix the problem, at least under
Linux:

case VECSXP: {
Rprintf(VECSXP as.environment\n);
/* implement as.environment.list() {isObject(.) is false for a list} */
SEXP sp = PROTECT(lang4(install(list2env), arg,
/*envir = */R_NilValue, /* parent = */R_EmptyEnv));
SEXP res = eval(sp, rho);
UNPROTECT(1);
return res;
}

Dominick


 Romain


 --
 Romain Francois
 Professional R Enthusiast
 +33(0) 6 28 91 30 30
 http://romainfrancois.blog.free.fr
 |- http://bit.ly/fT2rZM : highlight 0.2-5
 |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
 `- http://bit.ly/hovakS : RcppGSL initial release


 ___
 Rcpp-devel mailing list
 rcpp-de...@lists.r-forge.r-project.org
 https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


[[alternative HTML version deleted]]

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] as.environment.list provides inconsistent results under torture

2011-01-11 Thread Simon Urbanek
Interesting, I'd argue that the bug is in eval() not protecting its arguments 
since the usual convention is for functions to protect its arguments...

On Jan 11, 2011, at 2:33 PM, Romain Francois wrote:

 Hello,
 
 Using R-devel (rev 53950), I get inconsistent results with as.environment( 
 VECSXP ) when gctorture is on.
 
 Consider:
 
 a - list( aa = rnorm, bb = runif )
 gctorture(TRUE)
 as.environment( a )
 
 The last line sometimes produces the correct environment, but sometimes I get 
 errors. Here are the three situations:
 
 # good
  as.environment( a )
 environment: 0x100b1c978
 
 # not good
  as.environment( a )
 Erreur dans length(x) : 'x' est manquant
 
 # not good either
  as.environment( a )
 Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
  correspondance partielle de chaînes de caractères incorrecte
 
 
 Is it because the call made by lang4 is not protected while evaluated in this 
 line :
 
case VECSXP: {
   /* implement as.environment.list() {isObject(.) is false for a list} */
   return(eval(lang4(install(list2env), arg,
 /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
   rho));
}
 
 
 (BTW, this was detected in a long Rcpp-devel thread. See 
 http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)
 
 Romain
 
 -- 
 Romain Francois
 Professional R Enthusiast
 +33(0) 6 28 91 30 30
 http://romainfrancois.blog.free.fr
 |- http://bit.ly/fT2rZM : highlight 0.2-5
 |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
 `- http://bit.ly/hovakS : RcppGSL initial release
 
 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel
 
 

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] as.environment.list provides inconsistent results under torture

2011-01-11 Thread luke-tierney

No. Lots of internal functions expect their callers to protect their
arguments, for efficiency reasons. eval is called very often and
almost always with argument that are protected because they are in the
evaluation engine, so it would be wasteful and potentially very costly
if eval protected its arguments every time it is called. (I don't
tknow what the cost would be to do so in the current implementation
but it could be prohibitive if we moved to some different approaches,
so for now we whould continue to expect callers of eval to make sure
the argumetns are protected.)

Best,

luke

On Tue, 11 Jan 2011, Simon Urbanek wrote:


Interesting, I'd argue that the bug is in eval() not protecting its arguments 
since the usual convention is for functions to protect its arguments...

On Jan 11, 2011, at 2:33 PM, Romain Francois wrote:


Hello,

Using R-devel (rev 53950), I get inconsistent results with as.environment( 
VECSXP ) when gctorture is on.

Consider:

a - list( aa = rnorm, bb = runif )
gctorture(TRUE)
as.environment( a )

The last line sometimes produces the correct environment, but sometimes I get 
errors. Here are the three situations:

# good

as.environment( a )

environment: 0x100b1c978

# not good

as.environment( a )

Erreur dans length(x) : 'x' est manquant

# not good either

as.environment( a )

Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
 correspondance partielle de chaînes de caractères incorrecte


Is it because the call made by lang4 is not protected while evaluated in this 
line :

   case VECSXP: {
/* implement as.environment.list() {isObject(.) is false for a list} */
return(eval(lang4(install(list2env), arg,
  /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
rho));
   }


(BTW, this was detected in a long Rcpp-devel thread. See 
http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)

Romain

--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/fT2rZM : highlight 0.2-5
|- http://bit.ly/gpCSpH : Evolution of Rcpp code size
`- http://bit.ly/hovakS : RcppGSL initial release

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel




__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



--
Luke Tierney
Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa  Phone: 319-335-3386
Department of Statistics andFax:   319-335-3017
   Actuarial Science
241 Schaeffer Hall  email:  l...@stat.uiowa.edu
Iowa City, IA 52242 WWW:  http://www.stat.uiowa.edu__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] as.environment.list provides inconsistent results under torture

2011-01-11 Thread Simon Urbanek

On Jan 11, 2011, at 6:55 PM, luke-tier...@uiowa.edu luke-tier...@uiowa.edu 
wrote:

 No. Lots of internal functions expect their callers to protect their 
 arguments, for efficiency reasons. eval is called very often and almost 
 always with argument that are protected because they are in the evaluation 
 engine, so it would be wasteful and potentially very costly if eval protected 
 its arguments every time it is called. (I don't tknow what the cost would be 
 to do so in the current implementation but it could be prohibitive if we 
 moved to some different approaches, so for now we whould continue to expect 
 callers of eval to make sure the argumetns are protected.)
 


Fair enough. It would be nice if this was explicitly documented since eval() is 
part of the API and I see several packages on CRAN using eval(LCONS(..),..) and 
eval(listX(...),...) - and I don't blame them (partly because one of them is 
mine ;)). Unfortunately all the examples in R-ext use implicitly protected 
arguments (as function arguments or parts of larger already protected 
constructs) so it's not obvious from that, either.

Thanks,
Simon




 
 
 On Tue, 11 Jan 2011, Simon Urbanek wrote:
 
 Interesting, I'd argue that the bug is in eval() not protecting its 
 arguments since the usual convention is for functions to protect its 
 arguments...
 
 On Jan 11, 2011, at 2:33 PM, Romain Francois wrote:
 
 Hello,
 
 Using R-devel (rev 53950), I get inconsistent results with as.environment( 
 VECSXP ) when gctorture is on.
 
 Consider:
 
 a - list( aa = rnorm, bb = runif )
 gctorture(TRUE)
 as.environment( a )
 
 The last line sometimes produces the correct environment, but sometimes I 
 get errors. Here are the three situations:
 
 # good
 as.environment( a )
 environment: 0x100b1c978
 
 # not good
 as.environment( a )
 Erreur dans length(x) : 'x' est manquant
 
 # not good either
 as.environment( a )
 Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
 correspondance partielle de chaînes de caractères incorrecte
 
 
 Is it because the call made by lang4 is not protected while evaluated in 
 this line :
 
   case VECSXP: {
 /* implement as.environment.list() {isObject(.) is false for a list} */
 return(eval(lang4(install(list2env), arg,
   /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
 rho));
   }
 
 
 (BTW, this was detected in a long Rcpp-devel thread. See 
 http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)
 
 Romain
 
 --
 Romain Francois
 Professional R Enthusiast
 +33(0) 6 28 91 30 30
 http://romainfrancois.blog.free.fr
 |- http://bit.ly/fT2rZM : highlight 0.2-5
 |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
 `- http://bit.ly/hovakS : RcppGSL initial release
 
 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel
 
 
 
 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel
 
 
 -- 
 Luke Tierney
 Statistics and Actuarial Science
 Ralph E. Wareham Professor of Mathematical Sciences
 University of Iowa  Phone: 319-335-3386
 Department of Statistics andFax:   319-335-3017
   Actuarial Science
 241 Schaeffer Hall  email:  l...@stat.uiowa.edu
 Iowa City, IA 52242 WWW:  http://www.stat.uiowa.edu

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel