From a88af906c594f56709ff8e31db1148a08cd52996 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Tue, 24 May 2011 12:18:42 -0700 Subject: [PATCH] Programs using spawn terminate --- src/comp/middle/trans.rs | 16 ++++++++++++++++ src/comp/middle/ty.rs | 1 + src/test/run-pass/spawn.rs | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 1790ef553f3..723fd1c2714 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -760,6 +760,9 @@ fn type_of_inner(&@crate_ctxt cx, &ast::span sp, &ty::t t) -> TypeRef { case (ty::ty_chan(?t)) { llty = T_ptr(T_chan(type_of_inner(cx, sp, t))); } + case (ty::ty_task) { + llty = T_taskptr(cx.tn); + } case (ty::ty_tup(?elts)) { let vec[TypeRef] tys = []; for (ty::mt elt in elts) { @@ -2014,6 +2017,11 @@ fn make_free_glue(&@block_ctxt cx, ValueRef v0, &ty::t t) { rslt = res(cx, C_int(0)); } + case (ty::ty_task) { + // TODO: call upcall_kill + rslt = res(cx, C_nil()); + } + case (ty::ty_obj(_)) { auto box_cell = @@ -2107,6 +2115,10 @@ fn make_drop_glue(&@block_ctxt cx, ValueRef v0, &ty::t t) { rslt = decr_refcnt_maybe_free(cx, v0, v0, t); } + case (ty::ty_task) { + rslt = decr_refcnt_maybe_free(cx, v0, v0, t); + } + case (ty::ty_obj(_)) { auto box_cell = cx.build.GEP(v0, @@ -5984,6 +5996,10 @@ fn trans_spawn(&@block_ctxt cx, } */ + auto task_ty = node_ann_type(bcx.fcx.lcx.ccx, ann); + auto dropref = clean(bind drop_ty(_, new_task, task_ty)); + find_scope_cx(bcx).cleanups += [dropref]; + ret res(bcx, new_task); } diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 508b2d90a63..3d12d16d528 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -951,6 +951,7 @@ fn type_is_boxed(&ctxt cx, &t ty) -> bool { case (ty_box(_)) { ret true; } case (ty_port(_)) { ret true; } case (ty_chan(_)) { ret true; } + case (ty_task) { ret true; } case (_) { ret false; } } fail; diff --git a/src/test/run-pass/spawn.rs b/src/test/run-pass/spawn.rs index c6a3ba4bcff..bf4c9325d39 100644 --- a/src/test/run-pass/spawn.rs +++ b/src/test/run-pass/spawn.rs @@ -4,7 +4,7 @@ // -*- rust -*- fn main() { - spawn child(10); + auto t = spawn child(10); } fn child(int i) {