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.
This is not completely over though apparently. The code below still does
not support the torture.
To be continued ...
Romain
require(inline)
require(Rcpp)
inc <- '
class Randomizer {
public:
// Randomizer() : min(0), max(1){}
Randomizer( double min_, double max_) : min(min_), max(max_){}
NumericVector get( int n ){
RNGScope scope ;
return runif( n, min, max );
}
private:
double min, max ;
} ;
RCPP_MODULE(mod){
class_<Randomizer>( "Randomizer" )
// No default: .default_constructor()
.constructor<double,double>()
.method( "get" , &Randomizer::get ) ;
}
'
fx <- cxxfunction( , '', includes = inc, plugin = "Rcpp" )
mod <- Module( "mod", getDynLib( fx ) )
gctorture(TRUE)
Rcpp:::.getModulePointer( mod )
--
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
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel