fix sign error in shl on fixnum with n >= 63 (#499)

This commit is contained in:
Mark Thom
2020-05-16 23:00:37 -06:00
parent 05d3b97eae
commit 69706ecab0
3 changed files with 40 additions and 26 deletions

View File

@@ -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));
}
}

View File

@@ -462,32 +462,35 @@ impl Machine {
}
wam.compile_scryerrc();
wam.current_input_stream.options.alias = Some(clause_name!("user_input"));
wam.indices.stream_aliases.insert(
clause_name!("user_input"),
wam.current_input_stream.clone(),
);
wam.indices.streams.insert(
wam.current_input_stream.clone()
);
wam.current_output_stream.options.alias = Some(clause_name!("user_output"));
wam.indices.stream_aliases.insert(
clause_name!("user_output"),
wam.current_output_stream.clone(),
);
wam.indices.streams.insert(
wam.current_output_stream.clone()
);
wam.configure_streams();
wam
}
pub fn configure_streams(&mut self) {
self.current_input_stream.options.alias = Some(clause_name!("user_input"));
self.indices.stream_aliases.insert(
clause_name!("user_input"),
self.current_input_stream.clone(),
);
self.indices.streams.insert(
self.current_input_stream.clone()
);
self.current_output_stream.options.alias = Some(clause_name!("user_output"));
self.indices.stream_aliases.insert(
clause_name!("user_output"),
self.current_output_stream.clone(),
);
self.indices.streams.insert(
self.current_output_stream.clone()
);
}
#[inline]
pub fn machine_flags(&self) -> MachineFlags {
self.machine_st.flags

View File

@@ -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<usize> {