Skip to content

Instantly share code, notes, and snippets.

@eholk
eholk / trans.rs
Created May 18, 2011 00:09
alt-block
fn trans_spawn(&ast::spawn_dom dom, &option::t[str] name,
&@ast::expr func, &vec[@ast::expr] args,
&ast::ann ann) -> result {
// Make the task name
let str tname = alt(name) {
case(none) {
auto argss = vec::map(common::expr_to_str, args);
#fmt("%s(%s)",
common::expr_to_str(func),
str::connect(argss, ", "));
@eholk
eholk / trivial-message.rs
Created May 18, 2011 18:23
Exchanging messages with yourself
fn main() {
let port[int] po = port();
let chan[int] ch = chan(po);
auto r <- po;
log_err r;
ch <| 42;
@eholk
eholk / while-dec.rs
Created May 19, 2011 23:22
Backwards while loop.
use std;
import std::vec;
fn main() {
auto v = [1, 2];
auto i = vec::len[int](v) - 1u;
while (i != 0u) {
log_err i;
log_err v.(i);
i -= 1u;
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 3009478..64a6bcb 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5562,7 +5562,7 @@ fn trans_expr(&@block_ctxt cx, &@ast::expr e) -> result {
}
case (ast::expr_spawn(?dom, ?name, ?func, ?args, ?ann)) {
- ret trans_spawn(dom, name, func, args, ann);
+ ret trans_spawn(cx, dom, name, func, args, ann);
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index db389fc..3e8447a 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5929,7 +5929,10 @@ fn trans_spawn(&@block_ctxt cx,
//
// 3. Fill the tuple with the arguments we evaluated.
//
- // 4. Pass a pointer to the spawnee function and the argument tuple to
+ // 3.5. Generate a wrapper function that takes the tuple and unpacks it to
fn mk_spawn_wrapper(&@block_ctxt cx,
&str tname,
&@ast::expr func,
&ty::t args_ty) -> result {
auto llmod = cx.fcx.lcx.ccx.llmod;
let TypeRef args_ty_tref = type_of(cx.fcx.lcx.ccx, cx.sp, args_ty);
let TypeRef wrapper_fn_type = T_fn([args_ty_tref], T_void());
log_err #fmt("wrapper args type",
ty_str(cx.fcx.lcx.ccx.tn, args_ty_tref));
fn mk_spawn_wrapper(&@block_ctxt cx,
&str tname,
&@ast::expr func,
&ty::t args_ty) -> result {
auto llmod = cx.fcx.lcx.ccx.llmod;
let TypeRef args_ty_tref = type_of(cx.fcx.lcx.ccx, cx.sp, args_ty);
//let TypeRef wrapper_fn_type = T_fn([args_ty_tref], T_void());
let TypeRef wrapper_fn_type =
type_of_fn(cx.fcx.lcx.ccx, cx.sp, ast::proto_fn,
define void @spawn_wrap(i1*, %task*, %10*, %21*) {
allocas:
br label %copy_args
copy_args: ; preds = %allocas
br label %derived_tydescs
derived_tydescs: ; preds = %copy_args
br label %4
(gdb) x /10i spawnee_fn
0x2910 <spawn_wrap>: push %ebp
0x2911 <spawn_wrap+1>: mov %esp,%ebp
0x2913 <spawn_wrap+3>: ud2a
0x2915 <spawn_wrap+5>: nopw %cs:0x0(%eax,%eax,1)
0x2920 <main>: push %ebp
0x2921 <main+1>: mov %esp,%ebp
0x2923 <main+3>: sub $0x18,%esp
0x2926 <main+6>: call 0x292b <main+11>
0x292b <main+11>: pop %eax
diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp
index 77008fd..f01ac30 100644
--- a/src/rt/rust.cpp
+++ b/src/rt/rust.cpp
@@ -93,9 +93,13 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
DLOG(dom, dom, "startup: arg[%d] = '%s'", i, args->argv[i]);
}
+ /*
uintptr_t main_args[4] = {0, 0, 0, (uintptr_t)args->args};