0.8.0

0.8.0 #

  • Released on: 26 September, 2013
  • Branched from master on: 4 December, 2015
  • ~2200 changes, numerous bugfixes

    • Language

      • The for loop syntax has changed to work with the Iterator trait.
      • At long last, unwinding works on Windows.
      • Default methods are ready for use.
      • Many trait inheritance bugs fixed.
      • Owned and borrowed trait objects work more reliably.
      • copy is no longer a keyword. It has been replaced by the Clone trait.
      • rustc can omit emission of code for the debug! macro if it is passed --cfg ndebug
      • mod.rs is now “blessed”. When loading mod foo;, rustc will now look for foo.rs, then foo/mod.rs, and will generate an error when both are present.
      • Strings no longer contain trailing nulls. The new std::c_str module provides new mechanisms for converting to C strings.
      • The type of foreign functions is now extern "C" fn instead of `*u8'.
      • The FFI has been overhauled such that foreign functions are called directly, instead of through a stack-switching wrapper.
      • Calling a foreign function must be done through a Rust function with the #[fixed_stack_segment] attribute.
      • The externfn! macro can be used to declare both a foreign function and a #[fixed_stack_segment] wrapper at once.
      • pub and priv modifiers on extern blocks are no longer parsed.
      • unsafe is no longer allowed on extern fns - they are all unsafe.
      • priv is disallowed everywhere except for struct fields and enum variants.
      • &T (besides &'static T) is no longer allowed in @T.
      • ref bindings in irrefutable patterns work correctly now.
      • char is now prevented from containing invalid code points.
      • Casting to bool is no longer allowed.
      • \0 is now accepted as an escape in chars and strings.
      • yield is a reserved keyword.
      • typeof is a reserved keyword.
      • Crates may be imported by URL with extern mod foo = "url";.
      • Explicit enum discriminants may be given as uints as in enum E { V = 0u }
      • Static vectors can be initialized with repeating elements, e.g. static foo: [u8, .. 100]: [0, .. 100];.
      • Static structs can be initialized with functional record update, e.g. static foo: Foo = Foo { a: 5, .. bar };.
      • cfg! can be used to conditionally execute code based on the crate configuration, similarly to #[cfg(...)].
      • The unnecessary_qualification lint detects unneeded module prefixes (default: allow).
      • Arithmetic operations have been implemented on the SIMD types in std::unstable::simd.
      • Exchange allocation headers were removed, reducing memory usage.
      • format! implements a completely new, extensible, and higher-performance string formatting system. It will replace fmt!.
      • print! and println! write formatted strings (using the format! extension) to stdout.
      • write! and writeln! write formatted strings (using the format! extension) to the new Writers in std::rt::io.
      • The library section in which a function or static is placed may be specified with #[link_section = "..."].
      • The proto! syntax extension for defining bounded message protocols was removed.
      • macro_rules! is hygienic for let declarations.
      • The #[export_name] attribute specifies the name of a symbol.
      • unreachable! can be used to indicate unreachable code, and fails if executed.
    • Libraries

      • std: Transitioned to the new runtime, written in Rust.
      • std: Added an experimental I/O library, rt::io, based on the new runtime.
      • std: A new generic range function was added to the prelude, replacing uint::range and friends.
      • std: range_rev no longer exists. Since range is an iterator it can be reversed with range(lo, hi).invert().
      • std: The chain method on option renamed to and_then; unwrap_or_default renamed to unwrap_or.
      • std: The iterator module was renamed to iter.
      • std: Integral types now support the checked_add, checked_sub, and checked_mul operations for detecting overflow.
      • std: Many methods in str, vec, option, result` were renamed for consistency.
      • std: Methods are standardizing on conventions for casting methods: to_foo for copying, into_foo for moving, as_foo for temporary and cheap casts.
      • std: The CString type in c_str provides new ways to convert to and from C strings.
      • std: DoubleEndedIterator can yield elements in two directions.
      • std: The mut_split method on vectors partitions an &mut [T] into two splices.
      • std: str::from_bytes renamed to str::from_utf8.
      • std: pop_opt and shift_opt methods added to vectors.
      • std: The task-local data interface no longer uses @, and keys are no longer function pointers.
      • std: The swap_unwrap method of Option renamed to take_unwrap.
      • std: Added SharedPort to comm.
      • std: Eq has a default method for ne; only eq is required in implementations.
      • std: Ord has default methods for le, gt and ge; only lt is required in implementations.
      • std: is_utf8 performance is improved, impacting many string functions.
      • std: os::MemoryMap provides cross-platform mmap.
      • std: ptr::offset is now unsafe, but also more optimized. Offsets that are not ‘in-bounds’ are considered undefined.
      • std: Many freestanding functions in vec removed in favor of methods.
      • std: Many freestanding functions on scalar types removed in favor of methods.
      • std: Many options to task builders were removed since they don’t make sense in the new scheduler design.
      • std: More containers implement FromIterator so can be created by the collect method.
      • std: More complete atomic types in unstable::atomics.
      • std: comm::PortSet removed.
      • std: Mutating methods in the Set and Map traits have been moved into the MutableSet and MutableMap traits. Container::is_empty, Map::contains_key, MutableMap::insert, and MutableMap::remove have default implementations.
      • std: Various from_str functions were removed in favor of a generic from_str which is available in the prelude.
      • std: util::unreachable removed in favor of the unreachable! macro.
      • extra: dlist, the doubly-linked list was modernized.
      • extra: Added a hex module with ToHex and FromHex traits.
      • extra: Added glob module, replacing std::os::glob.
      • extra: rope was removed.
      • extra: deque was renamed to ringbuf. RingBuf implements Deque.
      • extra: net, and timer were removed. The experimental replacements are std::rt::io::net and std::rt::io::timer.
      • extra: Iterators implemented for SmallIntMap.
      • extra: Iterators implemented for Bitv and BitvSet.
      • extra: SmallIntSet removed. Use BitvSet.
      • extra: Performance of JSON parsing greatly improved.
      • extra: semver updated to SemVer 2.0.0.
      • extra: term handles more terminals correctly.
      • extra: dbg module removed.
      • extra: par module removed.
      • extra: future was cleaned up, with some method renames.
      • extra: Most free functions in getopts were converted to methods.
    • Other

      • rustc’s debug info generation (-Z debug-info) is greatly improved.
      • rustc accepts --target-cpu to compile to a specific CPU architecture, similarly to gcc’s --march flag.
      • rustc’s performance compiling small crates is much better.
      • rustpkg has received many improvements.
      • rustpkg supports git tags as package IDs.
      • rustpkg builds into target-specific directories so it can be used for cross-compiling.
      • The number of concurrent test tasks is controlled by the environment variable RUST_TEST_TASKS.
      • The test harness can now report metrics for benchmarks.
      • All tools have man pages.
      • Programs compiled with --test now support the -h and --help flags.
      • The runtime uses jemalloc for allocations.
      • Segmented stacks are temporarily disabled as part of the transition to the new runtime. Stack overflows are possible!
      • A new documentation backend, rustdoc_ng, is available for use. It is still invoked through the normal rustdoc command.