get rid of OssifiedOpDir, DBRef, simplify current_op/3

This commit is contained in:
Mark
2023-09-11 15:36:15 -06:00
parent c75f74f681
commit de440a8c92
8 changed files with 152 additions and 247 deletions

37
Cargo.lock generated
View File

@@ -251,6 +251,26 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "console_error_panic_hook"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
dependencies = [
"cfg-if",
"wasm-bindgen",
]
[[package]]
name = "console_log"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f"
dependencies = [
"log",
"web-sys",
]
[[package]] [[package]]
name = "core-foundation" name = "core-foundation"
version = "0.9.3" version = "0.9.3"
@@ -1899,6 +1919,8 @@ dependencies = [
"blake2 0.8.1", "blake2 0.8.1",
"bytes", "bytes",
"chrono", "chrono",
"console_error_panic_hook",
"console_log",
"cpu-time", "cpu-time",
"crossterm", "crossterm",
"crrl", "crrl",
@@ -1938,6 +1960,7 @@ dependencies = [
"rustyline", "rustyline",
"ryu", "ryu",
"select", "select",
"serde-wasm-bindgen",
"serial_test", "serial_test",
"sha3 0.8.2", "sha3 0.8.2",
"smallvec", "smallvec",
@@ -1949,6 +1972,9 @@ dependencies = [
"to-syn-value_derive", "to-syn-value_derive",
"tokio", "tokio",
"walkdir", "walkdir",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
] ]
[[package]] [[package]]
@@ -1994,6 +2020,17 @@ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]]
name = "serde-wasm-bindgen"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e"
dependencies = [
"js-sys",
"serde",
"wasm-bindgen",
]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.188" version = "1.0.188"

View File

