}
}
- pub fn options_mut(&mut self) -> &mut StreamOptions {
+ pub(super) fn options_mut(&mut self) -> &mut StreamOptions {
match self {
Stream::Byte(ref mut ptr) => &mut ptr.options,
Stream::InputFile(ref mut ptr) => &mut ptr.options,
assert_eq!(results.len(), 1);
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());
+ }
}
#[inline(always)]
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.indices,
atom!("open"),
let reposition = self.machine_st.registers[4];
let stream_type = self.machine_st.registers[5];
- let options =
+ let new_options =
self.machine_st
.get_stream_options(alias, eof_action, reposition, stream_type);
- *stream.options_mut() = options;
+ self.indices.update_stream_options(stream, |options| {
+ *options = new_options;
+ });
Ok(())
}