@@ -80,16 +80,19 @@ namespace Rcpp{
80
80
81
81
// for plain dense objects
82
82
template <typename T>
83
- SEXP eigen_wrap_plain_dense ( const T& obj, Rcpp::traits::true_type ){
84
- typename Eigen::internal::conditional<T::IsRowMajor,
85
- Eigen::Matrix<typename T::Scalar,
86
- T::RowsAtCompileTime,
87
- T::ColsAtCompileTime>,
88
- const T&>::type objCopy (obj);
89
- int m = obj.rows (), n = obj.cols ();
90
- R_xlen_t size = static_cast <R_xlen_t>(m) * n;
91
- SEXP ans = PROTECT (::Rcpp::wrap (objCopy.data (), objCopy.data () + size));
92
- if ( T::ColsAtCompileTime != 1 ) {
83
+ SEXP eigen_wrap_plain_dense ( const T& obj, Rcpp::traits::true_type ) {
84
+ typename Eigen::internal::conditional<
85
+ T::IsRowMajor,
86
+ Eigen::Matrix<typename T::Scalar,
87
+ T::RowsAtCompileTime,
88
+ T::ColsAtCompileTime>,
89
+ const T&>::type objCopy (obj);
90
+ R_xlen_t m = obj.rows (), n = obj.cols (), size = m * n;
91
+ SEXP ans = PROTECT (::Rcpp::wrap (objCopy.data (), objCopy.data () + size));
92
+ if ( T::ColsAtCompileTime != 1 ) {
93
+ if (m > INT_MAX || n > INT_MAX) {
94
+ throw std::runtime_error (" array dimensions cannot exceed INT_MAX" );
95
+ }
93
96
SEXP dd = PROTECT (::Rf_allocVector (INTSXP, 2 ));
94
97
int *d = INTEGER (dd);
95
98
d[0 ] = m;
0 commit comments