diff options
| author | Jed Davis <jld@panix.com> | 2013-09-29 02:20:11 -0700 |
|---|---|---|
| committer | Jed Davis <jld@panix.com> | 2013-10-29 09:09:20 -0700 |
| commit | fcfbfde0b71d2470cb544d3d216eaf61ceb348bf (patch) | |
| tree | cf2498a05b0bd22e430b441482dbaa335d7c90e1 /src/libstd | |
| parent | 92109b12029b21e27f9f12a2b4faf4abc0627b64 (diff) | |
| download | rust-fcfbfde0b71d2470cb544d3d216eaf61ceb348bf.tar.gz rust-fcfbfde0b71d2470cb544d3d216eaf61ceb348bf.zip | |
Adjust reflection for the possibility of discriminants larger than int.
Not only can discriminants be smaller than int now, but they can be larger than int on 32-bit targets. This has obvious implications for the reflection interface. Without this change, things fail with LLVM assertions when we try to "extend" i64 to i32.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/reflect.rs | 10 | ||||
| -rw-r--r-- | src/libstd/repr.rs | 12 | ||||
| -rw-r--r-- | src/libstd/unstable/intrinsics.rs | 13 |
3 files changed, 20 insertions, 15 deletions
diff --git a/src/libstd/reflect.rs b/src/libstd/reflect.rs index d63b14f982d..19fa9abc0da 100644 --- a/src/libstd/reflect.rs +++ b/src/libstd/reflect.rs @@ -16,7 +16,7 @@ Runtime type reflection #[allow(missing_doc)]; -use unstable::intrinsics::{Opaque, TyDesc, TyVisitor}; +use unstable::intrinsics::{Disr, Opaque, TyDesc, TyVisitor}; use libc::c_void; use mem; use unstable::raw; @@ -396,7 +396,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { } fn visit_enter_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { self.align(align); @@ -407,7 +407,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { } fn visit_enter_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_enter_enum_variant(variant, disr_val, @@ -426,7 +426,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { } fn visit_leave_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { if ! self.inner.visit_leave_enum_variant(variant, disr_val, @@ -437,7 +437,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> { } fn visit_leave_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool { if ! self.inner.visit_leave_enum(n_variants, get_disr, sz, align) { return false; diff --git a/src/libstd/repr.rs b/src/libstd/repr.rs index d03621eb60d..dd68c57e37e 100644 --- a/src/libstd/repr.rs +++ b/src/libstd/repr.rs @@ -29,7 +29,7 @@ use reflect::{MovePtr, align}; use str::StrSlice; use to_str::ToStr; use vec::OwnedVector; -use unstable::intrinsics::{Opaque, TyDesc, TyVisitor, get_tydesc, visit_tydesc}; +use unstable::intrinsics::{Disr, Opaque, TyDesc, TyVisitor, get_tydesc, visit_tydesc}; use unstable::raw; /// Representations @@ -92,7 +92,7 @@ num_repr!(f64, "f64") // New implementation using reflect::MovePtr enum VariantState { - SearchingFor(int), + SearchingFor(Disr), Matched, AlreadyFound } @@ -473,7 +473,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { fn visit_enter_enum(&mut self, _n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { let disr = unsafe { @@ -484,7 +484,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { } fn visit_enter_enum_variant(&mut self, _variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool { let mut write = false; @@ -531,7 +531,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { } fn visit_leave_enum_variant(&mut self, _variant: uint, - _disr_val: int, + _disr_val: Disr, n_fields: uint, _name: &str) -> bool { match self.var_stk[self.var_stk.len() - 1] { @@ -547,7 +547,7 @@ impl<'self> TyVisitor for ReprVisitor<'self> { fn visit_leave_enum(&mut self, _n_variants: uint, - _get_disr: extern unsafe fn(ptr: *Opaque) -> int, + _get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, _sz: uint, _align: uint) -> bool { diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 1900d9d5801..20563718a6c 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -75,6 +75,11 @@ pub struct TyDesc { #[cfg(not(test))] pub enum Opaque { } +#[cfg(stage0)] +pub type Disr = int; +#[cfg(not(stage0))] +pub type Disr = u64; + #[lang="ty_visitor"] #[cfg(not(test))] pub trait TyVisitor { @@ -140,19 +145,19 @@ pub trait TyVisitor { sz: uint, align: uint) -> bool; fn visit_enter_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool; fn visit_enter_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool; fn visit_enum_variant_field(&mut self, i: uint, offset: uint, inner: *TyDesc) -> bool; fn visit_leave_enum_variant(&mut self, variant: uint, - disr_val: int, + disr_val: Disr, n_fields: uint, name: &str) -> bool; fn visit_leave_enum(&mut self, n_variants: uint, - get_disr: extern unsafe fn(ptr: *Opaque) -> int, + get_disr: extern unsafe fn(ptr: *Opaque) -> Disr, sz: uint, align: uint) -> bool; fn visit_enter_fn(&mut self, purity: uint, proto: uint, |
