about summary refs log tree commit diff
path: root/src/libstd/sys/common
diff options
context:
space:
mode:
authorTobias Bucher <tobiasbucher5991@gmail.com>2016-06-04 20:09:19 +0200
committerTobias Bucher <tobiasbucher5991@gmail.com>2016-06-29 11:39:56 +0200
commita03a82e5e0ae59b0c0b11b671e058fda9f7bb3d0 (patch)
treea986dcf5b6a79d2013a078159e4d2ac0a358d610 /src/libstd/sys/common
parentd6237cefcb9fae0286a920b182e9bbc928a57c8a (diff)
downloadrust-a03a82e5e0ae59b0c0b11b671e058fda9f7bb3d0.tar.gz
rust-a03a82e5e0ae59b0c0b11b671e058fda9f7bb3d0.zip
Convert a simple tail call to a loop
Diffstat (limited to 'src/libstd/sys/common')
-rw-r--r--src/libstd/sys/common/net.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/libstd/sys/common/net.rs b/src/libstd/sys/common/net.rs
index 3e2a0a8f39a..274e495d70e 100644
--- a/src/libstd/sys/common/net.rs
+++ b/src/libstd/sys/common/net.rs
@@ -121,16 +121,20 @@ pub struct LookupHost {
 impl Iterator for LookupHost {
     type Item = SocketAddr;
     fn next(&mut self) -> Option<SocketAddr> {
-        let result;
-        unsafe {
-            if self.cur.is_null() { return None }
-            result = sockaddr_to_addr(mem::transmute((*self.cur).ai_addr),
-                                      (*self.cur).ai_addrlen as usize).ok();
-            self.cur = (*self.cur).ai_next as *mut c::addrinfo;
-        }
-        match result {
-            Some(r) => Some(r),
-            None => self.next(),
+        loop {
+            unsafe {
+                let cur = match self.cur.as_ref() {
+                    None => return None,
+                    Some(c) => c,
+                };
+                self.cur = cur.ai_next;
+                match sockaddr_to_addr(mem::transmute(cur.ai_addr),
+                                       cur.ai_addrlen as usize)
+                {
+                    Ok(addr) => return Some(addr),
+                    Err(_) => continue,
+                }
+            }
         }
     }
 }