Construct new strings through upcalls.
This commit is contained in:
parent
21be1379d5
commit
28a0e9c999
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)),
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user