about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorLuqman Aden <laden@csclub.uwaterloo.ca>2013-10-25 01:56:34 -0400
committerLuqman Aden <laden@csclub.uwaterloo.ca>2013-11-04 23:53:11 -0500
commitc669ccf3d30da3eb505832d0872bf03607eb98eb (patch)
tree274c13139ca8e1dfdf7934317c2c7b8be1267931 /src/libstd
parent658637baf45b41e4cff049440bc07f267d810218 (diff)
downloadrust-c669ccf3d30da3eb505832d0872bf03607eb98eb.tar.gz
rust-c669ccf3d30da3eb505832d0872bf03607eb98eb.zip
libsyntax/librustc: Allow calling variadic foreign functions.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/reflect.rs7
-rw-r--r--src/libstd/repr.rs15
-rw-r--r--src/libstd/unstable/intrinsics.rs3
3 files changed, 25 insertions, 0 deletions
diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs
index 19fa9abc0da..c841750d7ce 100644
--- a/src/libstd/reflect.rs
+++ b/src/libstd/reflect.rs
@@ -382,11 +382,18 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
         true
     }
 
+    #[cfg(stage0)]
     fn visit_fn_output(&mut self, retstyle: uint, inner: *TyDesc) -> bool {
         if ! self.inner.visit_fn_output(retstyle, inner) { return false; }
         true
     }
 
+    #[cfg(not(stage0))]
+    fn visit_fn_output(&mut self, retstyle: uint, variadic: bool, inner: *TyDesc) -> bool {
+        if ! self.inner.visit_fn_output(retstyle, variadic, inner) { return false; }
+        true
+    }
+
     fn visit_leave_fn(&mut self, purity: uint, proto: uint,
                       n_inputs: uint, retstyle: uint) -> bool {
         if ! self.inner.visit_leave_fn(purity, proto, n_inputs, retstyle) {
diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs
index dd68c57e37e..97b42a1ebc1 100644
--- a/src/libstd/repr.rs
+++ b/src/libstd/repr.rs
@@ -572,6 +572,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> {
         true
     }
 
+    #[cfg(stage0)]
     fn visit_fn_output(&mut self, _retstyle: uint, inner: *TyDesc) -> bool {
         self.writer.write(")".as_bytes());
         let name = unsafe { (*inner).name };
@@ -582,6 +583,20 @@ impl<'self> TyVisitor for ReprVisitor<'self> {
         true
     }
 
+    #[cfg(not(stage0))]
+    fn visit_fn_output(&mut self, _retstyle: uint, variadic: bool, inner: *TyDesc) -> bool {
+        if variadic {
+            self.writer.write(", ...".as_bytes());
+        }
+        self.writer.write(")".as_bytes());
+        let name = unsafe { (*inner).name };
+        if name != "()" {
+            self.writer.write(" -> ".as_bytes());
+            self.writer.write(name.as_bytes());
+        }
+        true
+    }
+
     fn visit_leave_fn(&mut self, _purity: uint, _proto: uint,
                       _n_inputs: uint, _retstyle: uint) -> bool { true }
 
diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs
index c086e13d740..5189fdce115 100644
--- a/src/libstd/unstable/intrinsics.rs
+++ b/src/libstd/unstable/intrinsics.rs
@@ -160,7 +160,10 @@ pub trait TyVisitor {
     fn visit_enter_fn(&mut self, purity: uint, proto: uint,
                       n_inputs: uint, retstyle: uint) -> bool;
     fn visit_fn_input(&mut self, i: uint, mode: uint, inner: *TyDesc) -> bool;
+    #[cfg(stage0)]
     fn visit_fn_output(&mut self, retstyle: uint, inner: *TyDesc) -> bool;
+    #[cfg(not(stage0))]
+    fn visit_fn_output(&mut self, retstyle: uint, variadic: bool, inner: *TyDesc) -> bool;
     fn visit_leave_fn(&mut self, purity: uint, proto: uint,
                       n_inputs: uint, retstyle: uint) -> bool;