Skip to content

Commit f641dce

Browse files
committed
Get evec slices and unique-evec slice-borrowing working.
1 parent b0074c5 commit f641dce

File tree

5 files changed

+36
-5
lines changed

5 files changed

+36
-5
lines changed

src/rustc/middle/trans/tvec.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ fn trans_evec(bcx: block, args: [@ast::expr],
102102
let vec_ty = node_id_type(bcx, id);
103103
let unit_ty = ty::sequence_element_type(bcx.tcx(), vec_ty);
104104
let llunitty = type_of::type_of(ccx, unit_ty);
105+
let unit_sz = llsize_of(ccx, llunitty);
105106

106107
let mut {bcx, val, dataptr} =
107108
alt vst {
@@ -122,8 +123,14 @@ fn trans_evec(bcx: block, args: [@ast::expr],
122123
let n = vec::len(args);
123124
let n = C_uint(ccx, n);
124125
let vp = base::arrayalloca(bcx, llunitty, n);
125-
let v = C_struct([vp, n]);
126-
{bcx: bcx, val: v, dataptr: vp}
126+
let len = Mul(bcx, n, unit_sz);
127+
128+
let p = base::alloca(bcx, T_struct([T_ptr(llunitty),
129+
ccx.int_type]));
130+
Store(bcx, vp, GEPi(bcx, p, [0, abi::slice_elt_base]));
131+
Store(bcx, len, GEPi(bcx, p, [0, abi::slice_elt_len]));
132+
133+
{bcx: bcx, val: p, dataptr: vp}
127134
}
128135
ast::vstore_uniq {
129136
let {bcx, val} = alloc_uniq(bcx, llunitty, args.len());
@@ -157,6 +164,9 @@ fn trans_evec(bcx: block, args: [@ast::expr],
157164
// We wrote into the destination in the fixed case.
158165
ret bcx;
159166
}
167+
ast::vstore_slice(_) {
168+
ret base::store_in_dest(bcx, Load(bcx, val), dest);
169+
}
160170
_ {
161171
ret base::store_in_dest(bcx, val, dest);
162172
}

src/test/run-pass/evec-slice.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fn main() {
2+
let x : [int]/& = [1,2,3,4,5]/&;
3+
let mut z = [1,2,3,4,5]/&;
4+
z = x;
5+
assert z[0] == 1;
6+
assert z[4] == 5;
7+
}

src/test/run-pass/regions-borrow-estr-uniq.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@ fn main() {
66
let p = "hello"/~;
77
let r = foo(p);
88
assert r == 'h' as u8;
9+
10+
let p = "hello";
11+
let r = foo(p);
12+
assert r == 'h' as u8;
913
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fn foo(x: [int]/&) -> int {
2+
x[0]
3+
}
4+
5+
fn main() {
6+
let p = [1,2,3,4,5]/~;
7+
let r = foo(p);
8+
assert r == 1;
9+
10+
let p = [5,4,3,2,1];
11+
let r = foo(p);
12+
assert r == 5;
13+
}

src/test/run-pass/vec-concat.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
2-
3-
41
// -*- rust -*-
52
fn main() {
63
let a: [int] = [1, 2, 3, 4, 5];

0 commit comments

Comments
 (0)