1
Fork 0

Removing some mutable fields in libstd

This commit is contained in:
Alex Crichton 2013-03-24 12:41:19 -04:00
parent 5641777318
commit 3136fba5ae
7 changed files with 91 additions and 92 deletions

View file

@ -259,7 +259,7 @@ struct RWARCInner<T> { lock: RWlock, failed: bool, data: T }
*/ */
struct RWARC<T> { struct RWARC<T> {
x: SharedMutableState<RWARCInner<T>>, x: SharedMutableState<RWARCInner<T>>,
mut cant_nest: () cant_nest: ()
} }
/// Create a reader/writer ARC with the supplied data. /// Create a reader/writer ARC with the supplied data.

View file

@ -360,9 +360,9 @@ pub fn to_pretty_str(json: &Json) -> ~str {
pub struct Parser { pub struct Parser {
priv rdr: @io::Reader, priv rdr: @io::Reader,
priv mut ch: char, priv ch: char,
priv mut line: uint, priv line: uint,
priv mut col: uint, priv col: uint,
} }
/// Decode a json value from an io::reader /// Decode a json value from an io::reader
@ -376,7 +376,7 @@ pub fn Parser(rdr: @io::Reader) -> Parser {
} }
pub impl Parser { pub impl Parser {
fn parse(&self) -> Result<Json, Error> { fn parse(&mut self) -> Result<Json, Error> {
match self.parse_value() { match self.parse_value() {
Ok(value) => { Ok(value) => {
// Skip trailing whitespaces. // Skip trailing whitespaces.
@ -396,7 +396,7 @@ pub impl Parser {
priv impl Parser { priv impl Parser {
fn eof(&self) -> bool { self.ch == -1 as char } fn eof(&self) -> bool { self.ch == -1 as char }
fn bump(&self) { fn bump(&mut self) {
self.ch = self.rdr.read_char(); self.ch = self.rdr.read_char();
if self.ch == '\n' { if self.ch == '\n' {
@ -407,7 +407,7 @@ priv impl Parser {
} }
} }
fn next_char(&self) -> char { fn next_char(&mut self) -> char {
self.bump(); self.bump();
self.ch self.ch
} }
@ -416,7 +416,7 @@ priv impl Parser {
Err(Error { line: self.line, col: self.col, msg: @msg }) Err(Error { line: self.line, col: self.col, msg: @msg })
} }
fn parse_value(&self) -> Result<Json, Error> { fn parse_value(&mut self) -> Result<Json, Error> {
self.parse_whitespace(); self.parse_whitespace();
if self.eof() { return self.error(~"EOF while parsing value"); } if self.eof() { return self.error(~"EOF while parsing value"); }
@ -437,11 +437,11 @@ priv impl Parser {
} }
} }
fn parse_whitespace(&self) { fn parse_whitespace(&mut self) {
while char::is_whitespace(self.ch) { self.bump(); } while char::is_whitespace(self.ch) { self.bump(); }
} }
fn parse_ident(&self, ident: &str, value: Json) -> Result<Json, Error> { fn parse_ident(&mut self, ident: &str, value: Json) -> Result<Json, Error> {
if str::all(ident, |c| c == self.next_char()) { if str::all(ident, |c| c == self.next_char()) {
self.bump(); self.bump();
Ok(value) Ok(value)
@ -450,7 +450,7 @@ priv impl Parser {
} }
} }
fn parse_number(&self) -> Result<Json, Error> { fn parse_number(&mut self) -> Result<Json, Error> {
let mut neg = 1f; let mut neg = 1f;
if self.ch == '-' { if self.ch == '-' {
@ -480,7 +480,7 @@ priv impl Parser {
Ok(Number(neg * res)) Ok(Number(neg * res))
} }
fn parse_integer(&self) -> Result<float, Error> { fn parse_integer(&mut self) -> Result<float, Error> {
let mut res = 0f; let mut res = 0f;
match self.ch { match self.ch {
@ -512,7 +512,7 @@ priv impl Parser {
Ok(res) Ok(res)
} }
fn parse_decimal(&self, res: float) -> Result<float, Error> { fn parse_decimal(&mut self, res: float) -> Result<float, Error> {
self.bump(); self.bump();
// Make sure a digit follows the decimal place. // Make sure a digit follows the decimal place.
@ -538,10 +538,9 @@ priv impl Parser {
Ok(res) Ok(res)
} }
fn parse_exponent(&self, res: float) -> Result<float, Error> { fn parse_exponent(&mut self, mut res: float) -> Result<float, Error> {
self.bump(); self.bump();
let mut res = res;
let mut exp = 0u; let mut exp = 0u;
let mut neg_exp = false; let mut neg_exp = false;
@ -579,7 +578,7 @@ priv impl Parser {
Ok(res) Ok(res)
} }
fn parse_str(&self) -> Result<~str, Error> { fn parse_str(&mut self) -> Result<~str, Error> {
let mut escape = false; let mut escape = false;
let mut res = ~""; let mut res = ~"";
@ -643,7 +642,7 @@ priv impl Parser {
self.error(~"EOF while parsing string") self.error(~"EOF while parsing string")
} }
fn parse_list(&self) -> Result<Json, Error> { fn parse_list(&mut self) -> Result<Json, Error> {
self.bump(); self.bump();
self.parse_whitespace(); self.parse_whitespace();
@ -673,7 +672,7 @@ priv impl Parser {
}; };
} }
fn parse_object(&self) -> Result<Json, Error> { fn parse_object(&mut self) -> Result<Json, Error> {
self.bump(); self.bump();
self.parse_whitespace(); self.parse_whitespace();
@ -726,7 +725,8 @@ priv impl Parser {
/// Decodes a json value from an @io::Reader /// Decodes a json value from an @io::Reader
pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> { pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> {
Parser(rdr).parse() let mut parser = Parser(rdr);
parser.parse()
} }
/// Decodes a json value from a string /// Decodes a json value from a string

View file

@ -239,7 +239,6 @@ mod test {
mod arith { mod arith {
use super::*; use super::*;
use super::super::*;
use core::num::Zero; use core::num::Zero;
#[test] #[test]

View file

@ -455,7 +455,7 @@ pub mod iterator {
node::Content(x) => return node::leaf_iterator::start(x) node::Content(x) => return node::leaf_iterator::start(x)
} }
} }
pub fn next(it: &node::leaf_iterator::T) -> Option<node::Leaf> { pub fn next(it: &mut node::leaf_iterator::T) -> Option<node::Leaf> {
return node::leaf_iterator::next(it); return node::leaf_iterator::next(it);
} }
} }
@ -470,7 +470,7 @@ pub mod iterator {
node::Content(x) => return node::char_iterator::start(x) node::Content(x) => return node::char_iterator::start(x)
} }
} }
pub fn next(it: &node::char_iterator::T) -> Option<char> { pub fn next(it: &mut node::char_iterator::T) -> Option<char> {
return node::char_iterator::next(it) return node::char_iterator::next(it)
} }
} }
@ -832,9 +832,9 @@ pub mod node {
unsafe { unsafe {
let mut buf = vec::from_elem(byte_len(node), 0); let mut buf = vec::from_elem(byte_len(node), 0);
let mut offset = 0u;//Current position in the buffer let mut offset = 0u;//Current position in the buffer
let it = leaf_iterator::start(node); let mut it = leaf_iterator::start(node);
loop { loop {
match (leaf_iterator::next(&it)) { match leaf_iterator::next(&mut it) {
option::None => break, option::None => break,
option::Some(x) => { option::Some(x) => {
//FIXME (#2744): Replace with memcpy or something similar //FIXME (#2744): Replace with memcpy or something similar
@ -896,9 +896,9 @@ pub mod node {
if height(node) < hint_max_node_height { return option::None; } if height(node) < hint_max_node_height { return option::None; }
//1. Gather all leaves as a forest //1. Gather all leaves as a forest
let mut forest = ~[]; let mut forest = ~[];
let it = leaf_iterator::start(node); let mut it = leaf_iterator::start(node);
loop { loop {
match (leaf_iterator::next(&it)) { match leaf_iterator::next(&mut it) {
option::None => break, option::None => break,
option::Some(x) => forest.push(@Leaf(x)) option::Some(x) => forest.push(@Leaf(x))
} }
@ -1058,11 +1058,12 @@ pub mod node {
} }
pub fn cmp(a: @Node, b: @Node) -> int { pub fn cmp(a: @Node, b: @Node) -> int {
let ita = char_iterator::start(a); let mut ita = char_iterator::start(a);
let itb = char_iterator::start(b); let mut itb = char_iterator::start(b);
let mut result = 0; let mut result = 0;
while result == 0 { while result == 0 {
match ((char_iterator::next(&ita), char_iterator::next(&itb))) { match (char_iterator::next(&mut ita), char_iterator::next(&mut itb))
{
(option::None, option::None) => break, (option::None, option::None) => break,
(option::Some(chara), option::Some(charb)) => { (option::Some(chara), option::Some(charb)) => {
result = char::cmp(chara, charb); result = char::cmp(chara, charb);
@ -1131,9 +1132,7 @@ pub mod node {
* proportional to the height of the rope + the (bounded) * proportional to the height of the rope + the (bounded)
* length of the largest leaf. * length of the largest leaf.
*/ */
pub fn char_at(node: @Node, pos: uint) -> char { pub fn char_at(mut node: @Node, mut pos: uint) -> char {
let mut node = node;
let mut pos = pos;
loop { loop {
match *node { match *node {
Leaf(x) => return str::char_at(*x.content, pos), Leaf(x) => return str::char_at(*x.content, pos),
@ -1154,8 +1153,8 @@ pub mod node {
use core::vec; use core::vec;
pub struct T { pub struct T {
mut stack: ~[@Node], stack: ~[@Node],
mut stackpos: int, stackpos: int,
} }
pub fn empty() -> T { pub fn empty() -> T {
@ -1171,7 +1170,7 @@ pub mod node {
} }
} }
pub fn next(it: &T) -> Option<Leaf> { pub fn next(it: &mut T) -> Option<Leaf> {
if it.stackpos < 0 { return option::None; } if it.stackpos < 0 { return option::None; }
loop { loop {
let current = it.stack[it.stackpos]; let current = it.stack[it.stackpos];
@ -1199,8 +1198,8 @@ pub mod node {
pub struct T { pub struct T {
leaf_iterator: leaf_iterator::T, leaf_iterator: leaf_iterator::T,
mut leaf: Option<Leaf>, leaf: Option<Leaf>,
mut leaf_byte_pos: uint, leaf_byte_pos: uint,
} }
pub fn start(node: @Node) -> T { pub fn start(node: @Node) -> T {
@ -1219,13 +1218,13 @@ pub mod node {
} }
} }
pub fn next(it: &T) -> Option<char> { pub fn next(it: &mut T) -> Option<char> {
loop { loop {
match (get_current_or_next_leaf(it)) { match get_current_or_next_leaf(it) {
option::None => return option::None, option::None => return option::None,
option::Some(_) => { option::Some(_) => {
let next_char = get_next_char_in_leaf(it); let next_char = get_next_char_in_leaf(it);
match (next_char) { match next_char {
option::None => loop, option::None => loop,
option::Some(_) => return next_char option::Some(_) => return next_char
} }
@ -1234,16 +1233,16 @@ pub mod node {
}; };
} }
pub fn get_current_or_next_leaf(it: &T) -> Option<Leaf> { pub fn get_current_or_next_leaf(it: &mut T) -> Option<Leaf> {
match ((*it).leaf) { match it.leaf {
option::Some(_) => return (*it).leaf, option::Some(_) => return it.leaf,
option::None => { option::None => {
let next = leaf_iterator::next(&((*it).leaf_iterator)); let next = leaf_iterator::next(&mut it.leaf_iterator);
match (next) { match next {
option::None => return option::None, option::None => return option::None,
option::Some(_) => { option::Some(_) => {
(*it).leaf = next; it.leaf = next;
(*it).leaf_byte_pos = 0u; it.leaf_byte_pos = 0u;
return next; return next;
} }
} }
@ -1251,13 +1250,13 @@ pub mod node {
} }
} }
pub fn get_next_char_in_leaf(it: &T) -> Option<char> { pub fn get_next_char_in_leaf(it: &mut T) -> Option<char> {
match copy (*it).leaf { match copy it.leaf {
option::None => return option::None, option::None => return option::None,
option::Some(aleaf) => { option::Some(aleaf) => {
if (*it).leaf_byte_pos >= aleaf.byte_len { if it.leaf_byte_pos >= aleaf.byte_len {
//We are actually past the end of the leaf //We are actually past the end of the leaf
(*it).leaf = option::None; it.leaf = option::None;
return option::None return option::None
} else { } else {
let range = let range =
@ -1342,11 +1341,11 @@ mod tests {
assert!(rope_to_string(r) == *sample); assert!(rope_to_string(r) == *sample);
let mut string_iter = 0u; let mut string_iter = 0u;
let string_len = str::len(*sample); let string_len = str::len(*sample);
let rope_iter = iterator::char::start(r); let mut rope_iter = iterator::char::start(r);
let mut equal = true; let mut equal = true;
while equal { while equal {
match (node::char_iterator::next(&rope_iter)) { match (node::char_iterator::next(&mut rope_iter)) {
option::None => { option::None => {
if string_iter < string_len { if string_iter < string_len {
equal = false; equal = false;
@ -1376,9 +1375,9 @@ mod tests {
let r = of_str(sample); let r = of_str(sample);
let mut len = 0u; let mut len = 0u;
let it = iterator::char::start(r); let mut it = iterator::char::start(r);
loop { loop {
match (node::char_iterator::next(&it)) { match (node::char_iterator::next(&mut it)) {
option::None => break, option::None => break,
option::Some(_) => len += 1u option::Some(_) => len += 1u
} }

View file

@ -72,7 +72,7 @@ fn broadcast_waitqueue(q: &Waitqueue) -> uint {
// The building-block used to make semaphores, mutexes, and rwlocks. // The building-block used to make semaphores, mutexes, and rwlocks.
#[doc(hidden)] #[doc(hidden)]
struct SemInner<Q> { struct SemInner<Q> {
mut count: int, count: int,
waiters: Waitqueue, waiters: Waitqueue,
// Can be either unit or another waitqueue. Some sems shouldn't come with // Can be either unit or another waitqueue. Some sems shouldn't come with
// a condition variable attached, others should. // a condition variable attached, others should.
@ -729,7 +729,6 @@ mod tests {
use core::cast; use core::cast;
use core::cell::Cell; use core::cell::Cell;
use core::option;
use core::ptr; use core::ptr;
use core::result; use core::result;
use core::task; use core::task;

View file

@ -26,8 +26,7 @@ enum Msg<T> {
pub struct TaskPool<T> { pub struct TaskPool<T> {
channels: ~[Chan<Msg<T>>], channels: ~[Chan<Msg<T>>],
mut next_index: uint, next_index: uint,
} }
#[unsafe_destructor] #[unsafe_destructor]
@ -84,7 +83,7 @@ pub impl<T> TaskPool<T> {
/// Executes the function `f` on a task in the pool. The function /// Executes the function `f` on a task in the pool. The function
/// receives a reference to the local data returned by the `init_fn`. /// receives a reference to the local data returned by the `init_fn`.
fn execute(&self, f: ~fn(&T)) { fn execute(&mut self, f: ~fn(&T)) {
self.channels[self.next_index].send(Execute(f)); self.channels[self.next_index].send(Execute(f));
self.next_index += 1; self.next_index += 1;
if self.next_index == self.channels.len() { self.next_index = 0; } if self.next_index == self.channels.len() { self.next_index = 0; }
@ -97,7 +96,7 @@ fn test_task_pool() {
let g: ~fn(uint) -> uint = |i| i; let g: ~fn(uint) -> uint = |i| i;
g g
}; };
let pool = TaskPool::new(4, Some(SingleThreaded), f); let mut pool = TaskPool::new(4, Some(SingleThreaded), f);
for 8.times { for 8.times {
pool.execute(|i| io::println(fmt!("Hello from thread %u!", *i))); pool.execute(|i| io::println(fmt!("Hello from thread %u!", *i)));
} }

View file

@ -201,19 +201,19 @@ struct ConsoleTestState {
out: @io::Writer, out: @io::Writer,
log_out: Option<@io::Writer>, log_out: Option<@io::Writer>,
use_color: bool, use_color: bool,
mut total: uint, total: uint,
mut passed: uint, passed: uint,
mut failed: uint, failed: uint,
mut ignored: uint, ignored: uint,
mut benchmarked: uint, benchmarked: uint,
mut failures: ~[TestDesc] failures: ~[TestDesc]
} }
// A simple console test runner // A simple console test runner
pub fn run_tests_console(opts: &TestOpts, pub fn run_tests_console(opts: &TestOpts,
tests: ~[TestDescAndFn]) -> bool { tests: ~[TestDescAndFn]) -> bool {
fn callback(event: &TestEvent, st: @ConsoleTestState) { fn callback(event: &TestEvent, st: &mut ConsoleTestState) {
debug!("callback(event=%?)", event); debug!("callback(event=%?)", event);
match *event { match *event {
TeFiltered(ref filtered_tests) => { TeFiltered(ref filtered_tests) => {
@ -268,16 +268,16 @@ pub fn run_tests_console(opts: &TestOpts,
None => None None => None
}; };
let st = @ConsoleTestState { let st = @mut ConsoleTestState {
out: io::stdout(), out: io::stdout(),
log_out: log_out, log_out: log_out,
use_color: use_color(), use_color: use_color(),
mut total: 0u, total: 0u,
mut passed: 0u, passed: 0u,
mut failed: 0u, failed: 0u,
mut ignored: 0u, ignored: 0u,
mut benchmarked: 0u, benchmarked: 0u,
mut failures: ~[] failures: ~[]
}; };
run_tests(opts, tests, |x| callback(&x, st)); run_tests(opts, tests, |x| callback(&x, st));
@ -290,15 +290,18 @@ pub fn run_tests_console(opts: &TestOpts,
print_failures(st); print_failures(st);
} }
st.out.write_str(fmt!("\nresult: ")); {
if success { let st: &mut ConsoleTestState = st;
// There's no parallelism at this point so it's safe to use color st.out.write_str(fmt!("\nresult: "));
write_ok(st.out, true); if success {
} else { // There's no parallelism at this point so it's safe to use color
write_failed(st.out, true); write_ok(st.out, true);
} else {
write_failed(st.out, true);
}
st.out.write_str(fmt!(". %u passed; %u failed; %u ignored\n\n",
st.passed, st.failed, st.ignored));
} }
st.out.write_str(fmt!(". %u passed; %u failed; %u ignored\n\n",
st.passed, st.failed, st.ignored));
return success; return success;
@ -356,7 +359,7 @@ pub fn run_tests_console(opts: &TestOpts,
} }
} }
fn print_failures(st: @ConsoleTestState) { fn print_failures(st: &ConsoleTestState) {
st.out.write_line(~"\nfailures:"); st.out.write_line(~"\nfailures:");
let mut failures = ~[]; let mut failures = ~[];
for uint::range(0, vec::uniq_len(&const st.failures)) |i| { for uint::range(0, vec::uniq_len(&const st.failures)) |i| {
@ -390,12 +393,12 @@ fn should_sort_failures_before_printing_them() {
out: wr, out: wr,
log_out: option::None, log_out: option::None,
use_color: false, use_color: false,
mut total: 0u, total: 0u,
mut passed: 0u, passed: 0u,
mut failed: 0u, failed: 0u,
mut ignored: 0u, ignored: 0u,
mut benchmarked: 0u, benchmarked: 0u,
mut failures: ~[test_b, test_a] failures: ~[test_b, test_a]
}; };
print_failures(st); print_failures(st);