NumberToCodes,
OpDeclaration,
Open,
+ SetStreamOptions,
NextStream,
PartialStringTail,
PeekByte,
&SystemClauseType::Halt => clause_name!("$halt"),
&SystemClauseType::HeadIsDynamic => clause_name!("$head_is_dynamic"),
&SystemClauseType::Open => clause_name!("$open"),
+ &SystemClauseType::SetStreamOptions => clause_name!("$set_stream_options"),
&SystemClauseType::OpDeclaration => clause_name!("$op"),
&SystemClauseType::InstallSCCCleaner => clause_name!("$install_scc_cleaner"),
&SystemClauseType::InstallInferenceCounter => {
("$number_to_codes", 2) => Some(SystemClauseType::NumberToCodes),
("$op", 3) => Some(SystemClauseType::OpDeclaration),
("$open", 7) => Some(SystemClauseType::Open),
+ ("$set_stream_options", 5) => Some(SystemClauseType::SetStreamOptions),
("$redo_attr_var_binding", 2) => Some(SystemClauseType::RedoAttrVarBinding),
("$remove_call_policy_check", 1) => Some(SystemClauseType::RemoveCallPolicyCheck),
("$remove_inference_counter", 2) => Some(SystemClauseType::RemoveInferenceCounter),
throw(error(uninstantiation_error(Stream), open/4)) % 8.11.5.3f)
;
parse_stream_options(StreamOptions, [Alias, EOFAction, Reposition, Type], open/4),
- '$open'(SourceSink, Mode, Stream, Alias, EOFAction, Reposition, Type)
+ ( SourceSink = stream(S0) ->
+ '$set_stream_options'(S0, Alias, EOFAction, Reposition, Type),
+ Stream = S0
+ ; '$open'(SourceSink, Mode, Stream, Alias, EOFAction, Reposition, Type)
+ )
).
self.bind(stream_var.as_var().unwrap(), stream);
}
+ &SystemClauseType::SetStreamOptions => {
+ let mut stream = self.get_stream_or_alias(
+ self[temp_v!(1)],
+ &indices.stream_aliases,
+ "open",
+ 4,
+ )?;
+
+ let alias = self[temp_v!(2)];
+ let eof_action = self[temp_v!(3)];
+ let reposition = self[temp_v!(4)];
+ let stream_type = self[temp_v!(5)];
+
+ let options = self.to_stream_options(alias, eof_action, reposition, stream_type);
+ *stream.options_mut() = options;
+ }
&SystemClauseType::TruncateIfNoLiftedHeapGrowthDiff => {
self.truncate_if_no_lifted_heap_diff(|h| Addr::HeapCell(h))
}