[Rcpp-devel] Rcpp::exception + threads = disaster

Joshua N Pritikin jpritikin at pobox.com
Sat Feb 8 23:07:05 CET 2020

On Sat, Feb 08, 2020 at 01:44:51PM -0800, Kevin Ushey wrote:
> On Sat, Feb 8, 2020 at 12:52 PM Joshua N Pritikin <jpritikin at pobox.com> wrote:
> > If I'm reading it correctly, rcpp_set_stack_trace(Shield<SEXP>(stack_trace()))
> > will work equally well in either location. R can't introspect about
> > the C++ stack; It must be saving the R call stack.
> This is incorrect; Rcpp is trying to save the C++ call stack:
> https://github.com/RcppCore/Rcpp/blob/f9425eef20f483001105733bc379b76e9f323aff/src/api.cpp#L283-L319

Whoa, that's pretty cool :-)

> In theory, we might be able to avoid the creation of an intermediate R
> object when the exception is constructed -- patches are welcome.

Yeah, you just need to delay the part where you copy it to R,

 List trace = List::create(_["file" ] = file,
                                      _["line" ] = line,
                                      _["stack"] = res);
 trace.attr("class") = "Rcpp_stack_trace";

I'll code something up.

> I'm not sure why this data is stored within the R session rather than e.g. 
> as part of the exception object itself, but generally these sorts of 
> decisions are made for good reasons (e.g. complications with cross-module 
> exceptions).

The details of the R side are irrelevant. You can store the stack trace in
C++ STL containers and move it to R after the throw.

> As an aside, you could just use tfm::format() (bundled by Rcpp and
> used by stop() and friends) to build your formatted strings and then
> throw a regular C++ exception.

I know, but I'm trying to smooth the road for future developers.
Maybe I invest too much time and effort into altruism?

More information about the Rcpp-devel mailing list