"There's an extra layer of indirection in that struct definition. A &'a
fn() is a pointer to a pointer to a function. A statement like
"self_.statefn = &finished;" expands to "let foo = finished; self_.statefn
= &foo". That's obviously creating a dangling pointer onto the stack which
is why it ends up crashing."
I'm not sure I fully understand the above. If what you say is true, then
why does the following code (which also uses &'a fn()) work? [using rustc
0.11-pre-nightly (e332287 2014-04-16 00:56:30 -0700) on ubuntu 14.04]
Thanks.:
************************************************************************************************************
struct StateMachineIter<'a> {
statefn: &'a fn(&mut StateMachineIter<'a>)
}
fn next(self_: &mut StateMachineIter) {
return (*self_.statefn)(self_);
}
fn state1(self_: &mut StateMachineIter) {
println!("state1");
self_.statefn = &state2;
}
fn state2(self_: &mut StateMachineIter) {
println!("state2");
self_.statefn = &state3;
}
fn state3(self_: &mut StateMachineIter) {
println!("state3");
self_.statefn = &finished;
}
fn finished(_: &mut StateMachineIter) {
println!("finished");
}
fn state_iter() -> StateMachineIter {
StateMachineIter { statefn: &state1 }
}
fn main() {
let it =& mut state_iter();
next(it);
next(it);
next(it);
next(it);
next(it);
/*
Prints out :
state1
state2
state3
finished
finished
*/
}
************************************************************************************************************
On Fri, Apr 18, 2014 at 4:47 PM, Steven Fackler <[email protected]> wrote:
> There's an extra layer of indirection in that struct definition. A &'a
> fn() is a pointer to a pointer to a function. A statement like
> "self_.statefn = &finished;" expands to "let foo = finished; self_.statefn
> = &foo". That's obviously creating a dangling pointer onto the stack which
> is why it ends up crashing. Adjusting the struct definition to
>
> struct StateMachineIter {
> statefn: fn(&mut StateMachineIter) -> Option<&'static str>
> }
>
> should make things work as you want. There's also a bug in rustc for even
> letting that program compile. I'm not sure if it's already been run into
> and filed.
>
>
> Steven Fackler
>
>
> On Fri, Apr 18, 2014 at 8:30 AM, Ziad Hatahet <[email protected]> wrote:
>
>> Confirm repro on an older rustc version. Ubuntu 13.10 running rustc
>> 0.11-pre (ecc774f 2014-04-11 13:46:45 -0700).
>>
>>
>> --
>> Ziad
>>
>>
>> On Fri, Apr 18, 2014 at 4:38 AM, Phil Dawes <[email protected]>wrote:
>>
>>> Hello everyone,
>>>
>>> I was trying to create an iterator that used a function pointer to
>>> alternate between different states, and ended up core dumping. I've pasted
>>> a version that generates the issue on my box (Ubuntu 12.04 LTS,
>>> rust-nightly pulled just now). Can anybody reproduce this on their
>>> machines? If so I'll file a bug.
>>>
>>> Cheers,
>>>
>>> Phil
>>>
>>> struct StateMachineIter<'a> {
>>> statefn: &'a fn(&mut StateMachineIter<'a>) -> Option<&'static str>
>>> }
>>>
>>> impl<'a> Iterator<&'static str> for StateMachineIter<'a> {
>>> fn next(&mut self) -> Option<&'static str> {
>>> return (*self.statefn)(self);
>>> }
>>> }
>>>
>>> fn state1(self_: &mut StateMachineIter) -> Option<&'static str> {
>>> self_.statefn = &state2;
>>> return Some("state1");
>>> }
>>>
>>> fn state2(self_: &mut StateMachineIter) -> Option<(&'static str)> {
>>> self_.statefn = &state3;
>>> return Some("state2");
>>> }
>>>
>>> fn state3(self_: &mut StateMachineIter) -> Option<(&'static str)> {
>>> self_.statefn = &finished;
>>> return Some("state3");
>>> }
>>>
>>> fn finished(_: &mut StateMachineIter) -> Option<(&'static str)> {
>>> return None;
>>> }
>>>
>>> fn state_iter() -> StateMachineIter {
>>> StateMachineIter { statefn: &state1 }
>>> }
>>>
>>>
>>> fn main() {
>>> let mut it = state_iter();
>>> println!("{}",it.next());
>>> println!("{}",it.next());
>>> println!("{}",it.next());
>>> println!("{}",it.next());
>>> println!("{}",it.next());
>>> }
>>>
>>>
>>> _______________________________________________
>>> Rust-dev mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/rust-dev
>>>
>>>
>>
>> _______________________________________________
>> Rust-dev mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/rust-dev
>>
>>
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
>
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev