}
#[cfg(not(feature = "num"))]
{
- &**n1 == &**n2
+ (&**n1).num_eq(&**n2)
}
}
- (&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).eq(&n2),
- (&Number::Float(n1), &Number::Rational(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64().value())),
+ (&Number::Rational(ref n1), &Number::Float(n2)) => {
+ OrderedFloat(n1.to_f64().value()).eq(&n2)
+ }
+ (&Number::Float(n1), &Number::Rational(ref n2)) => {
+ n1.eq(&OrderedFloat(n2.to_f64().value()))
+ }
(&Number::Float(f1), &Number::Float(f2)) => f1.eq(&f2),
(&Number::Rational(ref r1), &Number::Rational(ref r2)) => r1.eq(&r2),
}
}
#[cfg(not(feature = "num"))]
{
- (&*n1).partial_cmp(&*n2).unwrap_or(Ordering::Less)
+ (&*n1).num_partial_cmp(&*n2).unwrap_or(Ordering::Less)
}
}
- (&Number::Rational(n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).cmp(&n2),
- (&Number::Float(n1), &Number::Rational(n2)) => n1.cmp(&OrderedFloat(n2.to_f64().value())),
+ (&Number::Rational(n1), &Number::Float(n2)) => {
+ OrderedFloat(n1.to_f64().value()).cmp(&n2)
+ }
+ (&Number::Float(n1), &Number::Rational(n2)) => {
+ n1.cmp(&OrderedFloat(n2.to_f64().value()))
+ }
(&Number::Float(f1), &Number::Float(f2)) => f1.cmp(&f2),
(&Number::Rational(r1), &Number::Rational(r2)) => (*r1).cmp(&*r2),
}
}
(Number::Integer(n1), Number::Fixnum(n2)) => match usize::try_from(n2.get_num()) {
Ok(n2) => Ok(Number::arena_from(Integer::from(&*n1 >> n2), arena)),
- _ => {
- Ok(Number::arena_from(Integer::from(&*n1 >> usize::max_value()),arena))
- },
+ _ => Ok(Number::arena_from(
+ Integer::from(&*n1 >> usize::max_value()),
+ arena,
+ )),
},
- (Number::Integer(n1), Number::Integer(n2)) => match n2.to_usize() {
- Some(n2) => Ok(Number::arena_from(Integer::from(&*n1 >> n2), arena)),
- _ => Ok(Number::arena_from(
- Integer::from(&*n1 >> usize::max_value()),
- arena,
- )),
+ (Number::Integer(n1), Number::Integer(n2)) => {
+ let result: Result<usize, _> = (&*n2).try_into();
+
+ match result {
+ Ok(n2) => {
+ Ok(Number::arena_from(Integer::from(&*n1 >> n2), arena))
+ }
+ Err(_) => {
+ Ok(Number::arena_from(Integer::from(&*n1 >> usize::max_value()), arena))
+ }
+ }
},
(Number::Integer(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
(Number::Fixnum(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
}
(Number::Integer(n1), Number::Fixnum(n2)) => match usize::try_from(n2.get_num()) {
Ok(n2) => Ok(Number::arena_from(Integer::from(&*n1 << n2), arena)),
- _ => {
- Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
- }
+ _ => Ok(Number::arena_from(
+ Integer::from(&*n1 << usize::max_value()),
+ arena,
+ )),
},
- (Number::Integer(n1), Number::Integer(n2)) => match n2.to_u32() {
- Some(n2) => Ok(Number::arena_from(
- Integer::from(n1.to_u64().unwrap() << n2),
- arena,
- )),
- _ => Ok(Number::arena_from(
- Integer::from(&*n1 << usize::max_value()),
- arena,
- )),
+ (Number::Integer(n1), Number::Integer(n2)) => match (&*n2).try_into() as Result<u32, _> {
+ Ok(n2) => {
+ let n1: u64 = (&*n1).try_into().unwrap();
+ Ok(Number::arena_from(Integer::from(n1 << n2), arena))
+ },
+ _ => {
+ Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
+ }
},
(Number::Integer(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
(Number::Fixnum(_), n2) => Err(numerical_type_error(ValidType::Integer, n2, stub_gen)),
let addr = self.store(self.deref(addr));
match Number::try_from(addr) {
- Ok(Number::Fixnum(n)) => {
- match u32::try_from(n.get_num()) {
- Ok(n) => {
- if let Some(c) = std::char::from_u32(n) {
- string.push(c);
- continue;
- }
+ Ok(Number::Fixnum(n)) => match u32::try_from(n.get_num()) {
+ Ok(n) => {
+ if let Some(c) = std::char::from_u32(n) {
+ string.push(c);
+ continue;
}
- _ => {}
}
- }
+ _ => {}
+ },
Ok(Number::Integer(n)) => {
- if let Some(c) = n.to_u32().and_then(std::char::from_u32) {
+ let n: u32 = (&*n).try_into().unwrap();
+ if let Some(c) = std::char::from_u32(n) {
string.push(c);
continue;
}
#[cfg(feature = "http")]
#[inline(always)]
pub(crate) fn http_answer(&mut self) -> CallResult {
- let culprit = self.deref_register(1);
- let status_code = self.deref_register(2);
- let status_code: u16 = match Number::try_from(status_code) {
- Ok(Number::Fixnum(n)) => n.get_num() as u16,
- Ok(Number::Integer(n)) => match n.to_u16() {
- Some(u) => u,
- _ => {
- self.machine_st.fail = true;
- return Ok(());
- }
- },
- _ => unreachable!(),
- };
- let stub_gen = || functor_stub(atom!("http_listen"), 2);
- let headers = match self
- .machine_st
- .try_from_list(self.machine_st.registers[3], stub_gen)
- {
+ let culprit = self.deref_register(1);
+ let status_code = self.deref_register(2);
+ let status_code: u16 = match Number::try_from(status_code) {
+ Ok(Number::Fixnum(n)) => n.get_num() as u16,
+ Ok(Number::Integer(n)) => {
+ let n: Result<u16, _> = (&*n).try_into();
+
+ if let Ok(value) = n {
+ value
+ } else {
+ self.machine_st.fail = true;
+ return Ok(());
+ }
+ }
+ _ => unreachable!()
+ };
+ let stub_gen = || functor_stub(atom!("http_listen"), 2);
+ let headers = match self.machine_st.try_from_list(self.machine_st.registers[3], stub_gen) {
Ok(addrs) => {
let mut header_map = HeaderMap::new();
- for heap_cell in addrs{
- read_heap_cell!(heap_cell,
- (HeapCellValueTag::Str, s) => {
- let name = cell_as_atom_cell!(self.machine_st.heap[s]).get_name();
- let value = self.machine_st.value_to_str_like(self.machine_st.heap[s + 1]).unwrap();
- header_map.insert(HeaderName::from_str(name.as_str()).unwrap(), HeaderValue::from_str(value.as_str()).unwrap());
- }
- _ => {
- unreachable!()
- }
- )
+ for heap_cell in addrs {
+ read_heap_cell!(heap_cell,
+ (HeapCellValueTag::Str, s) => {
+ let name = cell_as_atom_cell!(self.machine_st.heap[s]).get_name();
+ let value = self.machine_st.value_to_str_like(self.machine_st.heap[s + 1]).unwrap();
+ header_map.insert(HeaderName::from_str(&*name.as_str()).unwrap(), HeaderValue::from_str(&*value.as_str()).unwrap());
+ }
+ _ => {
+ unreachable!()
+ }
+ )
}
header_map
- },
- Err(e) => return Err(e)
+ }
+ Err(e) => return Err(e),
};
- let stream_addr = self.deref_register(4);
-
- read_heap_cell!(culprit,
- (HeapCellValueTag::Cons, cons_ptr) => {
- match_untyped_arena_ptr!(cons_ptr,
- (ArenaHeaderTag::HttpResponse, http_response) => {
- let mut stream = Stream::from_http_sender(
- http_response,
- status_code,
- headers,
- &mut self.machine_st.arena
- );
- *stream.options_mut() = StreamOptions::default();
- stream.options_mut().set_stream_type(StreamType::Binary);
- self.indices.streams.insert(stream);
- let stream = stream_as_cell!(stream);
- self.machine_st.bind(stream_addr.as_var().unwrap(), stream);
- }
- _ => {
- unreachable!();
- }
- );
- }
- _ => {
- unreachable!();
- }
- );
-
- Ok(())
+ let stream_addr = self.deref_register(4);
+
+ read_heap_cell!(culprit,
+ (HeapCellValueTag::Cons, cons_ptr) => {
+ match_untyped_arena_ptr!(cons_ptr,
+ (ArenaHeaderTag::HttpResponse, http_response) => {
+ let mut stream = Stream::from_http_sender(
+ http_response,
+ status_code,
+ headers,
+ &mut self.machine_st.arena
+ );
+ *stream.options_mut() = StreamOptions::default();
+ stream.options_mut().set_stream_type(StreamType::Binary);
+ self.indices.streams.insert(stream);
+ let stream = stream_as_cell!(stream);
+ self.machine_st.bind(stream_addr.as_var().unwrap(), stream);
+ }
+ _ => {
+ unreachable!();
+ }
+ );
+ }
+ _ => {
+ unreachable!();
+ }
+ );
+
+ Ok(())
}
#[cfg(feature = "ffi")]
let n = match Number::try_from(a2) {
Ok(Number::Fixnum(bp)) => bp.get_num() as usize,
- Ok(Number::Integer(n)) => n.to_usize().unwrap(),
+ Ok(Number::Integer(n)) => {
+ let value: usize = (&*n).try_into().unwrap();
+ value
+ },
_ => {
- let stub = functor_stub(
- atom!("call_with_inference_limit"),
- 3,
- );
+ let stub = functor_stub(atom!("call_with_inference_limit"), 3);
let err = self.machine_st.type_error(ValidType::Integer, a2);
return Err(self.machine_st.error_form(err, stub));
let a3 = self.deref_register(3);
let arity = match Number::try_from(a3) {
- Ok(Number::Fixnum(n)) => n.get_num() as usize,
+ Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => {
- if let Some(n) = n.to_usize() {
- n
+ let result = (&*n).try_into();
+
+ if let Ok(value) = result {
+ value
} else {
return false;
}
pub(crate) fn set_seed(&mut self) {
let seed = self.deref_register(1);
-
match Number::try_from(seed) {
Ok(Number::Fixnum(n)) => {
- let _: StdRng = SeedableRng::seed_from_u64(Integer::from(n).to_u64().unwrap());
- }
+ let n: u64 = Integer::from(n).try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
+ },
Ok(Number::Integer(n)) => {
- let _: StdRng = SeedableRng::seed_from_u64(n.to_u64().unwrap());
- }
+ let n: u64 = (&*n).try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
+ },
Ok(Number::Rational(n)) => {
if n.denominator() == &UBig::from(1 as u32) {
- let _: StdRng = SeedableRng::seed_from_u64(n.numerator().to_u64().unwrap());
+ let n: u64 = n.numerator().try_into().unwrap();
+ let _: StdRng = SeedableRng::seed_from_u64(n);
}
- },
+ }
_ => {
self.machine_st.fail = true;
}