Fix realiased streams causing close/1 to leave a dangling stream
This commit is contained in:
@@ -640,7 +640,7 @@ impl Stream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn options_mut(&mut self) -> &mut StreamOptions {
|
pub(super) fn options_mut(&mut self) -> &mut StreamOptions {
|
||||||
match self {
|
match self {
|
||||||
Stream::Byte(ref mut ptr) => &mut ptr.options,
|
Stream::Byte(ref mut ptr) => &mut ptr.options,
|
||||||
Stream::InputFile(ref mut ptr) => &mut ptr.options,
|
Stream::InputFile(ref mut ptr) => &mut ptr.options,
|
||||||
@@ -1946,4 +1946,24 @@ mod test {
|
|||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(results[0].is_ok());
|
assert!(results[0].is_ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg_attr(miri, ignore)]
|
||||||
|
fn close_realiased_stream() {
|
||||||
|
let mut machine = MachineBuilder::new().build();
|
||||||
|
|
||||||
|
let results = machine
|
||||||
|
.run_query(r#"
|
||||||
|
\+ \+ (
|
||||||
|
open("README.md", read, S, [alias(readme)]),
|
||||||
|
open(stream(S), read, _, [alias(another_alias)]),
|
||||||
|
close(S)
|
||||||
|
),
|
||||||
|
open("README.md", read, _, [alias(readme)]).
|
||||||
|
"#)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
assert_eq!(results.len(), 1);
|
||||||
|
assert!(results[0].is_ok());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5162,7 +5162,7 @@ impl Machine {
|
|||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn set_stream_options(&mut self) -> CallResult {
|
pub(crate) fn set_stream_options(&mut self) -> CallResult {
|
||||||
let mut stream = self.machine_st.get_stream_or_alias(
|
let stream = self.machine_st.get_stream_or_alias(
|
||||||
self.machine_st.registers[1],
|
self.machine_st.registers[1],
|
||||||
&self.indices,
|
&self.indices,
|
||||||
atom!("open"),
|
atom!("open"),
|
||||||
@@ -5174,10 +5174,12 @@ impl Machine {
|
|||||||
let reposition = self.machine_st.registers[4];
|
let reposition = self.machine_st.registers[4];
|
||||||
let stream_type = self.machine_st.registers[5];
|
let stream_type = self.machine_st.registers[5];
|
||||||
|
|
||||||
let options =
|
let new_options =
|
||||||
self.machine_st
|
self.machine_st
|
||||||
.get_stream_options(alias, eof_action, reposition, stream_type);
|
.get_stream_options(alias, eof_action, reposition, stream_type);
|
||||||
*stream.options_mut() = options;
|
self.indices.update_stream_options(stream, |options| {
|
||||||
|
*options = new_options;
|
||||||
|
});
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user