Skip to content

Commit b4c0893

Browse files
committed
rustc: If needed, duplicate types' heap parts recursively through structural types
1 parent 1e7f06b commit b4c0893

File tree

2 files changed

+65
-32
lines changed

2 files changed

+65
-32
lines changed

src/comp/middle/trans.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3024,13 +3024,20 @@ fn memmove_ty(&@block_ctxt cx, ValueRef dst, ValueRef src, &ty::t t) ->
30243024
// Duplicates the heap-owned memory owned by a value of the given type.
30253025
fn duplicate_heap_parts(&@block_ctxt cx, ValueRef vptr, ty::t typ) -> result {
30263026
alt (ty::struct(cx.fcx.lcx.ccx.tcx, typ)) {
3027-
case (ty::ty_ivec(?tm)) {
3028-
ret ivec::duplicate_heap_part(cx, vptr, tm.ty);
3029-
}
3030-
case (ty::ty_str) {
3031-
ret ivec::duplicate_heap_part(cx, vptr,
3032-
ty::mk_mach(cx.fcx.lcx.ccx.tcx, common::ty_u8));
3027+
case (ty::ty_ivec(?tm)) {
3028+
ret ivec::duplicate_heap_part(cx, vptr, tm.ty);
3029+
}
3030+
case (ty::ty_istr) {
3031+
ret ivec::duplicate_heap_part(cx, vptr,
3032+
ty::mk_mach(cx.fcx.lcx.ccx.tcx, common::ty_u8));
3033+
}
3034+
case (_) { // TODO: guard
3035+
if (ty::type_is_structural(cx.fcx.lcx.ccx.tcx, typ)) {
3036+
ret iter_structural_ty(cx, vptr, typ, duplicate_heap_parts);
30333037
}
3038+
3039+
ret res(cx, C_nil());
3040+
}
30343041
}
30353042
}
30363043

src/comp/middle/ty.rs

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,36 +1151,62 @@ fn type_is_signed(&ctxt cx, &t ty) -> bool {
11511151
}
11521152

11531153
fn type_owns_heap_mem(&ctxt cx, &t ty) -> bool {
1154+
auto result = false;
11541155
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; }
11571158

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; }
11791206
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; }
11831208
}
1209+
ret result;
11841210
}
11851211

11861212
fn type_param(&ctxt cx, &t ty) -> option::t[uint] {

0 commit comments

Comments
 (0)