about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/lib/comm.rs10
-rw-r--r--src/rt/intrinsics/intrinsics.cpp2
-rw-r--r--src/rt/intrinsics/intrinsics.ll.in5
-rw-r--r--src/test/stdtest/comm.rs7
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