@@ -1006,7 +1006,12 @@ void jl_compute_field_offsets(jl_datatype_t *st)
1006
1006
uint64_t max_size = max_offset >> 1 ;
1007
1007
1008
1008
uint32_t nfields = jl_svec_len (st -> types );
1009
- jl_fielddesc32_t * desc = (jl_fielddesc32_t * ) alloca (nfields * sizeof (jl_fielddesc32_t ));
1009
+ size_t descsz = nfields * sizeof (jl_fielddesc32_t );
1010
+ jl_fielddesc32_t * desc ;
1011
+ if (descsz < jl_page_size )
1012
+ desc = (jl_fielddesc32_t * )alloca (descsz );
1013
+ else
1014
+ desc = (jl_fielddesc32_t * )malloc (descsz );
1010
1015
int haspadding = 0 ;
1011
1016
assert (st -> name == jl_tuple_typename ||
1012
1017
st == jl_sym_type ||
@@ -1020,7 +1025,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
1020
1025
fsz = jl_datatype_size (ty );
1021
1026
// Should never happen
1022
1027
if (__unlikely (fsz > max_size ))
1023
- jl_throw ( jl_overflow_exception ) ;
1028
+ goto throw_ovf ;
1024
1029
al = ((jl_datatype_t * )ty )-> layout -> alignment ;
1025
1030
desc [i ].isptr = 0 ;
1026
1031
if (((jl_datatype_t * )ty )-> layout -> haspadding )
@@ -1046,7 +1051,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
1046
1051
desc [i ].offset = sz ;
1047
1052
desc [i ].size = fsz ;
1048
1053
if (__unlikely (max_offset - sz < fsz ))
1049
- jl_throw ( jl_overflow_exception ) ;
1054
+ goto throw_ovf ;
1050
1055
sz += fsz ;
1051
1056
}
1052
1057
if (homogeneous && lastty != NULL && jl_is_tuple_type (st )) {
@@ -1060,6 +1065,11 @@ void jl_compute_field_offsets(jl_datatype_t *st)
1060
1065
if (st -> size > sz )
1061
1066
haspadding = 1 ;
1062
1067
st -> layout = jl_get_layout (nfields , alignm , haspadding , desc );
1068
+ if (descsz >= jl_page_size ) free (desc );
1069
+ return ;
1070
+ throw_ovf :
1071
+ if (descsz >= jl_page_size ) free (desc );
1072
+ jl_throw (jl_overflow_exception );
1063
1073
}
1064
1074
1065
1075
extern int jl_boot_file_loaded ;
0 commit comments