about summary refs log tree commit diff
path: root/src/librustc
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-04-17 15:32:42 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-04-21 11:37:43 -0700
commiteeb94886adccb3f13003f92f117115d17846ce1f (patch)
tree2d729b8e48c5022941e2c06e412a2b2a1744ca1c /src/librustc
parente091ba3f3e8b2b00827ab4934314829b33ffb966 (diff)
downloadrust-eeb94886adccb3f13003f92f117115d17846ce1f.tar.gz
rust-eeb94886adccb3f13003f92f117115d17846ce1f.zip
std: Remove deprecated/unstable num functionality
This commit removes all the old casting/generic traits from `std::num` that are
no longer in use by the standard library. This additionally removes the old
`strconv` module which has not seen much use in quite a long time. All generic
functionality has been supplanted with traits in the `num` crate and the
`strconv` module is supplanted with the [rust-strconv crate][rust-strconv].

[rust-strconv]: https://github.com/lifthrasiir/rust-strconv

This is a breaking change due to the removal of these deprecated crates, and the
alternative crates are listed above.

[breaking-change]
Diffstat (limited to 'src/librustc')
-rw-r--r--src/librustc/lib.rs4
-rw-r--r--src/librustc/macros.rs46
-rw-r--r--src/librustc/metadata/common.rs64
-rw-r--r--src/librustc/metadata/cstore.rs12
-rw-r--r--src/librustc/metadata/decoder.rs7
-rw-r--r--src/librustc/middle/astencode.rs4
-rw-r--r--src/librustc/middle/const_eval.rs2
-rw-r--r--src/librustc/middle/lang_items.rs12
-rw-r--r--src/librustc/middle/ty.rs2
-rw-r--r--src/librustc/util/num.rs98
10 files changed, 202 insertions, 49 deletions
diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs
index ab5c4e76966..b65bd965976 100644
--- a/src/librustc/lib.rs
+++ b/src/librustc/lib.rs
@@ -69,6 +69,9 @@ extern crate test;
 
 pub use rustc_llvm as llvm;
 
+#[macro_use]
+mod macros;
+
 // NB: This module needs to be declared first so diagnostics are
 // registered before they are used.
 pub mod diagnostics;
