Fix rust_vec constructor assertion failure caused by slow path of upcall_vec_grow. Add testcase.
This commit is contained in:
@@ -381,7 +381,7 @@ upcall_vec_grow(rust_task *task, rust_vec *v, size_t n_bytes, uintptr_t is_gc)
|
|||||||
LOG_UPCALL_ENTRY(task);
|
LOG_UPCALL_ENTRY(task);
|
||||||
rust_dom *dom = task->dom;
|
rust_dom *dom = task->dom;
|
||||||
task->log(rust_log::UPCALL|rust_log::MEM,
|
task->log(rust_log::UPCALL|rust_log::MEM,
|
||||||
"upcall vec_grow(%" PRIxPTR ", %" PRIdPTR
|
"upcall vec_grow(0x%" PRIxPTR ", %" PRIdPTR
|
||||||
"), alloc=%" PRIdPTR ", fill=%" PRIdPTR,
|
"), alloc=%" PRIdPTR ", fill=%" PRIdPTR,
|
||||||
v, n_bytes, v->alloc, v->fill);
|
v, n_bytes, v->alloc, v->fill);
|
||||||
size_t alloc = next_power_of_two(sizeof(rust_vec) + v->fill + n_bytes);
|
size_t alloc = next_power_of_two(sizeof(rust_vec) + v->fill + n_bytes);
|
||||||
@@ -411,7 +411,8 @@ upcall_vec_grow(rust_task *task, rust_vec *v, size_t n_bytes, uintptr_t is_gc)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
v->deref();
|
v->deref();
|
||||||
v = new (mem) rust_vec(dom, alloc, v->fill, &v->data[0]);
|
v = new (mem) rust_vec(dom, alloc, v->fill,
|
||||||
|
v->fill ? &v->data[0] : NULL);
|
||||||
}
|
}
|
||||||
I(dom, sizeof(rust_vec) + v->fill <= v->alloc);
|
I(dom, sizeof(rust_vec) + v->fill <= v->alloc);
|
||||||
return v;
|
return v;
|
||||||
|
|||||||
@@ -1,10 +1,25 @@
|
|||||||
// -*- rust -*-
|
// -*- rust -*-
|
||||||
|
|
||||||
fn main() {
|
fn fast_growth() {
|
||||||
let vec[int] v = vec(1,2,3,4,5);
|
let vec[int] v = vec(1,2,3,4,5);
|
||||||
v += vec(6,7,8,9,0);
|
v += vec(6,7,8,9,0);
|
||||||
|
|
||||||
log v.(9);
|
log v.(9);
|
||||||
check(v.(0) == 1);
|
check(v.(0) == 1);
|
||||||
check(v.(7) == 8);
|
check(v.(7) == 8);
|
||||||
check(v.(9) == 0);
|
check(v.(9) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn slow_growth() {
|
||||||
|
let vec[int] v = vec();
|
||||||
|
let vec[int] u = v;
|
||||||
|
v += vec(17);
|
||||||
|
|
||||||
|
log v.(0);
|
||||||
|
check (v.(0) == 17);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
fast_growth();
|
||||||
|
slow_growth();
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user