Skip to content

Commit

Permalink
Construct new strings through upcalls.
Browse files Browse the repository at this point in the history
  • Loading branch information
graydon committed Apr 3, 2012
1 parent 21be137 commit 28a0e9c
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 8 deletions.
21 changes: 21 additions & 0 deletions src/rt/rust_upcall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/rt/rustrt.def.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/rustc/back/upcall.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)),
Expand Down
12 changes: 4 additions & 8 deletions src/rustc/middle/trans/tvec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 28a0e9c

Please sign in to comment.