@@ -1097,16 +1097,15 @@ impl<T: Element> PyArray<T, Ix2> {
1097
1097
/// ```
1098
1098
pub fn from_vec2 < ' py > ( py : Python < ' py > , v : & [ Vec < T > ] ) -> Result < & ' py Self , FromVecError > {
1099
1099
let len2 = v. first ( ) . map_or ( 0 , |v| v. len ( ) ) ;
1100
- for v in v {
1101
- if v. len ( ) != len2 {
1102
- return Err ( FromVecError :: new ( v. len ( ) , len2) ) ;
1103
- }
1104
- }
1105
1100
let dims = [ v. len ( ) , len2] ;
1101
+ // SAFETY: The result of `Self::new` is always safe to drop.
1106
1102
unsafe {
1107
1103
let array = Self :: new ( py, dims, false ) ;
1108
1104
let mut data_ptr = array. data ( ) ;
1109
1105
for v in v {
1106
+ if v. len ( ) != len2 {
1107
+ return Err ( FromVecError :: new ( v. len ( ) , len2) ) ;
1108
+ }
1110
1109
if T :: IS_COPY {
1111
1110
ptr:: copy_nonoverlapping ( v. as_ptr ( ) , data_ptr, len2) ;
1112
1111
data_ptr = data_ptr. add ( len2) ;
@@ -1144,25 +1143,20 @@ impl<T: Element> PyArray<T, Ix3> {
1144
1143
/// ```
1145
1144
pub fn from_vec3 < ' py > ( py : Python < ' py > , v : & [ Vec < Vec < T > > ] ) -> Result < & ' py Self , FromVecError > {
1146
1145
let len2 = v. first ( ) . map_or ( 0 , |v| v. len ( ) ) ;
1147
- for v in v {
1148
- if v. len ( ) != len2 {
1149
- return Err ( FromVecError :: new ( v. len ( ) , len2) ) ;
1150
- }
1151
- }
1152
1146
let len3 = v. first ( ) . map_or ( 0 , |v| v. first ( ) . map_or ( 0 , |v| v. len ( ) ) ) ;
1153
- for v in v {
1154
- for v in v {
1155
- if v. len ( ) != len3 {
1156
- return Err ( FromVecError :: new ( v. len ( ) , len3) ) ;
1157
- }
1158
- }
1159
- }
1160
1147
let dims = [ v. len ( ) , len2, len3] ;
1148
+ // SAFETY: The result of `Self::new` is always safe to drop.
1161
1149
unsafe {
1162
1150
let array = Self :: new ( py, dims, false ) ;
1163
1151
let mut data_ptr = array. data ( ) ;
1164
1152
for v in v {
1153
+ if v. len ( ) != len2 {
1154
+ return Err ( FromVecError :: new ( v. len ( ) , len2) ) ;
1155
+ }
1165
1156
for v in v {
1157
+ if v. len ( ) != len3 {
1158
+ return Err ( FromVecError :: new ( v. len ( ) , len3) ) ;
1159
+ }
1166
1160
if T :: IS_COPY {
1167
1161
ptr:: copy_nonoverlapping ( v. as_ptr ( ) , data_ptr, len3) ;
1168
1162
data_ptr = data_ptr. add ( len3) ;
0 commit comments