From 3143468751effdc06dd0f578235dc8a322737832 Mon Sep 17 00:00:00 2001 From: notoria Date: Thu, 6 Aug 2020 11:39:55 +0200 Subject: [PATCH] Fixed some conversion issues --- src/lib/builtins.pl | 1 + src/machine/system_calls.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index ebfebfff..df312708 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -918,6 +918,7 @@ op(Priority, OpSpec, Op) :- halt :- halt(0). halt(N) :- + must_be_number(N, halt/1), ( -2^31 =< N, N =< 2^31 - 1 -> '$halt'(N) ; throw(error(domain_error(exit_code, N), halt/1)) diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index c3488c2b..cfe45e80 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -1706,6 +1706,12 @@ impl MachineState { Ok(Number::Integer(n)) => { n.to_string() } + Ok(Number::Rational(r)) => { + // n has already been confirmed as an integer, and + // internally, Rational is assumed reduced, so its + // denominator must be 1. + r.numer().to_string() + } _ => { unreachable!() } @@ -3766,6 +3772,12 @@ impl MachineState { let code = match Number::try_from((code, &self.heap)) { Ok(Number::Fixnum(n)) => n as i32, Ok(Number::Integer(n)) => n.to_i32().unwrap(), + Ok(Number::Rational(r)) => { + // n has already been confirmed as an integer, and + // internally, Rational is assumed reduced, so its + // denominator must be 1. + r.numer().to_i32().unwrap() + } _ => { unreachable!() } }; -- 2.54.0