Skip to content

Commit fcfe9c4

Browse files
committed
---
yaml --- r: 3914 b: refs/heads/master c: e76f444 h: refs/heads/master v: v3
1 parent bb8e959 commit fcfe9c4

File tree

3 files changed

+87
-13
lines changed

3 files changed

+87
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 4038010bc658c75b8f6efa99790e611c29e84763
2+
refs/heads/master: e76f44453b00235b7a1b2154c240aedc2e24d3f6

trunk/src/comp/middle/trans.rs

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3244,7 +3244,9 @@ fn memmove_ty(&@block_ctxt cx, ValueRef dst, ValueRef src, &ty::t t) ->
32443244
if (ty::type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, t)) {
32453245
auto llsz = size_of(cx, t);
32463246
ret call_memmove(llsz.bcx, dst, src, llsz.val);
3247-
} else { ret rslt(cx, cx.build.Store(cx.build.Load(src), dst)); }
3247+
} else {
3248+
ret rslt(cx, cx.build.Store(cx.build.Load(src), dst));
3249+
}
32483250
}
32493251

32503252
// Duplicates any heap-owned memory owned by a value of the given type.
@@ -3365,7 +3367,65 @@ fn move_val_if_temp(@block_ctxt cx, copy_action action, ValueRef dst,
33653367
}
33663368
}
33673369

