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 <jpriti...@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?
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to