@@ -28,7 +28,7 @@ namespace Rcpp{
2828
2929 class exception : public std ::exception {
3030 public:
31- explicit exception (const char * message_) : message(message_){}
31+ explicit exception (const char * message_) : message(message_){ rcpp_set_stack_trace ( stack_trace ()); }
3232 exception (const char * message_, const char * file, int line ) : message(message_){
3333 rcpp_set_stack_trace ( stack_trace (file,line) ) ;
3434 }
@@ -127,17 +127,17 @@ namespace Rcpp{
127127} // namespace Rcpp
128128
129129inline SEXP get_last_call (){
130- SEXP sys_calls_symbol = Rf_install ( " sys.calls" ) ;
131- Rcpp::Shield<SEXP> sys_calls_expr ( Rf_lang1 (sys_calls_symbol) );
130+ SEXP sys_calls_symbol = Rf_install ( " sys.call" ) ;
131+
132+ // -9 Skips the wrapped tryCatch from Rcpp_eval
133+ Rcpp::Shield<SEXP> sys_calls_expr ( Rf_lang2 (sys_calls_symbol, Rf_ScalarInteger (-9 )) );
132134 Rcpp::Shield<SEXP> calls ( Rcpp_eval ( sys_calls_expr, R_GlobalEnv ) );
133- SEXP res = calls ;
134- while ( !Rf_isNull (CDR (res)) ) res = CDR (res);
135- return CAR (res) ;
135+ return calls;
136136}
137137
138138inline SEXP get_exception_classes ( const std::string& ex_class) {
139139 Rcpp::Shield<SEXP> res ( Rf_allocVector ( STRSXP, 4 ) );
140-
140+
141141 #ifndef RCPP_USING_UTF8_ERROR_STRING
142142 SET_STRING_ELT ( res, 0 , Rf_mkChar ( ex_class.c_str () ) ) ;
143143 #else
@@ -184,7 +184,7 @@ inline SEXP exception_to_r_condition( const std::exception& ex){
184184
185185inline SEXP string_to_try_error ( const std::string& str){
186186 using namespace Rcpp ;
187-
187+
188188 #ifndef RCPP_USING_UTF8_ERROR_STRING
189189 Rcpp::Shield<SEXP> simpleErrorExpr ( Rf_lang2 (::Rf_install (" simpleError" ), Rf_mkString (str.c_str ())) );
190190 Rcpp::Shield<SEXP> tryError ( Rf_mkString ( str.c_str () ) );
@@ -193,7 +193,7 @@ inline SEXP string_to_try_error( const std::string& str){
193193 SET_STRING_ELT ( tryError, 0 , Rf_mkCharLenCE ( str.c_str (), str.size (), CE_UTF8 ) );
194194 Rcpp::Shield<SEXP> simpleErrorExpr ( Rf_lang2 (::Rf_install (" simpleError" ), tryError ));
195195 #endif
196-
196+
197197 Rcpp::Shield<SEXP> simpleError ( Rf_eval (simpleErrorExpr, R_GlobalEnv) );
198198 Rf_setAttrib ( tryError, R_ClassSymbol, Rf_mkString (" try-error" ) ) ;
199199 Rf_setAttrib ( tryError, Rf_install ( " condition" ) , simpleError ) ;
@@ -267,52 +267,52 @@ namespace Rcpp{
267267 inline void NORET stop (const std::string& message) {
268268 throw Rcpp::exception (message.c_str ());
269269 }
270-
270+
271271 template <typename T1>
272272 inline void NORET stop (const char * fmt, const T1& arg1) {
273273 throw Rcpp::exception ( tfm::format (fmt, arg1 ).c_str () );
274274 }
275-
275+
276276 template <typename T1, typename T2>
277277 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2) {
278278 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2 ).c_str () );
279279 }
280-
280+
281281 template <typename T1, typename T2, typename T3>
282282 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3) {
283283 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3).c_str () );
284284 }
285-
285+
286286 template <typename T1, typename T2, typename T3, typename T4>
287287 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4) {
288288 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4).c_str () );
289289 }
290-
290+
291291 template <typename T1, typename T2, typename T3, typename T4, typename T5>
292292 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5) {
293293 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5).c_str () );
294294 }
295-
295+
296296 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
297297 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5, const T6& arg6) {
298298 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5, arg6).c_str () );
299299 }
300-
300+
301301 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
302302 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5, const T6& arg6, const T7& arg7) {
303303 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7).c_str () );
304304 }
305-
305+
306306 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
307307 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5, const T6& arg6, const T7& arg7, const T8& arg8) {
308308 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8).c_str () );
309309 }
310-
310+
311311 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
312312 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5, const T6& arg6, const T7& arg7, const T8& arg8, const T9& arg9) {
313313 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9).c_str () );
314314 }
315-
315+
316316 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
317317 inline void NORET stop (const char * fmt, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4, const T5& arg5, const T6& arg6, const T7& arg7, const T8& arg8, const T9& arg9, const T10& arg10) {
318318 throw Rcpp::exception ( tfm::format (fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10).c_str () );
0 commit comments