@@ -1151,36 +1151,62 @@ fn type_is_signed(&ctxt cx, &t ty) -> bool {
1151
1151
}
1152
1152
1153
1153
fn type_owns_heap_mem( & ctxt cx, & t ty) -> bool {
1154
+ auto result = false;
1154
1155
alt ( struct ( cx, ty) ) {
1155
- case ( ty_ivec( _) ) { ret true; }
1156
- case ( ty_istr) { ret true; }
1156
+ case ( ty_ivec( _) ) { result = true; }
1157
+ case ( ty_istr) { result = true; }
1157
1158
1158
- case ( ty_nil) { ret false; }
1159
- case ( ty_bot) { ret false; }
1160
- case ( ty_bool) { ret false; }
1161
- case ( ty_int) { ret false; }
1162
- case ( ty_float) { ret false; }
1163
- case ( ty_uint) { ret false; }
1164
- case ( ty_machine( _) ) { ret false; }
1165
- case ( ty_char) { ret false; }
1166
- case ( ty_str) { ret false; }
1167
- case ( ty_tag( _, _) ) { ret false; }
1168
- case ( ty_box( _) ) { ret false; }
1169
- case ( ty_vec( _) ) { ret false; }
1170
- case ( ty_ptr( _) ) { ret false; }
1171
- case ( ty_port( _) ) { ret false; }
1172
- case ( ty_chan( _) ) { ret false; }
1173
- case ( ty_task) { ret false; }
1174
- case ( ty_tup( _) ) { ret false; }
1175
- case ( ty_rec( _) ) { ret false; }
1176
- case ( ty_fn( _, _, _, _, _) ) { ret false; }
1177
- case ( ty_native_fn( _, _, _) ) { ret false; }
1178
- case ( ty_obj( _) ) { ret false; }
1159
+ // scalar types
1160
+ case ( ty_nil) { result = false; }
1161
+ case ( ty_bot) { result = false; }
1162
+ case ( ty_bool) { result = false; }
1163
+ case ( ty_int) { result = false; }
1164
+ case ( ty_float) { result = false; }
1165
+ case ( ty_uint) { result = false; }
1166
+ case ( ty_machine( _) ) { result = false; }
1167
+ case ( ty_char) { result = false; }
1168
+ case ( ty_type) { result = false; }
1169
+ case ( ty_native) { result = false; }
1170
+
1171
+ // boxed types
1172
+ case ( ty_str) { result = false; }
1173
+ case ( ty_box( _) ) { result = false; }
1174
+ case ( ty_vec( _) ) { result = false; }
1175
+ case ( ty_fn( _, _, _, _, _) ) { result = false; }
1176
+ case ( ty_native_fn( _, _, _) ) { result = false; }
1177
+ case ( ty_obj( _) ) { result = false; }
1178
+
1179
+ // structural types
1180
+ case ( ty_tag( ?did, ?tps) ) {
1181
+ auto variants = tag_variants( cx, did) ;
1182
+ for ( variant_info variant in variants) {
1183
+ auto tup_ty = mk_imm_tup( cx, variant. args) ;
1184
+ // Perform any type parameter substitutions.
1185
+ tup_ty = substitute_type_params( cx, tps, tup_ty) ;
1186
+ if ( type_owns_heap_mem( cx, tup_ty) ) { result = true; }
1187
+ }
1188
+ }
1189
+ case ( ty_tup( ?elts) ) {
1190
+ for ( mt m in elts) {
1191
+ if ( type_owns_heap_mem( cx, m. ty) ) { result = true; }
1192
+ }
1193
+ }
1194
+ case ( ty_rec( ?flds) ) {
1195
+ for ( field f in flds) {
1196
+ if ( type_owns_heap_mem( cx, f. mt. ty) ) { result = true; }
1197
+ }
1198
+ }
1199
+
1200
+ case ( ty_ptr( _) ) { result = false; }
1201
+ case ( ty_port( _) ) { result = false; }
1202
+ case ( ty_chan( _) ) { result = false; }
1203
+ case ( ty_task) { result = false; }
1204
+ case ( ty_tup( _) ) { result = false; }
1205
+ case ( ty_rec( _) ) { result = false; }
1179
1206
case ( ty_var( _) ) { fail "ty_var in type_owns_heap_mem"; }
1180
- case ( ty_param( _) ) { ret false; }
1181
- case ( ty_type) { ret false; }
1182
- case ( ty_native) { ret false; }
1207
+ case ( ty_param( _) ) { result = false; }
1183
1208
}
1209
+ ret result;
1184
1210
}
1185
1211
1186
1212
fn type_param( & ctxt cx, & t ty) -> option:: t[ uint] {
0 commit comments