forked from M-Labs/libfringe
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.
This commit is contained in:
parent
045ad33785
commit
19ec5ef45b
|
@ -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`.
|
/// See also the [contract](../trait.GuardedStack.html) that needs to be fulfilled by `stack`.
|
||||||
pub fn new<F>(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack>
|
pub fn new<F>(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack>
|
||||||
where Stack: stack::GuardedStack,
|
where Stack: stack::GuardedStack,
|
||||||
F: FnOnce(&mut Yielder<Input, Output>, Input) + Send + 'a {
|
F: FnOnce(&Yielder<Input, Output>, Input) + Send + 'a {
|
||||||
unsafe { Generator::unsafe_new(stack, f) }
|
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`.
|
/// See also the [contract](../trait.Stack.html) that needs to be fulfilled by `stack`.
|
||||||
pub unsafe fn unsafe_new<F>(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack>
|
pub unsafe fn unsafe_new<F>(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack>
|
||||||
where F: FnOnce(&mut Yielder<Input, Output>, Input) + Send + 'a {
|
where F: FnOnce(&Yielder<Input, Output>, Input) + Send + 'a {
|
||||||
unsafe extern "C" fn generator_wrapper<Input, Output, Stack, F>(env: usize, stack_ptr: StackPointer) -> !
|
unsafe extern "C" fn generator_wrapper<Input, Output, Stack, F>(env: usize, stack_ptr: StackPointer) -> !
|
||||||
where Input: Send, Output: Send, Stack: stack::Stack,
|
where Input: Send, Output: Send, Stack: stack::Stack,
|
||||||
F: FnOnce(&mut Yielder<Input, Output>, Input) {
|
F: FnOnce(&Yielder<Input, Output>, Input) {
|
||||||
// Retrieve our environment from the callee and return control to it.
|
// Retrieve our environment from the callee and return control to it.
|
||||||
let f = ptr::read(env as *const F);
|
let f = ptr::read(env as *const F);
|
||||||
let (data, stack_ptr) = arch::swap(0, stack_ptr, None);
|
let (data, stack_ptr) = arch::swap(0, stack_ptr, None);
|
||||||
// See the second half of Yielder::suspend_bare.
|
// See the second half of Yielder::suspend_bare.
|
||||||
let input = ptr::read(data as *const Input);
|
let input = ptr::read(data as *const Input);
|
||||||
// Run the body of the generator.
|
// Run the body of the generator.
|
||||||
let mut yielder = Yielder::new(stack_ptr);
|
let yielder = Yielder::new(stack_ptr);
|
||||||
f(&mut yielder, input);
|
f(&yielder, input);
|
||||||
// Past this point, the generator has dropped everything it has held.
|
// Past this point, the generator has dropped everything it has held.
|
||||||
loop { yielder.suspend_bare(None); }
|
loop { yielder.suspend_bare(None); }
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ extern crate fringe;
|
||||||
use fringe::{SliceStack, OwnedStack, OsStack};
|
use fringe::{SliceStack, OwnedStack, OsStack};
|
||||||
use fringe::generator::{Generator, Yielder};
|
use fringe::generator::{Generator, Yielder};
|
||||||
|
|
||||||
fn add_one_fn(yielder: &mut Yielder<i32, i32>, mut input: i32) {
|
fn add_one_fn(yielder: &Yielder<i32, i32>, mut input: i32) {
|
||||||
loop {
|
loop {
|
||||||
if input == 0 { break }
|
if input == 0 { break }
|
||||||
input = yielder.suspend(input + 1)
|
input = yielder.suspend(input + 1)
|
||||||
|
|
Loading…
Reference in New Issue