From: Mark Thom Date: Sun, 17 May 2020 05:00:37 +0000 (-0600) Subject: fix sign error in shl on fixnum with n >= 63 (#499) X-Git-Tag: v0.8.123~26 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=69706ecab04301d211f81120b802aaf95a3d189c;p=scryer-prolog.git fix sign error in shl on fixnum with n >= 63 (#499) --- diff --git a/src/prolog/machine/arithmetic_ops.rs b/src/prolog/machine/arithmetic_ops.rs index 32cad18a..f51785bd 100644 --- a/src/prolog/machine/arithmetic_ops.rs +++ b/src/prolog/machine/arithmetic_ops.rs @@ -781,8 +781,13 @@ impl MachineState { match (n1, n2) { (Number::Fixnum(n1), Number::Fixnum(n2)) => { if let Ok(n2) = u32::try_from(n2) { - if let Some(result) = n1.checked_shl(n2) { - return Ok(Number::from(result)); + if n2 < 63 { + if let Some(result) = n1.checked_shl(n2) { + return Ok(Number::from(result)); + } + } else { + let n1 = Integer::from(n1); + return Ok(Number::from(n1 << n2)); } } diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index 78e3215a..e9bab937 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -462,30 +462,33 @@ impl Machine { } wam.compile_scryerrc(); + wam.configure_streams(); - wam.current_input_stream.options.alias = Some(clause_name!("user_input")); + wam + } + + pub fn configure_streams(&mut self) { + self.current_input_stream.options.alias = Some(clause_name!("user_input")); - wam.indices.stream_aliases.insert( + self.indices.stream_aliases.insert( clause_name!("user_input"), - wam.current_input_stream.clone(), + self.current_input_stream.clone(), ); - wam.indices.streams.insert( - wam.current_input_stream.clone() + self.indices.streams.insert( + self.current_input_stream.clone() ); - wam.current_output_stream.options.alias = Some(clause_name!("user_output")); + self.current_output_stream.options.alias = Some(clause_name!("user_output")); - wam.indices.stream_aliases.insert( + self.indices.stream_aliases.insert( clause_name!("user_output"), - wam.current_output_stream.clone(), + self.current_output_stream.clone(), ); - wam.indices.streams.insert( - wam.current_output_stream.clone() + self.indices.streams.insert( + self.current_output_stream.clone() ); - - wam } #[inline] diff --git a/src/prolog/read.rs b/src/prolog/read.rs index 61065b80..5c295862 100644 --- a/src/prolog/read.rs +++ b/src/prolog/read.rs @@ -42,10 +42,16 @@ pub mod readline { } impl ReadlineStream { - pub fn input_stream(pending_input: String) -> Stream { + #[inline] + pub fn new(pending_input: String) -> Self { let mut rl = Editor::<()>::new(); rl.bind_sequence(KeyPress::Tab, Cmd::Insert(1, "\t".to_string())); - Stream::from(ReadlineStream { rl, pending_input: Cursor::new(pending_input) }) + ReadlineStream { rl, pending_input: Cursor::new(pending_input) } + } + + #[inline] + pub fn input_stream(pending_input: String) -> Stream { + Stream::from(Self::new(pending_input)) } fn call_readline(&mut self, buf: &mut [u8]) -> std::io::Result {