Construct new strings through upcalls.

This commit is contained in:
Graydon Hoare 2012-04-02 17:37:59 -07:00
parent 21be1379d5
commit 28a0e9c999
4 changed files with 29 additions and 8 deletions

View File

@ -291,6 +291,27 @@ upcall_shared_realloc(void *ptr, size_t size) {
/**********************************************************************/
struct s_str_new_args {
const char *cstr;
size_t len;
rust_str *retval;
};
extern "C" CDECL void
upcall_s_str_new(s_str_new_args *args) {
rust_task *task = rust_get_current_task();
LOG_UPCALL_ENTRY(task);
args->retval = make_str(task->kernel, args->cstr, args->len, "str_new");
}
extern "C" CDECL rust_str*
upcall_str_new(const char *cstr, size_t len) {
s_str_new_args args = { cstr, len, 0 };
UPCALL_SWITCH_STACK(&args, upcall_s_str_new);
return args.retval;
}
struct s_vec_grow_args {
rust_vec** vp;
size_t new_sz;

View File

@ -69,6 +69,7 @@ upcall_shared_malloc
upcall_shared_free
upcall_shared_realloc
upcall_vec_grow
upcall_str_new
upcall_str_concat
upcall_call_shim_on_c_stack
upcall_call_shim_on_rust_stack

View File

@ -17,6 +17,7 @@ type upcalls =
shared_realloc: ValueRef,
mark: ValueRef,
vec_grow: ValueRef,
str_new: ValueRef,
str_concat: ValueRef,
cmp_type: ValueRef,
log_type: ValueRef,
@ -64,6 +65,8 @@ fn declare_upcalls(targ_cfg: @session::config,
d("mark", [T_ptr(T_i8())], int_t),
vec_grow:
dv("vec_grow", [T_ptr(T_ptr(opaque_vec_t)), int_t]),
str_new:
d("str_new", [T_ptr(T_i8()), int_t], T_ptr(opaque_vec_t)),
str_concat:
d("str_concat", [T_ptr(opaque_vec_t), T_ptr(opaque_vec_t)],
T_ptr(opaque_vec_t)),

View File

@ -131,15 +131,11 @@ fn trans_vec(bcx: block, args: [@ast::expr], id: ast::node_id,
fn trans_str(bcx: block, s: str, dest: dest) -> block {
let _icx = bcx.insn_ctxt("tvec::trans_str");
let veclen = str::len(s) + 1u; // +1 for \0
let {bcx: bcx, val: sptr, _} =
alloc(bcx, ty::mk_str(bcx.tcx()), veclen);
let ccx = bcx.ccx();
let llcstr = C_cstr(ccx, s);
call_memmove(bcx, get_dataptr(bcx, sptr, T_i8()), llcstr,
C_uint(ccx, veclen));
ret base::store_in_dest(bcx, sptr, dest);
let cs = PointerCast(bcx, C_cstr(ccx, s), T_ptr(T_i8()));
let len = C_uint(ccx, str::len(s));
let n = Call(bcx, ccx.upcalls.str_new, [cs, len]);
ret base::store_in_dest(bcx, n, dest);
}
fn trans_append(bcx: block, vec_ty: ty::t, lhsptr: ValueRef,