diff options
| -rw-r--r-- | src/lib/comm.rs | 10 | ||||
| -rw-r--r-- | src/rt/intrinsics/intrinsics.cpp | 2 | ||||
| -rw-r--r-- | src/rt/intrinsics/intrinsics.ll.in | 5 | ||||
| -rw-r--r-- | src/test/stdtest/comm.rs | 7 |
4 files changed, 12 insertions, 12 deletions
diff --git a/src/lib/comm.rs b/src/lib/comm.rs index 1665626432a..35c8ad2f6ef 100644 --- a/src/lib/comm.rs +++ b/src/lib/comm.rs @@ -20,7 +20,10 @@ native "rust" mod rustrt { fn new_port(unit_sz : uint) -> *rust_port; fn del_port(po : *rust_port); fn drop_port(po : *rust_port); - fn port_recv(dp : *void, po : *rust_port); +} + +native "rust-intrinsic" mod rusti { + fn recv[T](port : *rustrt::rust_port) -> T; } resource chan_ptr(ch: *rustrt::rust_chan) { @@ -47,9 +50,8 @@ obj _port[T](raw_port : @port_ptr) { _chan(@chan_ptr(rustrt::new_chan(**raw_port))) } - fn recv_into(v : &T) { - rustrt::port_recv(unsafe::reinterpret_cast(ptr::addr_of(v)), - **raw_port); + fn recv() -> T { + ret rusti::recv(**raw_port) } } diff --git a/src/rt/intrinsics/intrinsics.cpp b/src/rt/intrinsics/intrinsics.cpp index 24f501ad0f5..266376b3b85 100644 --- a/src/rt/intrinsics/intrinsics.cpp +++ b/src/rt/intrinsics/intrinsics.cpp @@ -58,5 +58,5 @@ rust_intrinsic_addr_of(rust_task *task, void **retptr, type_desc *ty, extern "C" void rust_intrinsic_recv(rust_task *task, void **retptr, type_desc *ty, rust_port *port) { - port_recv(task, (uintptr_t*)*retptr, port); + port_recv(task, (uintptr_t*)retptr, port); } diff --git a/src/rt/intrinsics/intrinsics.ll.in b/src/rt/intrinsics/intrinsics.ll.in index 8f02e4b3d98..d7fad8412e4 100644 --- a/src/rt/intrinsics/intrinsics.ll.in +++ b/src/rt/intrinsics/intrinsics.ll.in @@ -133,10 +133,9 @@ entry: ret void } -define linkonce_odr void @rust_intrinsic_recv(%struct.rust_task* %task, i8** nocapture %retptr, %struct.type_desc* nocapture %ty, %class.rust_port* %port) { +define linkonce_odr void @rust_intrinsic_recv(%struct.rust_task* %task, i8** %retptr, %struct.type_desc* nocapture %ty, %class.rust_port* %port) { entry: - %tmp2 = load i8** %retptr, align 4, !tbaa !3 - %0 = bitcast i8* %tmp2 to i32* + %0 = bitcast i8** %retptr to i32* tail call void @port_recv(%struct.rust_task* %task, i32* %0, %class.rust_port* %port) ret void } diff --git a/src/test/stdtest/comm.rs b/src/test/stdtest/comm.rs index 706cca7ddaf..6bc212a42f7 100644 --- a/src/test/stdtest/comm.rs +++ b/src/test/stdtest/comm.rs @@ -13,8 +13,7 @@ fn send_recv() { let c = p.mk_chan(); c.send(42); - let v = 0; - p.recv_into(v); - + let v = p.recv(); + log_err v; assert(42 == v); -} +} \ No newline at end of file |