@@ -142,6 +145,7 @@ pub mod util {
     pub mod ppaux;
     pub mod nodemap;
     pub mod lev_distance;
+    pub mod num;
 }
 
 pub mod lib {
diff --git a/src/librustc/macros.rs b/src/librustc/macros.rs
new file mode 100644
index 00000000000..ed764ebd9f9
--- /dev/null
+++ b/src/librustc/macros.rs
@@ -0,0 +1,46 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+macro_rules! enum_from_u32 {
+    ($(#[$attr:meta])* pub enum $name:ident {
+        $($variant:ident = $e:expr,)*
+    }) => {
+        $(#[$attr])*
+        pub enum $name {
+            $($variant = $e),*
+        }
+
+        impl $name {
+            pub fn from_u32(u: u32) -> Option<$name> {
+                $(if u == $name::$variant as u32 {
+                    return Some($name::$variant)
+                })*
+                None
+            }
+        }
+    };
+    ($(#[$attr:meta])* pub enum $name:ident {
+        $($variant:ident,)*
+    }) => {
+        $(#[$attr])*
+        pub enum $name {
+            $($variant,)*
+        }
+
+        impl $name {
+            pub fn from_u32(u: u32) -> Option<$name> {
+                $(if u == $name::$variant as u32 {
+                    return Some($name::$variant)
+                })*
+                None
+            }
+        }
+    }
+}
diff --git a/src/librustc/metadata/common.rs b/src/librustc/metadata/common.rs
index cda00847686..06a40f1dd27 100644
--- a/src/librustc/metadata/common.rs
+++ b/src/librustc/metadata/common.rs
@@ -116,37 +116,39 @@ pub const tag_items_data_item_reexport_def_id: usize = 0x47;
 pub const tag_items_data_item_reexport_name: usize = 0x48;
 
 // used to encode crate_ctxt side tables
-#[derive(Copy, Clone, PartialEq, FromPrimitive)]
-#[repr(usize)]
-pub enum astencode_tag { // Reserves 0x50 -- 0x6f
-    tag_ast = 0x50,
-
-    tag_tree = 0x51,
-
-    tag_id_range = 0x52,
-
-    tag_table = 0x53,
-    // GAP 0x54, 0x55
-    tag_table_def = 0x56,
-    tag_table_node_type = 0x57,
-    tag_table_item_subst = 0x58,
-    tag_table_freevars = 0x59,
-    tag_table_tcache = 0x5a,
-    tag_table_param_defs = 0x5b,
-    tag_table_mutbl = 0x5c,
-    tag_table_last_use = 0x5d,
-    tag_table_spill = 0x5e,
-    tag_table_method_map = 0x5f,
-    tag_table_vtable_map = 0x60,
-    tag_table_adjustments = 0x61,
-    tag_table_moves_map = 0x62,
-    tag_table_capture_map = 0x63,
-    tag_table_closure_tys = 0x64,
-    tag_table_closure_kinds = 0x65,
-    tag_table_upvar_capture_map = 0x66,
-    tag_table_capture_modes = 0x67,
-    tag_table_object_cast_map = 0x68,
-    tag_table_const_qualif = 0x69,
+enum_from_u32! {
+    #[derive(Copy, Clone, PartialEq)]
+    #[repr(usize)]
+    pub enum astencode_tag { // Reserves 0x50 -- 0x6f
+        tag_ast = 0x50,
+
+        tag_tree = 0x51,
+
+        tag_id_range = 0x52,
+
+        tag_table = 0x53,
+        // GAP 0x54, 0x55
+        tag_table_def = 0x56,
+        tag_table_node_type = 0x57,
+        tag_table_item_subst = 0x58,
+        tag_table_freevars = 0x59,
+        tag_table_tcache = 0x5a,
+        tag_table_param_defs = 0x5b,
+        tag_table_mutbl = 0x5c,
+        tag_table_last_use = 0x5d,
+        tag_table_spill = 0x5e,
+        tag_table_method_map = 0x5f,
+        tag_table_vtable_map = 0x60,
+        tag_table_adjustments = 0x61,
+        tag_table_moves_map = 0x62,
+        tag_table_capture_map = 0x63,
+        tag_table_closure_tys = 0x64,
+        tag_table_closure_kinds = 0x65,
+        tag_table_upvar_capture_map = 0x66,
+        tag_table_capture_modes = 0x67,
+        tag_table_object_cast_map = 0x68,
+        tag_table_const_qualif = 0x69,
+    }
 }
 
 pub const tag_item_trait_item_sort: usize = 0x70;
diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs
index 811aa21a0b7..1f18b13fc46 100644
--- a/src/librustc/metadata/cstore.rs
+++ b/src/librustc/metadata/cstore.rs
@@ -68,11 +68,13 @@ pub enum LinkagePreference {
     RequireStatic,
 }
 
-#[derive(Copy, Clone, PartialEq, FromPrimitive)]
-pub enum NativeLibraryKind {
-    NativeStatic,    // native static library (.a archive)
-    NativeFramework, // OSX-specific
-    NativeUnknown,   // default way to specify a dynamic library
+enum_from_u32! {
+    #[derive(Copy, Clone, PartialEq)]
+    pub enum NativeLibraryKind {
+        NativeStatic,    // native static library (.a archive)
+        NativeFramework, // OSX-specific
+        NativeUnknown,   // default way to specify a dynamic library
+    }
 }
 
 // Where a crate came from on the local filesystem. One of these two options
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index 6b3bde409f5..cbd54256770 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -35,7 +35,6 @@ use std::collections::HashMap;
 use std::hash::{self, Hash, SipHasher};
 use std::io::prelude::*;
 use std::io;
-use std::num::FromPrimitive;
 use std::rc::Rc;
 use std::slice::bytes;
 use std::str;
@@ -1349,7 +1348,7 @@ pub fn get_native_libraries(cdata: Cmd)
         let kind_doc = reader::get_doc(lib_doc, tag_native_libraries_kind);
         let name_doc = reader::get_doc(lib_doc, tag_native_libraries_name);
         let kind: cstore::NativeLibraryKind =
-            FromPrimitive::from_u32(reader::doc_as_u32(kind_doc)).unwrap();
+            cstore::NativeLibraryKind::from_u32(reader::doc_as_u32(kind_doc)).unwrap();
         let name = name_doc.as_str().to_string();
         result.push((kind, name));
         true
@@ -1359,7 +1358,7 @@ pub fn get_native_libraries(cdata: Cmd)
 
 pub fn get_plugin_registrar_fn(data: &[u8]) -> Option<ast::NodeId> {
     reader::maybe_get_doc(rbml::Doc::new(data), tag_plugin_registrar_fn)
-        .map(|doc| FromPrimitive::from_u32(reader::doc_as_u32(doc)).unwrap())
+        .map(|doc| reader::doc_as_u32(doc))
 }
 
 pub fn each_exported_macro<F>(data: &[u8], intr: &IdentInterner, mut f: F) where
@@ -1407,7 +1406,7 @@ pub fn get_missing_lang_items(cdata: Cmd)
     let mut result = Vec::new();
     reader::tagged_docs(items, tag_lang_items_missing, |missing_docs| {
         let item: lang_items::LangItem =
-            FromPrimitive::from_u32(reader::doc_as_u32(missing_docs)).unwrap();
+            lang_items::LangItem::from_u32(reader::doc_as_u32(missing_docs)).unwrap();
         result.push(item);
         true
     });
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index 7ee0ea4fd66..ee8373279d9 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -41,7 +41,6 @@ use syntax;
 use std::cell::Cell;
 use std::io::SeekFrom;
 use std::io::prelude::*;
-use std::num::FromPrimitive;
 use std::rc::Rc;
 use std::fmt::Debug;
 
@@ -1713,7 +1712,8 @@ fn decode_side_tables(dcx: &DecodeContext,
         debug!(">> Side table document with tag 0x{:x} \
                 found for id {} (orig {})",
                tag, id, id0);
-        let decoded_tag: Option<c::astencode_tag> = FromPrimitive::from_usize(tag);
+        let tag = tag as u32;
+        let decoded_tag: Option<c::astencode_tag> = c::astencode_tag::from_u32(tag);
         match decoded_tag {
             None => {
                 dcx.tcx.sess.bug(
diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs
index 367bcbbe1d8..2c6ffb3281f 100644
--- a/src/librustc/middle/const_eval.rs
+++ b/src/librustc/middle/const_eval.rs
@@ -20,6 +20,7 @@ use middle::{astencode, def};
 use middle::pat_util::def_to_path;
 use middle::ty::{self, Ty};
 use middle::astconv_util::ast_ty_to_prim_ty;
+use util::num::ToPrimitive;
 
 use syntax::ast::{self, Expr};
 use syntax::codemap::Span;
@@ -30,7 +31,6 @@ use syntax::{ast_map, ast_util, codemap};
 
 use std::borrow::{Cow, IntoCow};
 use std::num::wrapping::OverflowingOps;
-use std::num::ToPrimitive;
 use std::cmp::Ordering;
 use std::collections::hash_map::Entry::Vacant;
 use std::{i8, i16, i32, i64};
diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs
index 89a8625856c..c77a43e75cd 100644
--- a/src/librustc/middle/lang_items.rs
+++ b/src/librustc/middle/lang_items.rs
@@ -36,7 +36,6 @@ use syntax::visit::Visitor;
 use syntax::visit;
 
 use std::iter::Enumerate;
-use std::num::FromPrimitive;
 use std::slice;
 
 // The actual lang items defined come at the end of this file in one handy table.
@@ -46,9 +45,12 @@ macro_rules! lets_do_this {
         $( $variant:ident, $name:expr, $method:ident; )*
     ) => {
 
-#[derive(Copy, Clone, FromPrimitive, PartialEq, Eq, Hash)]
-pub enum LangItem {
-    $($variant),*
+
+enum_from_u32! {
+    #[derive(Copy, Clone, PartialEq, Eq, Hash)]
+    pub enum LangItem {
+        $($variant,)*
+    }
 }
 
 pub struct LanguageItems {
@@ -71,7 +73,7 @@ impl LanguageItems {
     }
 
     pub fn item_name(index: usize) -> &'static str {
-        let item: Option<LangItem> = FromPrimitive::from_usize(index);
+        let item: Option<LangItem> = LangItem::from_u32(index as u32);
         match item {
             $( Some($variant) => $name, )*
             None => "???"
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs
index 53c3cdd02af..2c94399f921 100644
--- a/src/librustc/middle/ty.rs
+++ b/src/librustc/middle/ty.rs
@@ -63,6 +63,7 @@ use util::ppaux::{Repr, UserString};
 use util::common::{memoized, ErrorReported};
 use util::nodemap::{NodeMap, NodeSet, DefIdMap, DefIdSet};
 use util::nodemap::FnvHashMap;
+use util::num::ToPrimitive;
 
 use arena::TypedArena;
 use std::borrow::{Borrow, Cow};
@@ -71,7 +72,6 @@ use std::cmp;
 use std::fmt;
 use std::hash::{Hash, SipHasher, Hasher};
 use std::mem;
-use std::num::ToPrimitive;
 use std::ops;
 use std::rc::Rc;
 use std::vec::IntoIter;
diff --git a/src/librustc/util/num.rs b/src/librustc/util/num.rs
new file mode 100644
index 00000000000..da04976a96a
--- /dev/null
+++ b/src/librustc/util/num.rs
@@ -0,0 +1,98 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub trait ToPrimitive {
+    fn to_i8(&self) -> Option<i8>;
+    fn to_i16(&self) -> Option<i16>;
+    fn to_i32(&self) -> Option<i32>;
+    fn to_i64(&self) -> Option<i64>;
+    fn to_u8(&self) -> Option<u8>;
+    fn to_u16(&self) -> Option<u16>;
+    fn to_u32(&self) -> Option<u32>;
+    fn to_u64(&self) -> Option<u64>;
+}
+
+impl ToPrimitive for i64 {
+    fn to_i8(&self) -> Option<i8> {
+        if *self < i8::min_value() as i64 || *self > i8::max_value() as i64 {
+            None
+        } else {
+            Some(*self as i8)
+        }
+    }
+    fn to_i16(&self) -> Option<i16> {
+        if *self < i16::min_value() as i64 || *self > i16::max_value() as i64 {
+            None
+        } else {
+            Some(*self as i16)
+        }
+    }
+    fn to_i32(&self) -> Option<i32> {
+        if *self < i32::min_value() as i64 || *self > i32::max_value() as i64 {
+            None
+        } else {
+            Some(*self as i32)
+        }
+    }
+    fn to_i64(&self) -> Option<i64> {
+        Some(*self)
+    }
+    fn to_u8(&self) -> Option<u8> {
+        if *self < 0 || *self > u8::max_value() as i64 {
+            None
+        } else {
+            Some(*self as u8)
+        }
+    }
+    fn to_u16(&self) -> Option<u16> {
+        if *self < 0 || *self > u16::max_value() as i64 {
+            None
+        } else {
+            Some(*self as u16)
+        }
+    }
+    fn to_u32(&self) -> Option<u32> {
+        if *self < 0 || *self > u32::max_value() as i64 {
+            None
+        } else {
+            Some(*self as u32)
+        }
+    }
+    fn to_u64(&self) -> Option<u64> {
+        if *self < 0 {None} else {Some(*self as u64)}
+    }
+}
+
+impl ToPrimitive for u64 {
+    fn to_i8(&self) -> Option<i8> {
+        if *self > i8::max_value() as u64 {None} else {Some(*self as i8)}
+    }
+    fn to_i16(&self) -> Option<i16> {
+        if *self > i16::max_value() as u64 {None} else {Some(*self as i16)}
+    }
+    fn to_i32(&self) -> Option<i32> {
+        if *self > i32::max_value() as u64 {None} else {Some(*self as i32)}
+    }
+    fn to_i64(&self) -> Option<i64> {
+        if *self > i64::max_value() as u64 {None} else {Some(*self as i64)}
+    }
+    fn to_u8(&self) -> Option<u8> {
+        if *self > u8::max_value() as u64 {None} else {Some(*self as u8)}
+    }
+    fn to_u16(&self) -> Option<u16> {
+        if *self > u16::max_value() as u64 {None} else {Some(*self as u16)}
+    }
+    fn to_u32(&self) -> Option<u32> {
+        if *self > u32::max_value() as u64 {None} else {Some(*self as u32)}
+    }
+    fn to_u64(&self) -> Option<u64> {
+        Some(*self)
+    }
+}