move CodeIndex to F64Table-like table
This commit is contained in:
@@ -11,6 +11,7 @@ use crate::forms::*;
|
||||
use crate::heap_iter::*;
|
||||
use crate::machine::machine_errors::*;
|
||||
use crate::machine::machine_state::*;
|
||||
use crate::offset_table::*;
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::dashu::{Integer, Rational};
|
||||
use crate::types::*;
|
||||
|
||||
@@ -610,7 +610,7 @@ impl Machine {
|
||||
.indices
|
||||
.code_dir
|
||||
.get_index(predicate_idx)
|
||||
.map(|x| x.1.p() as usize)
|
||||
.map(|x| x.1.as_ptr().p() as usize)
|
||||
.unwrap();
|
||||
|
||||
debug_assert!(current_pred_start <= p);
|
||||
@@ -619,7 +619,7 @@ impl Machine {
|
||||
.indices
|
||||
.code_dir
|
||||
.get_index(predicate_idx + 1)
|
||||
.map(|x| x.1.p() as usize)
|
||||
.map(|x| x.1.as_ptr().p() as usize)
|
||||
.unwrap_or(self.code.len());
|
||||
|
||||
debug_assert!(current_pred_end >= p);
|
||||
|
||||
@@ -7,9 +7,9 @@ use crate::heap_iter::{stackful_post_order_iter, NonListElider};
|
||||
use crate::machine::machine_indices::VarKey;
|
||||
use crate::machine::mock_wam::CompositeOpDir;
|
||||
use crate::machine::{
|
||||
ArenaHeaderTag, F64Offset, F64Ptr, Fixnum, Number, BREAK_FROM_DISPATCH_LOOP_LOC,
|
||||
LIB_QUERY_SUCCESS,
|
||||
ArenaHeaderTag, Fixnum, Number, BREAK_FROM_DISPATCH_LOOP_LOC, LIB_QUERY_SUCCESS,
|
||||
};
|
||||
use crate::offset_table::*;
|
||||
use crate::parser::ast::{Var, VarPtr};
|
||||
use crate::parser::parser::{Parser, Tokens};
|
||||
use crate::read::{write_term_to_heap, TermWriteResult};
|
||||
|
||||
@@ -147,7 +147,7 @@ pub(super) fn import_module_exports<'a, LS: LoadState<'a>>(
|
||||
src_code_index.get(),
|
||||
);
|
||||
|
||||
if src_code_index.is_dynamic_undefined() {
|
||||
if src_code_index.as_ptr().is_dynamic_undefined() {
|
||||
code_dir.insert(key, src_code_index);
|
||||
}
|
||||
} else {
|
||||
@@ -486,7 +486,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
||||
continue;
|
||||
}
|
||||
|
||||
if !code_index.is_undefined() && !code_index.is_dynamic_undefined() {
|
||||
if !code_index.as_ptr().is_undefined() && !code_index.as_ptr().is_dynamic_undefined() {
|
||||
let old_index_ptr = code_index.replace(IndexPtr::undefined());
|
||||
|
||||
self.payload.retraction_info.push_record(
|
||||
|
||||
@@ -1219,7 +1219,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
||||
|
||||
let code_index = self.get_or_insert_code_index(key, compilation_target);
|
||||
|
||||
if code_index.is_undefined() {
|
||||
if code_index.as_ptr().is_undefined() {
|
||||
set_code_index(
|
||||
&mut self.payload.retraction_info,
|
||||
&compilation_target,
|
||||
@@ -1378,73 +1378,72 @@ impl MachineState {
|
||||
while let Some(addr) = iter.next() {
|
||||
let addr = unmark_cell_bits!(addr);
|
||||
|
||||
if let Ok(literal) = Literal::try_from(addr) {
|
||||
term_stack.push(Term::Literal(Cell::default(), literal));
|
||||
} else {
|
||||
read_heap_cell!(addr,
|
||||
(HeapCellValueTag::Lis) => {
|
||||
use crate::parser::parser::as_partial_string;
|
||||
read_heap_cell!(addr,
|
||||
(HeapCellValueTag::Lis) => {
|
||||
use crate::parser::parser::as_partial_string;
|
||||
|
||||
let tail = term_stack.pop().unwrap();
|
||||
let head = term_stack.pop().unwrap();
|
||||
let tail = term_stack.pop().unwrap();
|
||||
let head = term_stack.pop().unwrap();
|
||||
|
||||
match as_partial_string(head, tail) {
|
||||
Ok((string, Some(tail))) => {
|
||||
term_stack.push(Term::PartialString(Cell::default(), Rc::new(string), tail));
|
||||
}
|
||||
Ok((string, None)) => {
|
||||
term_stack.push(Term::CompleteString(Cell::default(), Rc::new(string)));
|
||||
}
|
||||
Err(cons_term) => term_stack.push(cons_term),
|
||||
match as_partial_string(head, tail) {
|
||||
Ok((string, Some(tail))) => {
|
||||
term_stack.push(Term::PartialString(Cell::default(), Rc::new(string), tail));
|
||||
}
|
||||
}
|
||||
(HeapCellValueTag::StackVar, h) => {
|
||||
term_stack.push(Term::Var(Cell::default(), VarPtr::from(format!("s_{}", h))));
|
||||
}
|
||||
(HeapCellValueTag::Var | HeapCellValueTag::AttrVar, h) => {
|
||||
term_stack.push(Term::Var(Cell::default(), VarPtr::from(format!("_{}", h))));
|
||||
}
|
||||
(HeapCellValueTag::Atom, (name, arity)) => {
|
||||
let h = iter.focus().value() as usize;
|
||||
let mut arity = arity;
|
||||
let value = iter.heap[h.saturating_sub(1)];
|
||||
|
||||
if let Some(idx) = get_structure_index(value) {
|
||||
term_stack.push(Term::Literal(Cell::default(), Literal::CodeIndex(idx)));
|
||||
arity += 1;
|
||||
}
|
||||
|
||||
if arity == 0 {
|
||||
term_stack.push(Term::Literal(Cell::default(), Literal::Atom(name)));
|
||||
} else {
|
||||
let subterms = term_stack
|
||||
.drain(term_stack.len() - arity ..)
|
||||
.collect();
|
||||
|
||||
term_stack.push(Term::Clause(Cell::default(), name, subterms));
|
||||
Ok((string, None)) => {
|
||||
term_stack.push(Term::CompleteString(Cell::default(), Rc::new(string)));
|
||||
}
|
||||
Err(cons_term) => term_stack.push(cons_term),
|
||||
}
|
||||
(HeapCellValueTag::PStrLoc, h) => {
|
||||
let HeapStringScan { string, .. } = iter.heap.scan_slice_to_str(h);
|
||||
let tail = term_stack.pop().unwrap();
|
||||
}
|
||||
(HeapCellValueTag::Cons | HeapCellValueTag::Fixnum | HeapCellValueTag::F64) => {
|
||||
term_stack.push(Term::Literal(Cell::default(), Literal::try_from(addr).unwrap()));
|
||||
}
|
||||
(HeapCellValueTag::StackVar, h) => {
|
||||
term_stack.push(Term::Var(Cell::default(), VarPtr::from(format!("s_{}", h))));
|
||||
}
|
||||
(HeapCellValueTag::Var | HeapCellValueTag::AttrVar, h) => {
|
||||
term_stack.push(Term::Var(Cell::default(), VarPtr::from(format!("_{}", h))));
|
||||
}
|
||||
(HeapCellValueTag::Atom, (name, arity)) => {
|
||||
let h = iter.focus().value() as usize;
|
||||
let mut arity = arity;
|
||||
let value = iter.heap[h.saturating_sub(1)];
|
||||
|
||||
term_stack.push(if matches!(tail, Term::Literal(_, Literal::Atom(atom!("[]")))) {
|
||||
Term::CompleteString(
|
||||
Cell::default(),
|
||||
Rc::new(string.to_owned()),
|
||||
)
|
||||
} else {
|
||||
Term::PartialString(
|
||||
Cell::default(),
|
||||
Rc::new(string.to_owned()),
|
||||
Box::new(tail),
|
||||
)
|
||||
});
|
||||
if let Some(idx) = get_structure_index(value) {
|
||||
term_stack.push(Term::Literal(Cell::default(), Literal::CodeIndex(idx)));
|
||||
arity += 1;
|
||||
}
|
||||
_ => {
|
||||
|
||||
if arity == 0 {
|
||||
term_stack.push(Term::Literal(Cell::default(), Literal::Atom(name)));
|
||||
} else {
|
||||
let subterms = term_stack
|
||||
.drain(term_stack.len() - arity ..)
|
||||
.collect();
|
||||
|
||||
term_stack.push(Term::Clause(Cell::default(), name, subterms));
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
(HeapCellValueTag::PStrLoc, h) => {
|
||||
let HeapStringScan { string, .. } = iter.heap.scan_slice_to_str(h);
|
||||
let tail = term_stack.pop().unwrap();
|
||||
|
||||
term_stack.push(if matches!(tail, Term::Literal(_, Literal::Atom(atom!("[]")))) {
|
||||
Term::CompleteString(
|
||||
Cell::default(),
|
||||
Rc::new(string.to_owned()),
|
||||
)
|
||||
} else {
|
||||
Term::PartialString(
|
||||
Cell::default(),
|
||||
Rc::new(string.to_owned()),
|
||||
Box::new(tail),
|
||||
)
|
||||
});
|
||||
}
|
||||
_ => {
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
debug_assert!(term_stack.len() == 1);
|
||||
|
||||
@@ -10,6 +10,7 @@ use crate::machine::machine_state::*;
|
||||
use crate::machine::streams::{Stream, StreamOptions};
|
||||
use crate::machine::ClauseType;
|
||||
use crate::machine::MachineStubGen;
|
||||
use crate::offset_table::*;
|
||||
|
||||
use fxhash::FxBuildHasher;
|
||||
use indexmap::{IndexMap, IndexSet};
|
||||
@@ -18,7 +19,7 @@ use scryer_modular_bitfield::{bitfield, BitfieldSpecifier};
|
||||
|
||||
use std::cmp::Ordering;
|
||||
use std::collections::BTreeSet;
|
||||
use std::ops::{Deref, DerefMut};
|
||||
use std::ops::Deref;
|
||||
|
||||
use crate::types::*;
|
||||
|
||||
@@ -129,7 +130,7 @@ impl IndexPtr {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Ord, Hash, PartialOrd, Eq, PartialEq)]
|
||||
pub struct CodeIndex(TypedArenaPtr<IndexPtr>);
|
||||
pub struct CodeIndex(CodeIndexOffset);
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
const_assert!(std::mem::align_of::<CodeIndex>() == 4);
|
||||
@@ -137,47 +138,24 @@ const_assert!(std::mem::align_of::<CodeIndex>() == 4);
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
const_assert!(std::mem::align_of::<CodeIndex>() == 8);
|
||||
|
||||
impl Deref for CodeIndex {
|
||||
type Target = TypedArenaPtr<IndexPtr>;
|
||||
|
||||
#[inline(always)]
|
||||
fn deref(&self) -> &TypedArenaPtr<IndexPtr> {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl DerefMut for CodeIndex {
|
||||
#[inline(always)]
|
||||
fn deref_mut(&mut self) -> &mut TypedArenaPtr<IndexPtr> {
|
||||
&mut self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl From<CodeIndex> for UntypedArenaPtr {
|
||||
#[inline(always)]
|
||||
fn from(ptr: CodeIndex) -> UntypedArenaPtr {
|
||||
UntypedArenaPtr::build_with(ptr.0.as_ptr() as usize)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<TypedArenaPtr<IndexPtr>> for CodeIndex {
|
||||
#[inline(always)]
|
||||
fn from(ptr: TypedArenaPtr<IndexPtr>) -> CodeIndex {
|
||||
CodeIndex(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<CodeIndex> for HeapCellValue {
|
||||
#[inline(always)]
|
||||
fn from(idx: CodeIndex) -> HeapCellValue {
|
||||
untyped_arena_ptr_as_cell!(UntypedArenaPtr::from(idx))
|
||||
HeapCellValue::from(idx.as_ptr())
|
||||
}
|
||||
}
|
||||
|
||||
impl From<CodeIndexOffset> for CodeIndex {
|
||||
#[inline(always)]
|
||||
fn from(offset: CodeIndexOffset) -> CodeIndex {
|
||||
CodeIndex(offset)
|
||||
}
|
||||
}
|
||||
|
||||
impl CodeIndex {
|
||||
#[inline]
|
||||
pub(crate) fn new(ptr: IndexPtr, arena: &mut Arena) -> Self {
|
||||
CodeIndex(arena_alloc!(ptr, arena))
|
||||
unsafe { CodeIndex(arena.code_index_tbl.build_with(ptr)) }
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
@@ -186,39 +164,37 @@ impl CodeIndex {
|
||||
}
|
||||
|
||||
pub(crate) fn local(&self) -> Option<usize> {
|
||||
match self.0.tag() {
|
||||
IndexPtrTag::Index => Some(self.0.p() as usize),
|
||||
IndexPtrTag::DynamicIndex => Some(self.0.p() as usize),
|
||||
match self.0.as_ptr().tag() {
|
||||
IndexPtrTag::Index => Some(self.get().p() as usize),
|
||||
IndexPtrTag::DynamicIndex => Some(self.get().p() as usize),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn get(&self) -> IndexPtr {
|
||||
*self.0.deref()
|
||||
*self.as_ptr().deref()
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn set(&mut self, value: IndexPtr) {
|
||||
*self.0.deref_mut() = value;
|
||||
self.as_ptr().set(value);
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn get_tag(self) -> IndexPtrTag {
|
||||
self.0.tag()
|
||||
self.get().tag()
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn replace(&mut self, value: IndexPtr) -> IndexPtr {
|
||||
std::mem::replace(self.0.deref_mut(), value)
|
||||
self.as_ptr().replace(value)
|
||||
}
|
||||
|
||||
/*
|
||||
#[inline(always)]
|
||||
pub(crate) fn as_ptr(&self) -> *const IndexPtr {
|
||||
pub(crate) fn as_ptr(&self) -> CodeIndexPtr {
|
||||
self.0.as_ptr()
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
|
||||
@@ -11,6 +11,7 @@ use crate::machine::machine_state::*;
|
||||
use crate::machine::partial_string::*;
|
||||
use crate::machine::stack::*;
|
||||
use crate::machine::unify::*;
|
||||
use crate::offset_table::*;
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::dashu::{Integer, Rational};
|
||||
use crate::types::*;
|
||||
|
||||
@@ -45,6 +45,7 @@ use crate::machine::machine_indices::*;
|
||||
use crate::machine::machine_state::*;
|
||||
use crate::machine::stack::*;
|
||||
use crate::machine::streams::*;
|
||||
use crate::offset_table::*;
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::dashu::{Integer, Rational};
|
||||
use crate::types::*;
|
||||
@@ -207,13 +208,8 @@ pub(crate) fn import_builtin_impls(code_dir: &CodeDir, builtins: &mut Module) {
|
||||
#[inline]
|
||||
pub(crate) fn get_structure_index(value: HeapCellValue) -> Option<CodeIndex> {
|
||||
read_heap_cell!(value,
|
||||
(HeapCellValueTag::Cons, cons_ptr) => {
|
||||
match_untyped_arena_ptr!(cons_ptr,
|
||||
(ArenaHeaderTag::IndexPtr, ip) => {
|
||||
return Some(CodeIndex::from(ip));
|
||||
}
|
||||
_ => {}
|
||||
);
|
||||
(HeapCellValueTag::CodeIndex, ip) => {
|
||||
return Some(ip);
|
||||
}
|
||||
_ => {
|
||||
}
|
||||
|
||||
@@ -1454,7 +1454,7 @@ impl Machine {
|
||||
};
|
||||
|
||||
if let Some(code_index) = index_cell {
|
||||
if !code_index.is_undefined() {
|
||||
if !code_index.as_ptr().is_undefined() {
|
||||
load_registers(&mut self.machine_st, goal, goal_arity);
|
||||
self.machine_st.neck_cut();
|
||||
return call_at_index(self, name, arity, code_index.get());
|
||||
@@ -1603,8 +1603,7 @@ impl Machine {
|
||||
|
||||
let expanded_term = if result.is_simple_goal {
|
||||
let idx = self.get_or_insert_qualified_code_index(module_name, result.key);
|
||||
self.machine_st.heap[result.index_ptr_loc] =
|
||||
untyped_arena_ptr_as_cell!(UntypedArenaPtr::from(idx));
|
||||
self.machine_st.heap[result.index_ptr_loc] = HeapCellValue::from(idx);
|
||||
result.goal
|
||||
} else {
|
||||
let mut unexpanded_vars = IndexSet::with_hasher(FxBuildHasher::default());
|
||||
@@ -1642,7 +1641,7 @@ impl Machine {
|
||||
);
|
||||
|
||||
writer.write_with(|section| {
|
||||
section.push_cell(untyped_arena_ptr_as_cell!(UntypedArenaPtr::from(idx)));
|
||||
section.push_cell(HeapCellValue::from(idx));
|
||||
section.push_cell(atom_as_cell!(atom!("$aux"), 0));
|
||||
|
||||
for value in unexpanded_vars.difference(&result.supp_vars).cloned() {
|
||||
@@ -1679,14 +1678,8 @@ impl Machine {
|
||||
|
||||
let idx_cell = self.machine_st.heap[s.saturating_sub(1)];
|
||||
|
||||
if HeapCellValueTag::Cons == idx_cell.get_tag() {
|
||||
match_untyped_arena_ptr!(cell_as_untyped_arena_ptr!(idx_cell),
|
||||
(ArenaHeaderTag::IndexPtr, _ip) => {
|
||||
return true;
|
||||
}
|
||||
_ => {
|
||||
}
|
||||
);
|
||||
if HeapCellValueTag::CodeIndex == idx_cell.get_tag() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ use crate::forms::*;
|
||||
use crate::heap_iter::{stackful_preorder_iter, NonListElider};
|
||||
use crate::machine::machine_state::*;
|
||||
use crate::machine::*;
|
||||
use crate::offset_table::*;
|
||||
use crate::types::*;
|
||||
|
||||
use std::ops::{Deref, DerefMut};
|
||||
|
||||
Reference in New Issue
Block a user