3368-
fn trans_lit(&@crate_ctxt cx, &ast::lit lit) -> ValueRef {
3370+
fn trans_lit_istr(&@block_ctxt cx, str s) -> result {
3371+
auto llstackpart = alloca(cx, T_ivec(T_i8()));
3372+
auto len = str::byte_len(s);
3373+
3374+
auto bcx;
3375+
if (len < 3u) { // 3 because of the \0
3376+
cx.build.Store(C_uint(len + 1u),
3377+
cx.build.InBoundsGEP(llstackpart,
3378+
~[C_int(0), C_int(0)]));
3379+
cx.build.Store(C_int(4),
3380+
cx.build.InBoundsGEP(llstackpart,
3381+
~[C_int(0), C_int(1)]));
3382+
auto i = 0u;
3383+
while (i < len) {
3384+
cx.build.Store(C_u8(s.(i) as uint),
3385+
cx.build.InBoundsGEP(llstackpart,
3386+
~[C_int(0), C_int(2),
3387+
C_uint(i)]));
3388+
i += 1u;
3389+
}
3390+
cx.build.Store(C_u8(0u),
3391+
cx.build.InBoundsGEP(llstackpart,
3392+
~[C_int(0), C_int(2),
3393+
C_uint(len)]));
3394+
3395+
bcx = cx;
3396+
} else {
3397+
auto r =
3398+
trans_shared_malloc(cx, T_ptr(T_ivec_heap_part(T_i8())),
3399+
llsize_of(T_struct(~[T_int(),
3400+
T_array(T_i8(),
3401+
len + 1u)])));
3402+
bcx = r.bcx;
3403+
auto llheappart = r.val;
3404+
3405+
bcx.build.Store(C_uint(len + 1u),
3406+
bcx.build.InBoundsGEP(llheappart,
3407+
~[C_int(0), C_int(0)]));
3408+
bcx.build.Store(llvm::LLVMConstString(str::buf(s), len, False),
3409+
bcx.build.InBoundsGEP(llheappart,
3410+
~[C_int(0), C_int(1)]));
3411+
3412+
auto llspilledstackpart = bcx.build.PointerCast(llstackpart,
3413+
T_ptr(T_ivec_heap(T_i8())));
3414+
bcx.build.Store(C_int(0),
3415+
bcx.build.InBoundsGEP(llspilledstackpart,
3416+
~[C_int(0), C_int(0)]));
3417+
bcx.build.Store(C_uint(len + 1u),
3418+
bcx.build.InBoundsGEP(llspilledstackpart,
3419+
~[C_int(0), C_int(1)]));
3420+
bcx.build.Store(llheappart,
3421+
bcx.build.InBoundsGEP(llspilledstackpart,
3422+
~[C_int(0), C_int(2)]));
3423+
}
3424+
3425+
ret rslt(bcx, llstackpart);
3426+
}
3427+
3428+
fn trans_crate_lit(&@crate_ctxt cx, &ast::lit lit) -> ValueRef {
33693429
alt (lit.node) {
33703430
case (ast::lit_int(?i)) { ret C_int(i); }
33713431
case (ast::lit_uint(?u)) { ret C_int(u as int); }
@@ -3402,7 +3462,17 @@ fn trans_lit(&@crate_ctxt cx, &ast::lit lit) -> ValueRef {
34023462
}
34033463
case (ast::lit_bool(?b)) { ret C_bool(b); }
34043464
case (ast::lit_nil) { ret C_nil(); }
3405-
case (ast::lit_str(?s, _)) { ret C_str(cx, s); }
3465+
case (ast::lit_str(?s, ast::sk_rc)) { ret C_str(cx, s); }
3466+
case (ast::lit_str(?s, ast::sk_unique)) {
3467+
cx.sess.span_unimpl(lit.span, "unique string in this context");
3468+
}
3469+
}
3470+
}
3471+
3472+
fn trans_lit(&@block_ctxt cx, &ast::lit lit) -> result {
3473+
alt (lit.node) {
3474+
ast::lit_str(?s, ast::sk_unique) { ret trans_lit_istr(cx, s); }
3475+
_ { ret rslt(cx, trans_crate_lit(cx.fcx.lcx.ccx, lit)); }
34063476
}
34073477
}
34083478

@@ -6018,9 +6088,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
60186088
result {
60196089
// FIXME Fill in cx.sp
60206090
alt (e.node) {
6021-
case (ast::expr_lit(?lit)) {
6022-
ret rslt(cx, trans_lit(cx.fcx.lcx.ccx, *lit));
6023-
}
6091+
case (ast::expr_lit(?lit)) { ret trans_lit(cx, *lit); }
60246092
case (ast::expr_unary(?op, ?x)) {
60256093
if (op != ast::deref) { ret trans_unary(cx, op, x, e.id); }
60266094
}
@@ -8484,7 +8552,7 @@ fn trans_tag_variant(@local_ctxt cx, ast::node_id tag_id,
84848552
// that does so later on?
84858553
fn trans_const_expr(&@crate_ctxt cx, @ast::expr e) -> ValueRef {
84868554
alt (e.node) {
8487-
case (ast::expr_lit(?lit)) { ret trans_lit(cx, *lit); }
8555+
case (ast::expr_lit(?lit)) { ret trans_crate_lit(cx, *lit); }
84888556
case (_) {
84898557
cx.sess.span_unimpl(e.span, "consts that's not a plain literal");
84908558
}

trunk/src/comp/middle/trans_alt.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ fn opt_eq(&opt a, &opt b) -> bool {
4141
}
4242
}
4343
}
44-
fn trans_opt(&@crate_ctxt ccx, &opt o) -> ValueRef {
44+
fn trans_opt(&@block_ctxt bcx, &opt o) -> result {
4545
alt (o) {
46-
lit(?l) { ret trans::trans_lit(ccx, *l); }
47-
var(?id, _) { ret C_int(id as int); }
46+
lit(?l) { ret trans::trans_lit(bcx, *l); }
47+
var(?id, _) { ret rslt(bcx, C_int(id as int)); }
4848
}
4949
}
5050

@@ -344,11 +344,17 @@ fn compile_submatch(@block_ctxt bcx, &match m, ValueRef[] vals, &mk_fail f,
344344
auto opt_cx = new_sub_block_ctxt(bcx, "match_case");
345345
alt (kind) {
346346
single { bcx.build.Br(opt_cx.llbb); }
347-
switch { llvm::LLVMAddCase(sw, trans_opt(ccx, opt), opt_cx.llbb);}
347+
switch {
348+
auto r = trans_opt(bcx, opt);
349+
bcx = r.bcx;
350+
llvm::LLVMAddCase(sw, r.val, opt_cx.llbb);
351+
}
348352
compare {
353+
auto r = trans_opt(bcx, opt);
354+
bcx = r.bcx;
349355
auto t = ty::node_id_to_type(ccx.tcx, pat_id);
350356
auto eq = trans::trans_compare(bcx, ast::eq, t, test_val,
351-
trans_opt(ccx, opt));
357+
r.val);
352358
bcx = new_sub_block_ctxt(bcx, "next");
353359
eq.bcx.build.CondBr(eq.val, opt_cx.llbb, bcx.llbb);
354360
}

0 commit comments

Comments
 (0)