From 19ec5ef45bfd14a1dd17e503b284c65286bb1c68 Mon Sep 17 00:00:00 2001 From: edef Date: Fri, 16 Sep 2016 04:34:49 -0400 Subject: [PATCH] Make the passed Yielder borrow immutable [breaking-change] Yielder::suspend only requires an immutable reference, and allowing mem::replace on the yielder isn't very useful. --- src/generator.rs | 10 +++++----- tests/generator.rs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/generator.rs b/src/generator.rs index 96ffdad..025fbe6 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -95,7 +95,7 @@ impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> /// See also the [contract](../trait.GuardedStack.html) that needs to be fulfilled by `stack`. pub fn new(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack> where Stack: stack::GuardedStack, - F: FnOnce(&mut Yielder, Input) + Send + 'a { + F: FnOnce(&Yielder, Input) + Send + 'a { unsafe { Generator::unsafe_new(stack, f) } } @@ -107,18 +107,18 @@ impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> /// /// See also the [contract](../trait.Stack.html) that needs to be fulfilled by `stack`. pub unsafe fn unsafe_new(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack> - where F: FnOnce(&mut Yielder, Input) + Send + 'a { + where F: FnOnce(&Yielder, Input) + Send + 'a { unsafe extern "C" fn generator_wrapper(env: usize, stack_ptr: StackPointer) -> ! where Input: Send, Output: Send, Stack: stack::Stack, - F: FnOnce(&mut Yielder, Input) { + F: FnOnce(&Yielder, Input) { // Retrieve our environment from the callee and return control to it. let f = ptr::read(env as *const F); let (data, stack_ptr) = arch::swap(0, stack_ptr, None); // See the second half of Yielder::suspend_bare. let input = ptr::read(data as *const Input); // Run the body of the generator. - let mut yielder = Yielder::new(stack_ptr); - f(&mut yielder, input); + let yielder = Yielder::new(stack_ptr); + f(&yielder, input); // Past this point, the generator has dropped everything it has held. loop { yielder.suspend_bare(None); } } diff --git a/tests/generator.rs b/tests/generator.rs index 30a8bfd..c4f0a59 100644 --- a/tests/generator.rs +++ b/tests/generator.rs @@ -10,7 +10,7 @@ extern crate fringe; use fringe::{SliceStack, OwnedStack, OsStack}; use fringe::generator::{Generator, Yielder}; -fn add_one_fn(yielder: &mut Yielder, mut input: i32) { +fn add_one_fn(yielder: &Yielder, mut input: i32) { loop { if input == 0 { break } input = yielder.suspend(input + 1)