@@ -306,7 +306,7 @@ enum SystemClauseType {
GetBValue, GetBValue,
#[strum_discriminants(strum(props(Arity = "3", Name = "$get_cont_chunk")))] #[strum_discriminants(strum(props(Arity = "3", Name = "$get_cont_chunk")))]
GetContinuationChunk, GetContinuationChunk,
#[strum_discriminants(strum(props(Arity = "7", Name = "$get_next_op_db_ref")))] #[strum_discriminants(strum(props(Arity = "4", Name = "$get_next_op_db_ref")))]
GetNextOpDBRef, GetNextOpDBRef,
#[strum_discriminants(strum(props(Arity = "3", Name = "$lookup_db_ref")))] #[strum_discriminants(strum(props(Arity = "3", Name = "$lookup_db_ref")))]
LookupDBRef, LookupDBRef,

View File

@@ -169,7 +169,6 @@ impl F64Table {
pub enum ArenaHeaderTag { pub enum ArenaHeaderTag {
Integer = 0b10, Integer = 0b10,
Rational = 0b11, Rational = 0b11,
OssifiedOpDir = 0b0000100,
LiveLoadState = 0b0001000, LiveLoadState = 0b0001000,
InactiveLoadState = 0b1011000, InactiveLoadState = 0b1011000,
InputFileStream = 0b10000, InputFileStream = 0b10000,
@@ -546,28 +545,6 @@ impl ArenaAllocated for Rational {
} }
} }
impl ArenaAllocated for OssifiedOpDir {
type PtrToAllocated = TypedArenaPtr<OssifiedOpDir>;
#[inline]
fn tag() -> ArenaHeaderTag {
ArenaHeaderTag::OssifiedOpDir
}
#[inline]
fn size(&self) -> usize {
mem::size_of::<Self>()
}
#[inline]
fn copy_to_arena(self, dst: *mut Self) -> Self::PtrToAllocated {
unsafe {
ptr::write(dst, self);
TypedArenaPtr::new(dst as *mut Self)
}
}
}
impl ArenaAllocated for LiveLoadState { impl ArenaAllocated for LiveLoadState {
type PtrToAllocated = TypedArenaPtr<LiveLoadState>; type PtrToAllocated = TypedArenaPtr<LiveLoadState>;
@@ -769,9 +746,6 @@ unsafe fn drop_slab_in_place(value: &mut AllocSlab) {
ArenaHeaderTag::ByteStream => { ArenaHeaderTag::ByteStream => {
ptr::drop_in_place(value.payload_offset::<StreamLayout<CharReader<ByteStream>>>()); ptr::drop_in_place(value.payload_offset::<StreamLayout<CharReader<ByteStream>>>());
} }
ArenaHeaderTag::OssifiedOpDir => {
ptr::drop_in_place(value.payload_offset::<OssifiedOpDir>());
}
ArenaHeaderTag::LiveLoadState | ArenaHeaderTag::InactiveLoadState => { ArenaHeaderTag::LiveLoadState | ArenaHeaderTag::InactiveLoadState => {
ptr::drop_in_place(value.payload_offset::<LiveLoadState>()); ptr::drop_in_place(value.payload_offset::<LiveLoadState>());
} }

View File

@@ -1646,9 +1646,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
(ArenaHeaderTag::Stream, stream) => { (ArenaHeaderTag::Stream, stream) => {
self.print_stream(stream, max_depth); self.print_stream(stream, max_depth);
} }
(ArenaHeaderTag::OssifiedOpDir, _op_dir) => {
self.print_impromptu_atom(atom!("$ossified_op_dir"));
}
(ArenaHeaderTag::Dropped, _value) => { (ArenaHeaderTag::Dropped, _value) => {
self.print_impromptu_atom(atom!("$dropped_value")); self.print_impromptu_atom(atom!("$dropped_value"));
} }

View File

@@ -1376,11 +1376,6 @@ current_predicate(Pred) :-
; throw(error(type_error(predicate_indicator, Pred), current_predicate/1)) ; throw(error(type_error(predicate_indicator, Pred), current_predicate/1))
). ).
'$iterate_op_db_refs'(RPriority, RSpec, ROp, _, RPriority, RSpec, ROp).
'$iterate_op_db_refs'(RPriority, RSpec, ROp, OssifiedOpDir, Priority, Spec, Op) :-
'$get_next_op_db_ref'(RPriority, RSpec, ROp, OssifiedOpDir, RRPriority, RRSpec, RROp),
'$iterate_op_db_refs'(RRPriority, RRSpec, RROp, OssifiedOpDir, Priority, Spec, Op).
can_be_op_priority(Priority) :- var(Priority). can_be_op_priority(Priority) :- var(Priority).
can_be_op_priority(Priority) :- op_priority(Priority). can_be_op_priority(Priority) :- op_priority(Priority).
@@ -1396,8 +1391,8 @@ current_op(Priority, Spec, Op) :-
( can_be_op_priority(Priority), ( can_be_op_priority(Priority),
can_be_op_specifier(Spec), can_be_op_specifier(Spec),
error:can_be(atom, Op) -> error:can_be(atom, Op) ->
'$get_next_op_db_ref'(RPriority, RSpec, ROp, OssifiedOpDir, _, _, Op), '$get_next_op_db_ref'(Priority, Spec, Op, ListOfOps),
'$iterate_op_db_refs'(RPriority, RSpec, ROp, OssifiedOpDir, Priority, Spec, Op) lists:member(op(Priority, Spec, Op), ListOfOps)
). ).
list_of_op_atoms(Var) :- list_of_op_atoms(Var) :-

View File

@@ -21,14 +21,6 @@ use crate::types::*;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct OrderedOpDirKey(pub(crate) Atom, pub(crate) Fixity); pub(crate) struct OrderedOpDirKey(pub(crate) Atom, pub(crate) Fixity);
pub(crate) type OssifiedOpDir = IndexMap<(Atom, Fixity), (usize, Specifier)>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DBRef {
NamedPred(Atom, usize),
Op(Atom, Fixity, TypedArenaPtr<OssifiedOpDir>),
}
// 7.2 // 7.2
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum TermOrderCategory { pub enum TermOrderCategory {

View File

@@ -872,37 +872,6 @@ impl MachineState {
); );
} }
pub(crate) fn get_next_db_ref(&self, indices: &IndexStore, db_ref: &DBRef) -> Option<DBRef> {
match db_ref {
DBRef::NamedPred(name, arity) => {
let key = (*name, *arity);
if let Some((last_idx, _, _)) = indices.code_dir.get_full(&key) {
for idx in last_idx + 1..indices.code_dir.len() {
let ((name, arity), idx) = indices.code_dir.get_index(idx).unwrap();
if idx.is_undefined() {
return None;
}
return Some(DBRef::NamedPred(*name, *arity));
}
}
}
DBRef::Op(name, fixity, op_dir) => {
let key = (*name, *fixity);
if let Some((last_idx, _, _)) = op_dir.get_full(&key) {
if let Some(((name, fixity), _)) = op_dir.get_index(last_idx + 1) {
return Some(DBRef::Op(*name, *fixity, *op_dir));
}
}
}
}
None
}
pub(crate) fn parse_number_from_string( pub(crate) fn parse_number_from_string(
&mut self, &mut self,
string: &str, string: &str,
@@ -4059,10 +4028,51 @@ impl Machine {
pub(crate) fn get_next_op_db_ref(&mut self) { pub(crate) fn get_next_op_db_ref(&mut self) {
let prec = self.deref_register(1); let prec = self.deref_register(1);
if let Some(prec_var) = prec.as_var() { fn get_spec(op_spec: u8) -> Atom {
match op_spec as u32 {
XFX => atom!("xfx"),
XFY => atom!("xfy"),
YFX => atom!("yfx"),
FX => atom!("fx"),
FY => atom!("fy"),
XF => atom!("xf"),
YF => atom!("yf"),
_ => unreachable!(),
}
}
let h = self.machine_st.heap.len();
fn write_op_functors_to_heap(
heap: &mut Heap,
op_descs: impl Iterator<Item = (Atom, OpDesc)>,
) -> usize {
let mut num_functors = 0;
for (name, op_desc) in op_descs {
let prec = op_desc.get_prec();
if prec == 0 {
// 8.14.4, note 2
continue;
}
let spec_atom = get_spec(op_desc.get_spec());
heap.extend(functor!(
atom!("op"),
[fixnum(prec), cell(atom_as_cell!(spec_atom)), cell(atom_as_cell!(name))]
));
num_functors += 1;
}
num_functors
}
if prec.is_var() {
let spec = self.deref_register(2); let spec = self.deref_register(2);
let op = self.deref_register(3); let orig_op = self.deref_register(3);
let orig_op = self.deref_register(7);
let spec_num = if spec.get_tag() == HeapCellValueTag::Atom { let spec_num = if spec.get_tag() == HeapCellValueTag::Atom {
(match cell_as_atom!(spec) { (match cell_as_atom!(spec) {
@@ -4078,7 +4088,7 @@ impl Machine {
0 0
}; };
let unossified_op_dir = if !orig_op.is_var() { let num_functors = if !orig_op.is_var() {
let orig_op = read_heap_cell!(orig_op, let orig_op = read_heap_cell!(orig_op,
(HeapCellValueTag::Atom, (name, _arity)) => { (HeapCellValueTag::Atom, (name, _arity)) => {
name name
@@ -4095,75 +4105,42 @@ impl Machine {
); );
let op_descs = [ let op_descs = [
self.indices.op_dir.get_key_value(&(orig_op, Fixity::In)), self.indices.op_dir.get(&(orig_op, Fixity::In)),
self.indices.op_dir.get_key_value(&(orig_op, Fixity::Pre)), self.indices.op_dir.get(&(orig_op, Fixity::Pre)),
self.indices.op_dir.get_key_value(&(orig_op, Fixity::Post)), self.indices.op_dir.get(&(orig_op, Fixity::Post)),
]; ];
let number_of_keys = op_descs[0].is_some() as usize let number_of_keys = op_descs[0].is_some() as usize
+ op_descs[1].is_some() as usize + op_descs[1].is_some() as usize
+ op_descs[2].is_some() as usize; + op_descs[2].is_some() as usize;
match number_of_keys { let op_descs = op_descs.into_iter().filter_map(|op_desc| {
0 => { op_desc.map(|op_desc| (orig_op, *op_desc))
});
if number_of_keys == 0 {
self.machine_st.fail = true; self.machine_st.fail = true;
return;
}
1 => {
for op_desc in op_descs {
if let Some((_, op_desc)) = op_desc {
let (op_prec, op_spec) = (op_desc.get_prec(), op_desc.get_spec());
if op_prec == 0 {
// 8.14.4, note 2
self.machine_st.fail = true;
return;
}
let op_spec = match op_spec as u32 {
XFX => atom!("xfx"),
XFY => atom!("xfy"),
YFX => atom!("yfx"),
FX => atom!("fx"),
FY => atom!("fy"),
XF => atom!("xf"),
YF => atom!("yf"),
_ => unreachable!(),
};
let op_prec = Fixnum::build_with(op_prec as i64);
self.machine_st.unify_fixnum(op_prec, prec);
self.machine_st.unify_atom(op_spec, spec);
}
}
return;
}
_ => {
let mut unossified_op_dir = OssifiedOpDir::new();
for op_desc in op_descs {
if let Some((key, op_desc)) = op_desc {
let (prec, spec) = (op_desc.get_prec(), op_desc.get_spec());
if prec == 0 {
// 8.14.4, note 2
continue;
}
unossified_op_dir.insert(*key, (prec as usize, spec as Specifier));
}
}
unossified_op_dir
}
}
} else { } else {
let mut unossified_op_dir = OssifiedOpDir::new(); let num_functors = write_op_functors_to_heap(
&mut self.machine_st.heap,
op_descs,
);
unossified_op_dir.extend(self.indices.op_dir.iter().filter_map( let h = iter_to_heap_list(
|(key, op_desc)| { &mut self.machine_st.heap,
(0..num_functors).map(|i| str_loc_as_cell!(h + 4 * i)),
);
unify!(
self.machine_st,
heap_loc_as_cell!(h),
self.machine_st.registers[4]
);
}
return;
} else {
let op_descs = self.indices.op_dir.iter().filter_map(|(key, op_desc)| {
let (other_prec, other_spec) = (op_desc.get_prec(), op_desc.get_spec()); let (other_prec, other_spec) = (op_desc.get_prec(), op_desc.get_spec());
let name = key.0; let name = key.0;
@@ -4178,63 +4155,29 @@ impl Machine {
return None; return None;
} }
Some((*key, (other_prec as usize, other_spec as Specifier))) Some((key.0, *op_desc))
}, });
));
unossified_op_dir write_op_functors_to_heap(&mut self.machine_st.heap, op_descs)
}; };
let ossified_op_dir = arena_alloc!(unossified_op_dir, &mut self.machine_st.arena); if num_functors > 0 {
let h = iter_to_heap_list(
match ossified_op_dir.iter().next() { &mut self.machine_st.heap,
Some(((op_atom, _), (op_prec, op_spec))) => { (0..num_functors).map(|i| str_loc_as_cell!(h + 4 * i)),
let ossified_op_dir_var = self.deref_register(4).as_var().unwrap();
let spec_atom = match *op_spec {
FX => atom!("fx"),
FY => atom!("fy"),
XF => atom!("xf"),
YF => atom!("yf"),
XFX => atom!("xfx"),
XFY => atom!("xfy"),
YFX => atom!("yfx"),
_ => {
self.machine_st.fail = true;
return;
}
};
let spec_var = spec.as_var().unwrap();
let op_var = op.as_var().unwrap();
self.machine_st.bind(
prec_var,
fixnum_as_cell!(Fixnum::build_with(*op_prec as i64)),
); );
self.machine_st.bind(spec_var, atom_as_cell!(spec_atom));
self.machine_st.bind(op_var, atom_as_cell!(op_atom)); unify!(
self.machine_st.bind( self.machine_st,
ossified_op_dir_var, heap_loc_as_cell!(h),
typed_arena_ptr_as_cell!(ossified_op_dir), self.machine_st.registers[4]
); );
} } else {
None => {
self.machine_st.fail = true; self.machine_st.fail = true;
return;
}
} }
} else { } else {
let spec = cell_as_atom!(self.deref_register(2)); let spec = cell_as_atom!(self.deref_register(2));
let op_atom = cell_as_atom!(self.deref_register(3)); let op_atom = cell_as_atom!(self.deref_register(3));
let ossified_op_dir_cell = self.deref_register(4);
if ossified_op_dir_cell.is_var() {
self.machine_st.fail = true;
return;
}
let ossified_op_dir = cell_as_ossified_op_dir!(ossified_op_dir_cell);
let fixity = match spec { let fixity = match spec {
atom!("xfy") | atom!("yfx") | atom!("xfx") => Fixity::In, atom!("xfy") | atom!("yfx") | atom!("xfx") => Fixity::In,
@@ -4246,52 +4189,26 @@ impl Machine {
} }
}; };
match self match self.indices.op_dir.get(&(op_atom, fixity)).cloned() {
.machine_st Some(op_desc) => {
.get_next_db_ref(&self.indices, &DBRef::Op(op_atom, fixity, ossified_op_dir)) let num_functors = write_op_functors_to_heap(
{ &mut self.machine_st.heap,
Some(DBRef::Op(op_atom, fixity, ossified_op_dir)) => { std::iter::once((op_atom, op_desc)),
let (prec, spec) = ossified_op_dir.get(&(op_atom, fixity)).unwrap(); );
let prec_var = self let h = iter_to_heap_list(
.machine_st &mut self.machine_st.heap,
.deref(self.machine_st.registers[5]) (0..num_functors).map(|i| str_loc_as_cell!(h + 4 * i)),
.as_var() );
.unwrap();
let spec_var = self unify!(
.machine_st self.machine_st,
.deref(self.machine_st.registers[6]) heap_loc_as_cell!(h),
.as_var() self.machine_st.registers[4]
.unwrap(); );
}
let op_var = self
.machine_st
.deref(self.machine_st.registers[7])
.as_var()
.unwrap();
let spec_atom = match *spec {
FX => atom!("fx"),
FY => atom!("fy"),
XF => atom!("xf"),
YF => atom!("yf"),
XFX => atom!("xfx"),
XFY => atom!("xfy"),
YFX => atom!("yfx"),
_ => { _ => {
self.machine_st.fail = true; self.machine_st.fail = true;
return;
}
};
self.machine_st
.bind(prec_var, fixnum_as_cell!(Fixnum::build_with(*prec as i64)));
self.machine_st.bind(spec_var, atom_as_cell!(spec_atom));
self.machine_st.bind(op_var, atom_as_cell!(op_atom));
}
Some(DBRef::NamedPred(..)) | None => {
self.machine_st.fail = true;
} }
} }
} }

View File

@@ -57,13 +57,6 @@ macro_rules! atom_as_cell {
}; };
} }
macro_rules! cell_as_ossified_op_dir {
($cell:expr) => {{
let ptr_u64 = cell_as_untyped_arena_ptr!($cell);
TypedArenaPtr::new(ptr_u64.payload_offset() as *mut OssifiedOpDir)
}};
}
macro_rules! cell_as_string { macro_rules! cell_as_string {
($cell:expr) => { ($cell:expr) => {
PartialString::from(cell_as_atom!($cell)) PartialString::from(cell_as_atom!($cell))