-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::temp_v;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::temp_v;
use crate::fixtures::*;
use crate::forms::*;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::{atom, clause_name};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::{atom, clause_name};
use crate::clause_types::*;
use crate::fixtures::*;
use crate::machine::machine_errors::*;
use crate::machine::machine_indices::*;
-use crate::ordered_float::*;
use crate::rug::ops::PowAssign;
use crate::rug::{Assign, Integer, Rational};
+use ordered_float::*;
use std::cell::Cell;
use std::cmp::{max, min, Ordering};
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::{clause_name, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::{clause_name, temp_v};
use crate::forms::Number;
use crate::machine::machine_indices::*;
use crate::rug::rand::RandState;
-use crate::ref_thread_local::{ref_thread_local, RefThreadLocal};
+use ref_thread_local::{ref_thread_local, RefThreadLocal};
use std::collections::BTreeMap;
/// Code generation to WAM-like instructions.
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::tabled_rc::TabledData;
-use crate::prolog_parser_rebis::{perm_v, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::tabled_rc::TabledData;
+use prolog_parser_rebis::{perm_v, temp_v};
use crate::allocator::*;
use crate::arithmetic::*;
use crate::machine::machine_errors::*;
-use crate::indexmap::{IndexMap, IndexSet};
+use indexmap::{IndexMap, IndexSet};
use std::cell::Cell;
use std::collections::VecDeque;
-use crate::indexmap::IndexMap;
+use indexmap::IndexMap;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::temp_v;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::temp_v;
use crate::allocator::*;
use crate::fixtures::*;
-use crate::prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::ast::*;
use crate::forms::*;
use crate::instructions::*;
use crate::iterators::*;
-use crate::indexmap::{IndexMap, IndexSet};
+use indexmap::{IndexMap, IndexSet};
use std::cell::Cell;
use std::collections::BTreeSet;
type VariableFixture<'a> = (VarStatus, Vec<&'a Cell<VarReg>>);
#[derive(Debug)]
-pub struct VariableFixtures<'a>{
+pub struct VariableFixtures<'a> {
perm_vars: IndexMap<Rc<Var>, VariableFixture<'a>>,
- last_chunk_temp_vars: IndexSet<Rc<Var>>
+ last_chunk_temp_vars: IndexSet<Rc<Var>>,
}
impl<'a> VariableFixtures<'a> {
pub fn new() -> Self {
VariableFixtures {
perm_vars: IndexMap::new(),
- last_chunk_temp_vars: IndexSet::new()
+ last_chunk_temp_vars: IndexSet::new(),
}
-
}
pub fn insert(&mut self, var: Rc<Var>, vs: VariableFixture<'a>) {
pub fn new() -> Self {
UnsafeVarMarker {
unsafe_vars: IndexMap::new(),
- safe_vars: IndexSet::new()
+ safe_vars: IndexSet::new(),
}
}
pub fn from_safe_vars(safe_vars: IndexSet<RegType>) -> Self {
UnsafeVarMarker {
unsafe_vars: IndexMap::new(),
- safe_vars
+ safe_vars,
}
}
pub fn mark_safe_vars(&mut self, query_instr: &QueryInstruction) -> bool {
match query_instr {
&QueryInstruction::PutVariable(r @ RegType::Temp(_), _)
- | &QueryInstruction::SetVariable(r) => {
+ | &QueryInstruction::SetVariable(r) => {
self.safe_vars.insert(r);
true
}
- _ => {
- false
- }
+ _ => false,
}
}
pub fn mark_phase(&mut self, query_instr: &QueryInstruction, phase: usize) {
match query_instr {
&QueryInstruction::PutValue(r @ RegType::Perm(_), _)
- | &QueryInstruction::SetValue(r) => {
+ | &QueryInstruction::SetValue(r) => {
let p = self.unsafe_vars.entry(r).or_insert(0);
*p = phase;
}
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::parser::OpDesc;
-use crate::prolog_parser_rebis::{clause_name, is_infix, is_postfix};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::parser::OpDesc;
+use prolog_parser_rebis::{clause_name, is_infix, is_postfix};
use crate::clause_types::*;
use crate::machine::machine_errors::*;
use crate::machine::machine_indices::*;
-use crate::ordered_float::OrderedFloat;
use crate::rug::{Integer, Rational};
+use ordered_float::OrderedFloat;
-use crate::indexmap::{IndexMap, IndexSet};
+use indexmap::{IndexMap, IndexSet};
use slice_deque::*;
use crate::machine::machine_indices::*;
use crate::machine::machine_state::*;
-use crate::indexmap::IndexSet;
+use indexmap::IndexSet;
use std::cmp::Ordering;
use std::ops::Deref;
fn follow_heap(&mut self, h: usize) -> Addr {
match &self.machine_st.heap[h] {
&HeapCellValue::NamedStr(arity, _, _) => {
- for idx in (1 .. arity + 1).rev() {
+ for idx in (1..arity + 1).rev() {
self.state_stack.push(Addr::HeapCell(h + idx));
}
Addr::Str(h)
}
- &HeapCellValue::Addr(a) => {
- self.follow(a)
- }
- HeapCellValue::PartialString(..) => {
- self.follow(Addr::PStrLocation(h, 0))
- }
- HeapCellValue::Atom(..) | HeapCellValue::DBRef(_)
- | HeapCellValue::Integer(_) | HeapCellValue::Rational(_) => {
- Addr::Con(h)
- }
- HeapCellValue::LoadStatePayload(_) => {
- Addr::LoadStatePayload(h)
- }
- HeapCellValue::Stream(_) => {
- Addr::Stream(h)
- }
- HeapCellValue::TcpListener(_) => {
- Addr::TcpListener(h)
- }
+ &HeapCellValue::Addr(a) => self.follow(a),
+ HeapCellValue::PartialString(..) => self.follow(Addr::PStrLocation(h, 0)),
+ HeapCellValue::Atom(..)
+ | HeapCellValue::DBRef(_)
+ | HeapCellValue::Integer(_)
+ | HeapCellValue::Rational(_) => Addr::Con(h),
+ HeapCellValue::LoadStatePayload(_) => Addr::LoadStatePayload(h),
+ HeapCellValue::Stream(_) => Addr::Stream(h),
+ HeapCellValue::TcpListener(_) => Addr::TcpListener(h),
}
}
da
}
Addr::PStrLocation(h, n) => {
- if let &HeapCellValue::PartialString(ref pstr, has_tail) = &self.machine_st.heap[h] {
- if let Some(c) = pstr.range_from(n ..).next() {
+ if let &HeapCellValue::PartialString(ref pstr, has_tail) = &self.machine_st.heap[h]
+ {
+ if let Some(c) = pstr.range_from(n..).next() {
if !pstr.at_end(n + c.len_utf8()) {
- self.state_stack.push(Addr::PStrLocation(h, n + c.len_utf8()));
+ self.state_stack
+ .push(Addr::PStrLocation(h, n + c.len_utf8()));
} else if has_tail {
self.state_stack.push(Addr::HeapCell(h + 1));
} else {
self.follow_heap(s) // record terms of structure.
}
Addr::Con(h) => {
- if let &HeapCellValue::PartialString(ref pstr, has_tail) = &self.machine_st.heap[h] {
- if let Some(c) = pstr.range_from(0 ..).next() {
+ if let &HeapCellValue::PartialString(ref pstr, has_tail) = &self.machine_st.heap[h]
+ {
+ if let Some(c) = pstr.range_from(0..).next() {
self.state_stack.push(Addr::PStrLocation(h, c.len_utf8()));
self.state_stack.push(Addr::Char(c));
Addr::Con(h)
}
}
- da => {
- da
- }
+ da => da,
}
}
}
}
}
-pub trait MutStackHCIterator<'b> where Self: Iterator
+pub trait MutStackHCIterator<'b>
+where
+ Self: Iterator,
{
type MutStack;
}
&HeapCellValue::Addr(Addr::PStrLocation(h, n)) => {
match &self.machine_st.heap[h] {
- &HeapCellValue::PartialString(..) => {// ref pstr, _) => {
+ &HeapCellValue::PartialString(..) => {
+ // ref pstr, _) => {
/*
let c = pstr.range_from(n ..).next().unwrap();
let next_n = n + c.len_utf8();
HCPostOrderIterator::new(HCPreOrderIterator::new(self, a))
}
- pub fn acyclic_pre_order_iter<'a>(&'a self, a: Addr,) -> HCAcyclicIterator<'a> {
+ pub fn acyclic_pre_order_iter<'a>(&'a self, a: Addr) -> HCAcyclicIterator<'a> {
HCAcyclicIterator::new(HCPreOrderIterator::new(self, a))
}
}
}
-impl<'a> Iterator for HCAcyclicIterator<'a>
-{
+impl<'a> Iterator for HCAcyclicIterator<'a> {
type Item = Addr;
fn next(&mut self) -> Option<Self::Item> {
}
}
-impl<'a> Iterator for HCZippedAcyclicIterator<'a>
-{
+impl<'a> Iterator for HCZippedAcyclicIterator<'a> {
type Item = (Addr, Addr);
fn next(&mut self) -> Option<Self::Item> {
self.first_to_expire = Ordering::Less;
None
}
- _ => {
- None
- }
+ _ => None,
}
}
}
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::{
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::{
alpha_char, alpha_numeric_char, backslash_char, capital_letter_char, char_class, clause_name,
cut_char, decimal_digit_char, graphic_char, graphic_token_char, is_fx, is_infix, is_postfix,
is_prefix, is_xf, is_xfx, is_xfy, is_yfx, semicolon_char, sign_char, single_quote_char,
use crate::machine::machine_indices::*;
use crate::machine::machine_state::*;
use crate::machine::streams::*;
-use crate::ordered_float::OrderedFloat;
use crate::rug::{Integer, Rational};
+use ordered_float::OrderedFloat;
-use crate::indexmap::{IndexMap, IndexSet};
+use indexmap::{IndexMap, IndexSet};
use std::cell::Cell;
use std::convert::TryFrom;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::clause_name;
-use crate::prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::tabled_rc::*;
use crate::forms::*;
use crate::instructions::*;
-use crate::indexmap::IndexMap;
use crate::rug::Integer;
+use indexmap::IndexMap;
use slice_deque::{sdeq, SliceDeque};
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::clause_name;
use crate::clause_types::*;
use crate::forms::*;
use crate::machine::machine_indices::*;
use crate::rug::Integer;
-use crate::indexmap::IndexMap;
+use indexmap::IndexMap;
use slice_deque::SliceDeque;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::rc_atom;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::rc_atom;
use crate::clause_types::*;
use crate::forms::*;
-use crate::divrem::*;
+use divrem::*;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::clause_name;
use crate::arithmetic::*;
use crate::clause_types::*;
use crate::machine::machine_errors::*;
use crate::machine::machine_indices::*;
use crate::machine::machine_state::*;
-use crate::ordered_float::*;
use crate::rug::{Integer, Rational};
+use ordered_float::*;
use std::cmp;
use std::convert::TryFrom;
use crate::heap_iter::*;
use crate::machine::*;
-use crate::prolog_parser_rebis::temp_v;
+use prolog_parser_rebis::temp_v;
-use crate::indexmap::IndexSet;
+use indexmap::IndexSet;
use std::cmp::Ordering;
use std::vec::IntoIter;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::clause_name;
use crate::codegen::*;
use crate::debray_allocator::*;
use core::marker::PhantomData;
-use crate::prolog_parser_rebis::ast::Constant;
+use prolog_parser_rebis::ast::Constant;
use crate::machine::machine_indices::*;
use crate::machine::partial_string::*;
}
#[derive(Debug)]
-pub(crate)
-struct HeapIntoIter<T: RawBlockTraits> {
+pub(crate) struct HeapIntoIter<T: RawBlockTraits> {
offset: usize,
buf: RawBlock<T>,
}
impl<T: RawBlockTraits> Drop for HeapIntoIter<T> {
fn drop(&mut self) {
- let mut heap =
- HeapTemplate { buf: self.buf.take(), _marker: PhantomData };
+ let mut heap = HeapTemplate {
+ buf: self.buf.take(),
+ _marker: PhantomData,
+ };
heap.truncate(self.offset / mem::size_of::<HeapCellValue>());
heap.buf.deallocate();
self.offset += mem::size_of::<HeapCellValue>();
if ptr < self.buf.top as usize {
- unsafe {
- Some(ptr::read(ptr as *const HeapCellValue))
- }
+ unsafe { Some(ptr::read(ptr as *const HeapCellValue)) }
} else {
None
}
}
#[derive(Debug)]
-pub(crate)
-struct HeapIter<'a, T: RawBlockTraits> {
+pub(crate) struct HeapIter<'a, T: RawBlockTraits> {
offset: usize,
buf: &'a RawBlock<T>,
}
impl<'a, T: RawBlockTraits> HeapIter<'a, T> {
- pub(crate)
- fn new(buf: &'a RawBlock<T>, offset: usize) -> Self {
+ pub(crate) fn new(buf: &'a RawBlock<T>, offset: usize) -> Self {
HeapIter { buf, offset }
}
}
self.offset += mem::size_of::<HeapCellValue>();
if ptr < self.buf.top as usize {
- unsafe {
- Some(&*(ptr as *const _))
- }
+ unsafe { Some(&*(ptr as *const _)) }
} else {
None
}
}
#[allow(dead_code)]
-pub(crate)
-fn print_heap_terms<'a, I: Iterator<Item = &'a HeapCellValue>>(heap: I, h: usize) {
+pub(crate) fn print_heap_terms<'a, I: Iterator<Item = &'a HeapCellValue>>(heap: I, h: usize) {
for (index, term) in heap.enumerate() {
println!("{} : {}", h + index, term);
}
}
#[derive(Debug)]
-pub(crate)
-struct HeapIterMut<'a, T: RawBlockTraits> {
+pub(crate) struct HeapIterMut<'a, T: RawBlockTraits> {
offset: usize,
buf: &'a mut RawBlock<T>,
}
impl<'a, T: RawBlockTraits> HeapIterMut<'a, T> {
- pub(crate)
- fn new(buf: &'a mut RawBlock<T>, offset: usize) -> Self {
+ pub(crate) fn new(buf: &'a mut RawBlock<T>, offset: usize) -> Self {
HeapIterMut { buf, offset }
}
}
self.offset += mem::size_of::<HeapCellValue>();
if ptr < self.buf.top as usize {
- unsafe {
- Some(&mut *(ptr as *mut _))
- }
+ unsafe { Some(&mut *(ptr as *mut _)) }
} else {
None
}
impl<T: RawBlockTraits> HeapTemplate<T> {
#[inline]
- pub(crate)
- fn new() -> Self {
- HeapTemplate { buf: RawBlock::new(), _marker: PhantomData }
+ pub(crate) fn new() -> Self {
+ HeapTemplate {
+ buf: RawBlock::new(),
+ _marker: PhantomData,
+ }
}
#[inline]
- pub(crate)
- fn clone(&self, h: usize) -> HeapCellValue {
+ pub(crate) fn clone(&self, h: usize) -> HeapCellValue {
match &self[h] {
- &HeapCellValue::Addr(addr) => {
- HeapCellValue::Addr(addr)
- }
- &HeapCellValue::Atom(ref name, ref op) => {
- HeapCellValue::Atom(name.clone(), op.clone())
- }
- &HeapCellValue::DBRef(ref db_ref) => {
- HeapCellValue::DBRef(db_ref.clone())
- }
- &HeapCellValue::Integer(ref n) => {
- HeapCellValue::Integer(n.clone())
- }
- &HeapCellValue::LoadStatePayload(_) => {
- HeapCellValue::Addr(Addr::LoadStatePayload(h))
- }
+ &HeapCellValue::Addr(addr) => HeapCellValue::Addr(addr),
+ &HeapCellValue::Atom(ref name, ref op) => HeapCellValue::Atom(name.clone(), op.clone()),
+ &HeapCellValue::DBRef(ref db_ref) => HeapCellValue::DBRef(db_ref.clone()),
+ &HeapCellValue::Integer(ref n) => HeapCellValue::Integer(n.clone()),
+ &HeapCellValue::LoadStatePayload(_) => HeapCellValue::Addr(Addr::LoadStatePayload(h)),
&HeapCellValue::NamedStr(arity, ref name, ref op) => {
HeapCellValue::NamedStr(arity, name.clone(), op.clone())
}
- &HeapCellValue::PartialString(..) => {
- HeapCellValue::Addr(Addr::PStrLocation(h, 0))
- }
- &HeapCellValue::Rational(ref r) => {
- HeapCellValue::Rational(r.clone())
- }
- &HeapCellValue::Stream(_) => {
- HeapCellValue::Addr(Addr::Stream(h))
- }
- &HeapCellValue::TcpListener(_) => {
- HeapCellValue::Addr(Addr::TcpListener(h))
- }
+ &HeapCellValue::PartialString(..) => HeapCellValue::Addr(Addr::PStrLocation(h, 0)),
+ &HeapCellValue::Rational(ref r) => HeapCellValue::Rational(r.clone()),
+ &HeapCellValue::Stream(_) => HeapCellValue::Addr(Addr::Stream(h)),
+ &HeapCellValue::TcpListener(_) => HeapCellValue::Addr(Addr::TcpListener(h)),
}
}
#[inline]
- pub(crate)
- fn put_complete_string(&mut self, s: &str) -> Addr {
+ pub(crate) fn put_complete_string(&mut self, s: &str) -> Addr {
if s.is_empty() {
return Addr::EmptyList;
}
}
#[inline]
- pub(crate)
- fn put_constant(&mut self, c: Constant) -> Addr {
+ pub(crate) fn put_constant(&mut self, c: Constant) -> Addr {
match c {
- Constant::Atom(name, op) => {
- Addr::Con(self.push(HeapCellValue::Atom(name, op)))
- }
- Constant::Char(c) => {
- Addr::Char(c)
- }
- Constant::EmptyList => {
- Addr::EmptyList
- }
- Constant::Fixnum(n) => {
- Addr::Fixnum(n)
- }
- Constant::Integer(n) => {
- Addr::Con(self.push(HeapCellValue::Integer(n)))
- }
- Constant::Rational(r) => {
- Addr::Con(self.push(HeapCellValue::Rational(r)))
- }
- Constant::Float(f) => {
- Addr::Float(f)
- }
+ Constant::Atom(name, op) => Addr::Con(self.push(HeapCellValue::Atom(name, op))),
+ Constant::Char(c) => Addr::Char(c),
+ Constant::EmptyList => Addr::EmptyList,
+ Constant::Fixnum(n) => Addr::Fixnum(n),
+ Constant::Integer(n) => Addr::Con(self.push(HeapCellValue::Integer(n))),
+ Constant::Rational(r) => Addr::Con(self.push(HeapCellValue::Rational(r))),
+ Constant::Float(f) => Addr::Float(f),
Constant::String(s) => {
if s.is_empty() {
Addr::EmptyList
self.put_complete_string(&s)
}
}
- Constant::Usize(n) => {
- Addr::Usize(n)
- }
+ Constant::Usize(n) => Addr::Usize(n),
}
}
#[inline]
- pub(crate)
- fn pop(&mut self) {
+ pub(crate) fn pop(&mut self) {
let h = self.h();
if h > 0 {
}
#[inline]
- pub(crate)
- fn push(&mut self, val: HeapCellValue) -> usize {
+ pub(crate) fn push(&mut self, val: HeapCellValue) -> usize {
let h = self.h();
unsafe {
}
#[inline]
- pub(crate)
- fn atom_at(&self, h: usize) -> bool {
+ pub(crate) fn atom_at(&self, h: usize) -> bool {
if let HeapCellValue::Atom(..) = &self[h] {
true
} else {
}
#[inline]
- pub(crate)
- fn to_unifiable(&mut self, non_heap_value: HeapCellValue) -> Addr {
+ pub(crate) fn to_unifiable(&mut self, non_heap_value: HeapCellValue) -> Addr {
match non_heap_value {
- HeapCellValue::Addr(addr) => {
- addr
- }
- val @ HeapCellValue::Atom(..) |
- val @ HeapCellValue::Integer(_) |
- val @ HeapCellValue::DBRef(_) |
- val @ HeapCellValue::Rational(_) => {
- Addr::Con(self.push(val))
- }
- val @ HeapCellValue::LoadStatePayload(_) => {
- Addr::LoadStatePayload(self.push(val))
- }
- val @ HeapCellValue::NamedStr(..) => {
- Addr::Str(self.push(val))
- }
+ HeapCellValue::Addr(addr) => addr,
+ val @ HeapCellValue::Atom(..)
+ | val @ HeapCellValue::Integer(_)
+ | val @ HeapCellValue::DBRef(_)
+ | val @ HeapCellValue::Rational(_) => Addr::Con(self.push(val)),
+ val @ HeapCellValue::LoadStatePayload(_) => Addr::LoadStatePayload(self.push(val)),
+ val @ HeapCellValue::NamedStr(..) => Addr::Str(self.push(val)),
HeapCellValue::PartialString(pstr, has_tail) => {
let h = self.push(HeapCellValue::PartialString(pstr, has_tail));
Addr::Con(h)
}
- val @ HeapCellValue::Stream(..) => {
- Addr::Stream(self.push(val))
- }
- val @ HeapCellValue::TcpListener(..) => {
- Addr::TcpListener(self.push(val))
- }
+ val @ HeapCellValue::Stream(..) => Addr::Stream(self.push(val)),
+ val @ HeapCellValue::TcpListener(..) => Addr::TcpListener(self.push(val)),
}
}
#[inline]
- pub(crate)
- fn allocate_pstr(&mut self, src: &str) -> Addr {
- self.write_pstr(src)
- .unwrap_or_else(|| Addr::EmptyList)
+ pub(crate) fn allocate_pstr(&mut self, src: &str) -> Addr {
+ self.write_pstr(src).unwrap_or_else(|| Addr::EmptyList)
}
#[inline]
let h = self.h();
- let (pstr, rest_src) =
- match PartialString::new(src) {
- Some(tuple) => {
- tuple
+ let (pstr, rest_src) = match PartialString::new(src) {
+ Some(tuple) => tuple,
+ None => {
+ if src.len() > '\u{0}'.len_utf8() {
+ src = &src['\u{0}'.len_utf8()..];
+ continue;
+ } else if orig_h == h {
+ return None;
+ } else {
+ self[h - 1] = HeapCellValue::Addr(Addr::HeapCell(h - 1));
+ return Some(Addr::PStrLocation(orig_h, 0));
}
- None => {
- if src.len() > '\u{0}'.len_utf8() {
- src = &src['\u{0}'.len_utf8() ..];
- continue;
- } else if orig_h == h {
- return None;
- } else {
- self[h - 1] = HeapCellValue::Addr(Addr::HeapCell(h - 1));
- return Some(Addr::PStrLocation(orig_h, 0));
- }
- }
- };
+ }
+ };
self.push(HeapCellValue::PartialString(pstr, true));
}
#[inline]
- pub(crate)
- fn truncate(&mut self, h: usize) {
+ pub(crate) fn truncate(&mut self, h: usize) {
let new_top = h * mem::size_of::<HeapCellValue>() + self.buf.base as usize;
let mut h = new_top;
}
#[inline]
- pub(crate)
- fn h(&self) -> usize {
+ pub(crate) fn h(&self) -> usize {
(self.buf.top as usize - self.buf.base as usize) / mem::size_of::<HeapCellValue>()
}
- pub(crate)
- fn append(&mut self, vals: Vec<HeapCellValue>) {
+ pub(crate) fn append(&mut self, vals: Vec<HeapCellValue>) {
for val in vals {
self.push(val);
}
}
- pub(crate)
- fn clear(&mut self) {
+ pub(crate) fn clear(&mut self) {
if !self.buf.base.is_null() {
self.truncate(0);
self.buf.top = self.buf.base;
}
}
- pub(crate)
- fn to_list<Iter, SrcT>(&mut self, values: Iter) -> usize
- where Iter: Iterator<Item = SrcT>,
- SrcT: Into<HeapCellValue>
+ pub(crate) fn to_list<Iter, SrcT>(&mut self, values: Iter) -> usize
+ where
+ Iter: Iterator<Item = SrcT>,
+ SrcT: Into<HeapCellValue>,
{
let head_addr = self.h();
let mut h = head_addr;
}
/* Create an iterator starting from the passed offset. */
- pub(crate)
- fn iter_from<'a>(&'a self, offset: usize) -> HeapIter<'a, T> {
+ pub(crate) fn iter_from<'a>(&'a self, offset: usize) -> HeapIter<'a, T> {
HeapIter::new(&self.buf, offset * mem::size_of::<HeapCellValue>())
}
- pub(crate)
- fn iter_mut_from<'a>(&'a mut self, offset: usize) -> HeapIterMut<'a, T> {
+ pub(crate) fn iter_mut_from<'a>(&'a mut self, offset: usize) -> HeapIterMut<'a, T> {
HeapIterMut::new(&mut self.buf, offset * mem::size_of::<HeapCellValue>())
}
- pub(crate)
- fn into_iter(mut self) -> HeapIntoIter<T> {
- HeapIntoIter { buf: self.buf.take(), offset: 0 }
+ pub(crate) fn into_iter(mut self) -> HeapIntoIter<T> {
+ HeapIntoIter {
+ buf: self.buf.take(),
+ offset: 0,
+ }
}
- pub(crate)
- fn extend<Iter: Iterator<Item = HeapCellValue>>(&mut self, iter: Iter) {
+ pub(crate) fn extend<Iter: Iterator<Item = HeapCellValue>>(&mut self, iter: Iter) {
for hcv in iter {
self.push(hcv);
}
}
- pub(crate)
- fn to_local_code_ptr(&self, addr: &Addr) -> Option<LocalCodePtr> {
+ pub(crate) fn to_local_code_ptr(&self, addr: &Addr) -> Option<LocalCodePtr> {
let extract_integer = |s: usize| -> Option<usize> {
match &self[s] {
&HeapCellValue::Addr(Addr::Fixnum(n)) => usize::try_from(n).ok(),
&HeapCellValue::Integer(ref n) => n.to_usize(),
- _ => None
+ _ => None,
}
};
match &self[*s] {
HeapCellValue::NamedStr(arity, ref name, _) => {
match (name.as_str(), *arity) {
- ("dir_entry", 1) => {
- extract_integer(s+1).map(LocalCodePtr::DirEntry)
- }
+ ("dir_entry", 1) => extract_integer(s + 1).map(LocalCodePtr::DirEntry),
/*
("top_level", 2) => {
if let Some(chunk_num) = extract_integer(s+1) {
None
}
*/
- _ => {
- None
- }
+ _ => None,
}
}
- _ => unreachable!()
+ _ => unreachable!(),
}
}
- _ => None
+ _ => None,
}
}
&Addr::Con(h) | &Addr::Str(h) | &Addr::Stream(h) | &Addr::TcpListener(h) => {
RefOrOwned::Borrowed(&self[h])
}
- addr => {
- RefOrOwned::Owned(HeapCellValue::Addr(*addr))
- }
+ addr => RefOrOwned::Owned(HeapCellValue::Addr(*addr)),
}
}
}
use crate::machine::machine_indices::*;
use crate::machine::*;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::clause_name;
use crate::machine::term_stream::*;
use indexmap::IndexSet;
-use crate::ref_thread_local::RefThreadLocal;
+use ref_thread_local::RefThreadLocal;
type ModuleOpExports = Vec<(OpDecl, Option<(usize, Specifier)>)>;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::{clause_name, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::{clause_name, temp_v};
use crate::forms::{ModuleSource, Number}; //, PredicateKey};
use crate::machine::heap::*;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::clause_name;
use crate::clause_types::*;
use crate::fixtures::*;
use crate::machine::term_stream::LoadStatePayload;
use crate::machine::Ball;
use crate::machine::CompilationTarget;
-use crate::ordered_float::OrderedFloat;
use crate::rug::{Integer, Rational};
+use ordered_float::OrderedFloat;
-use crate::indexmap::IndexMap;
+use indexmap::IndexMap;
use std::cell::Cell;
use std::cmp::Ordering;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::tabled_rc::*;
-use crate::prolog_parser_rebis::{clause_name, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::{clause_name, temp_v};
use crate::clause_types::*;
use crate::forms::*;
use crate::machine::streams::*;
use crate::rug::Integer;
-use crate::downcast::{
+use downcast::{
downcast, downcast_methods, downcast_methods_core, downcast_methods_std, impl_downcast, Any,
};
-use crate::indexmap::IndexMap;
+use indexmap::IndexMap;
use std::cmp::Ordering;
use std::convert::TryFrom;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::tabled_rc::*;
-use crate::prolog_parser_rebis::{clause_name, perm_v, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::{clause_name, perm_v, temp_v};
use crate::clause_types::*;
use crate::forms::*;
use crate::machine::stack::*;
use crate::machine::streams::*;
use crate::machine::INTERRUPT;
-use crate::ordered_float::*;
use crate::rug::Integer;
+use ordered_float::*;
-use crate::indexmap::{IndexMap, IndexSet};
+use indexmap::{IndexMap, IndexSet};
use std::cmp::Ordering;
use std::convert::TryFrom;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::tabled_rc::*;
-use crate::prolog_parser_rebis::{clause_name, temp_v};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::{clause_name, temp_v};
-use crate::lazy_static::lazy_static;
+use lazy_static::lazy_static;
use crate::clause_types::*;
use crate::forms::*;
use crate::machine::machine_state::*;
use crate::machine::streams::*;
-use crate::indexmap::IndexMap;
+use indexmap::IndexMap;
//use std::convert::TryFrom;
use prolog_parser_rebis::ast::ClauseName;
}
pub fn new(user_input: Stream, user_output: Stream) -> Self {
- use crate::ref_thread_local::RefThreadLocal;
+ use ref_thread_local::RefThreadLocal;
let mut wam = Machine {
machine_st: MachineState::new(),
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::tabled_rc::*;
-use crate::prolog_parser_rebis::{atom, clause_name, rc_atom};
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::{atom, clause_name, rc_atom};
use crate::forms::*;
use crate::iterators::*;
use crate::machine::machine_errors::*;
use crate::machine::*;
-use crate::indexmap::IndexSet;
+use indexmap::IndexSet;
use std::cell::Cell;
use std::collections::VecDeque;
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::clause_name;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::clause_name;
use crate::machine::machine_errors::*;
use crate::machine::machine_indices::*;
use std::ops::DerefMut;
use std::rc::Rc;
-use crate::native_tls::TlsStream;
+use native_tls::TlsStream;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum StreamType {
#[inline]
pub(crate) fn peek_char(&mut self) -> std::io::Result<char> {
- use crate::unicode_reader::CodePoints;
+ use unicode_reader::CodePoints;
match self.stream_inst.0.borrow_mut().1 {
StreamInstance::InputFile(_, ref mut file) => {
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::parser::*;
-use crate::prolog_parser_rebis::tabled_rc::*;
-use crate::prolog_parser_rebis::{
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::parser::*;
+use prolog_parser_rebis::tabled_rc::*;
+use prolog_parser_rebis::{
alpha_char, alpha_numeric_char, backslash_char, binary_digit_char, char_class, clause_name,
decimal_digit_char, exponent_char, graphic_char, graphic_token_char, hexadecimal_digit_char,
layout_char, meta_char, new_line_char, octal_digit_char, prolog_char, sign_char, solo_char,
symbolic_control_char, symbolic_hexadecimal_char, temp_v,
};
-use crate::lazy_static::lazy_static;
+use lazy_static::lazy_static;
use crate::clause_types::*;
use crate::forms::*;
use crate::machine::preprocessor::to_op_decl;
use crate::machine::streams::*;
-use crate::ordered_float::OrderedFloat;
use crate::read::readline;
use crate::rug::Integer;
+use ordered_float::OrderedFloat;
-use crate::indexmap::IndexSet;
+use indexmap::IndexSet;
-use crate::ref_thread_local::RefThreadLocal;
+use ref_thread_local::RefThreadLocal;
use std::cmp;
use std::collections::BTreeSet;
use std::ops::Sub;
use std::rc::Rc;
-use crate::chrono::{offset::Local, DateTime};
-use crate::cpu_time::ProcessTime;
+use chrono::{offset::Local, DateTime};
+use cpu_time::ProcessTime;
use std::time::{Duration, SystemTime};
-use crate::crossterm::event::{read, Event, KeyCode, KeyEvent, KeyModifiers};
-use crate::crossterm::terminal::{disable_raw_mode, enable_raw_mode};
+use crossterm::event::{read, Event, KeyCode, KeyEvent, KeyModifiers};
+use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
-use crate::blake2::{Blake2b, Blake2s};
-use crate::ring::rand::{SecureRandom, SystemRandom};
-use crate::ring::{
+use blake2::{Blake2b, Blake2s};
+use ring::rand::{SecureRandom, SystemRandom};
+use ring::{
aead, digest, hkdf, pbkdf2,
signature::{self, KeyPair},
};
-use crate::ripemd160::{Digest, Ripemd160};
-use crate::sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};
+use ripemd160::{Digest, Ripemd160};
+use sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};
-use crate::openssl::bn::{BigNum, BigNumContext};
-use crate::openssl::ec::{EcGroup, EcPoint};
-use crate::openssl::nid::Nid;
+use openssl::bn::{BigNum, BigNumContext};
+use openssl::ec::{EcGroup, EcPoint};
+use openssl::nid::Nid;
use sodiumoxide::crypto::scalarmult::curve25519::*;
-use crate::native_tls::TlsConnector;
+use native_tls::TlsConnector;
extern crate select;
}
}
&SystemClauseType::ScryerPrologVersion => {
- use crate::git_version::git_version;
+ use git_version::git_version;
let version = self[temp_v!(1)];
let buffer = git_version!(cargo_prefix = "cargo:", fallback = "unknown");
let chars = buffer.chars().map(|c| Addr::Char(c));
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::parser::*;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::parser::*;
-use crate::machine::*;
use crate::machine::machine_errors::CompilationError;
use crate::machine::preprocessor::*;
+use crate::machine::*;
use indexmap::IndexSet;
use std::collections::VecDeque;
use std::fmt;
-pub(crate) trait TermStream : Sized {
+pub(crate) trait TermStream: Sized {
type Evacuable;
fn next(&mut self, op_dir: &CompositeOpDir) -> Result<Term, CompilationError>;
impl<'a> BootstrappingTermStream<'a> {
#[inline]
- pub(super)
- fn from_prolog_stream(
+ pub(super) fn from_prolog_stream(
stream: &'a mut PrologStream,
atom_tbl: TabledData<Atom>,
flags: MachineFlags,
listing_src: ListingSource,
) -> Self {
let parser = Parser::new(stream, atom_tbl, flags);
- Self { parser, listing_src }
+ Self {
+ parser,
+ listing_src,
+ }
}
}
#[inline]
fn next(&mut self, op_dir: &CompositeOpDir) -> Result<Term, CompilationError> {
self.parser.reset();
- self.parser.read_term(op_dir)
+ self.parser
+ .read_term(op_dir)
.map_err(CompilationError::from)
}
#[inline]
fn eof(&mut self) -> Result<bool, CompilationError> {
- self.parser.devour_whitespace()?; // eliminate dangling comments before checking for EOF.
+ self.parser.devour_whitespace()?; // eliminate dangling comments before checking for EOF.
Ok(self.parser.eof()?)
}
loader.compile_and_submit()?;
}
- loader.load_state.retraction_info.reset(
- loader.load_state.wam.code_repo.code.len(),
- );
+ loader
+ .load_state
+ .retraction_info
+ .reset(loader.load_state.wam.code_repo.code.len());
loader.load_state.remove_module_op_exports();
impl LiveTermStream {
#[inline]
- pub(super)
- fn new(listing_src: ListingSource) -> Self {
+ pub(super) fn new(listing_src: ListingSource) -> Self {
Self {
term_queue: VecDeque::new(),
listing_src,
}
impl LoadStatePayload {
- pub(super)
- fn new(wam: &Machine) -> Self {
+ pub(super) fn new(wam: &Machine) -> Self {
Self {
term_stream: LiveTermStream::new(ListingSource::User),
compilation_target: CompilationTarget::default(),
-use blake2;
-use chrono;
-use cpu_time;
-use crossterm;
-use divrem;
-use downcast;
-use git_version;
-use indexmap;
-use lazy_static;
-use native_tls;
-use nix::sys::signal;
-use openssl;
-use ordered_float;
-use prolog_parser_rebis;
-use ref_thread_local;
-use ring;
-use ripemd160;
-use rustyline;
-use sha3;
-use unicode_reader;
-
#[cfg(feature = "num-rug-adapter")]
use num_rug_adapter as rug;
#[cfg(feature = "rug")]
use machine::*;
use read::*;
+use nix::sys::signal;
use std::sync::atomic::Ordering;
extern "C" fn handle_sigint(signal: libc::c_int) {
-use crate::prolog_parser_rebis::ast::*;
-use crate::prolog_parser_rebis::parser::*;
-use crate::prolog_parser_rebis::tabled_rc::TabledData;
+use prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::parser::*;
+use prolog_parser_rebis::tabled_rc::TabledData;
use crate::forms::*;
use crate::iterators::*;
pub mod readline {
use crate::machine::streams::Stream;
- use crate::rustyline::error::ReadlineError;
- use crate::rustyline::{Cmd, Config, Editor, KeyEvent};
+ use rustyline::error::ReadlineError;
+ use rustyline::{Cmd, Config, Editor, KeyEvent};
use std::io::{Cursor, Error, ErrorKind, Read};
static mut PROMPT: bool = false;
#[inline]
fn get_prompt() -> &'static str {
unsafe {
- if PROMPT { "?- " } else { "" }
+ if PROMPT {
+ "?- "
+ } else {
+ ""
+ }
}
}
}
rl.bind_sequence(KeyEvent::from('\t'), Cmd::Insert(1, "\t".to_string()));
- ReadlineStream { rl, pending_input: Cursor::new(pending_input) }
+ ReadlineStream {
+ rl,
+ pending_input: Cursor::new(pending_input),
+ }
}
#[inline]
self.pending_input.read(buf)
}
- Err(ReadlineError::Eof) => {
- Ok(0)
- }
- Err(e) => {
- Err(Error::new(ErrorKind::InvalidInput, e))
- }
+ Err(ReadlineError::Eof) => Ok(0),
+ Err(e) => Err(Error::new(ErrorKind::InvalidInput, e)),
}
}
Some(b) => {
return Ok(b);
}
- None => {
- match self.call_readline(&mut []) {
- Err(e) => {
- return Err(e);
- }
- Ok(0) => {
- return Err(Error::new(
- ErrorKind::UnexpectedEof,
- "end of file",
- ));
- }
- _ => {
- }
+ None => match self.call_readline(&mut []) {
+ Err(e) => {
+ return Err(e);
}
- }
+ Ok(0) => {
+ return Err(Error::new(ErrorKind::UnexpectedEof, "end of file"));
+ }
+ _ => {}
+ },
}
}
}
Some(c) => {
return Ok(c);
}
- None => {
- match self.call_readline(&mut []) {
- Err(e) => {
- return Err(e);
- }
- Ok(0) => {
- return Err(Error::new(
- ErrorKind::UnexpectedEof,
- "end of file",
- ));
- }
- _ => {
- }
+ None => match self.call_readline(&mut []) {
+ Err(e) => {
+ return Err(e);
}
- }
+ Ok(0) => {
+ return Err(Error::new(ErrorKind::UnexpectedEof, "end of file"));
+ }
+ _ => {}
+ },
}
}
}
impl Read for ReadlineStream {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
match self.pending_input.read(buf) {
- Ok(0) => {
- self.call_readline(buf)
- }
- result => {
- result
- }
+ Ok(0) => self.call_readline(buf),
+ result => result,
}
}
}
}
#[inline]
-pub(crate)
-fn write_term_to_heap(term: &Term, machine_st: &mut MachineState) -> TermWriteResult {
+pub(crate) fn write_term_to_heap(term: &Term, machine_st: &mut MachineState) -> TermWriteResult {
let term_writer = TermWriter::new(machine_st);
term_writer.write_term_to_heap(term)
}
#[inline]
fn modify_head_of_queue(&mut self, term: &TermRef<'a>, h: usize) {
if let Some((arity, site_h)) = self.queue.pop_front() {
- self.machine_st.heap[site_h] =
- HeapCellValue::Addr(self.term_as_addr(term, h));
+ self.machine_st.heap[site_h] = HeapCellValue::Addr(self.term_as_addr(term, h));
if arity > 1 {
self.queue.push_front((arity - 1, site_h + 1));
#[inline]
fn push_stub_addr(&mut self) {
let h = self.machine_st.heap.h();
- self.machine_st.heap.push(HeapCellValue::Addr(Addr::HeapCell(h)));
+ self.machine_st
+ .heap
+ .push(HeapCellValue::Addr(Addr::HeapCell(h)));
}
fn term_as_addr(&mut self, term: &TermRef<'a>, h: usize) -> Addr {
match term {
- &TermRef::AnonVar(_) | &TermRef::Var(..) => {
- Addr::HeapCell(h)
- }
- &TermRef::Cons(..) => {
- Addr::HeapCell(h)
- }
- &TermRef::Constant(_, _, c) => {
- self.machine_st.heap.put_constant(c.clone())
- }
- &TermRef::Clause(..) => {
- Addr::Str(h)
- }
- &TermRef::PartialString(..) => {
- Addr::PStrLocation(h, 0)
- }
+ &TermRef::AnonVar(_) | &TermRef::Var(..) => Addr::HeapCell(h),
+ &TermRef::Cons(..) => Addr::HeapCell(h),
+ &TermRef::Constant(_, _, c) => self.machine_st.heap.put_constant(c.clone()),
+ &TermRef::Clause(..) => Addr::Str(h),
+ &TermRef::PartialString(..) => Addr::PStrLocation(h, 0),
}
}
match &term {
&TermRef::Cons(lvl, ..) => {
self.queue.push_back((2, h + 1));
- self.machine_st.heap.push(HeapCellValue::Addr(Addr::Lis(h + 1)));
+ self.machine_st
+ .heap
+ .push(HeapCellValue::Addr(Addr::Lis(h + 1)));
self.push_stub_addr();
self.push_stub_addr();
continue;
}
- _ => {
- }
+ _ => {}
};
self.modify_head_of_queue(&term, h);
}
- TermWriteResult { heap_loc, var_dict: self.var_dict }
+ TermWriteResult {
+ heap_loc,
+ var_dict: self.var_dict,
+ }
}
}
-use crate::prolog_parser_rebis::ast::*;
+use prolog_parser_rebis::ast::*;
use crate::clause_types::*;
use crate::forms::*;