diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h index 6fc12a3a369400b7814346c72741e2a89b1b6f1b..8d35f0b38cef269d07cb41e1c2be1b172c0c87e8 100644 --- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h +++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h @@ -214,7 +214,16 @@ static int Rvsnprintf(char *buf, size_t size, const char *format, va_list ap) { void Rf_errorcall(SEXP x, const char *format, ...) { TRACE0(); - UNIMPLEMENTED; + // See also comments in Rf_error + char buf[BUFSIZE]; + va_list(ap); + va_start(ap,format); + Rvsnprintf(buf, BUFSIZE - 1, format, ap); + va_end(ap); + ((call_Rf_errorcall) callbacks[Rf_errorcall_x])(x, ensure_string(buf)); + checkExitCall(); + // Should not reach here + unimplemented("Unexpected return from Rf_errorcall, should be no return function"); } void Rf_warningcall(SEXP x, const char *format, ...) { @@ -253,7 +262,7 @@ void Rf_error(const char *format, ...) { // RError.error does quite a lot of stuff including potentially searching for R condition handlers // and, if it finds any, does not return, but throws a different exception than RError. // We definitely need to exit the FFI call and we certainly cannot return to our caller. - char buf[8192]; + char buf[BUFSIZE]; va_list(ap); va_start(ap,format); Rvsnprintf(buf, BUFSIZE - 1, format, ap); diff --git a/com.oracle.truffle.r.native/version.source b/com.oracle.truffle.r.native/version.source index 21e72e8ac3d7e23bd6532b5f1f4a6bdf8362e6cf..95f9650f0151d7c0d3aecf40355d88effbd5b7a7 100644 --- a/com.oracle.truffle.r.native/version.source +++ b/com.oracle.truffle.r.native/version.source @@ -1 +1 @@ -48 +49