use OffsetTableImpl without synchronization by default

This commit is contained in:
Mark Thom
2025-05-22 23:49:57 -07:00
committed by Mark Thom
parent 725def07cd
commit 1332611f83
28 changed files with 1005 additions and 990 deletions

View File

@@ -25,6 +25,7 @@ use crate::machine::partial_string::*;
use crate::machine::stack::*;
use crate::machine::streams::*;
use crate::machine::{get_structure_index, Machine, VERIFY_ATTR_INTERRUPT_LOC};
use crate::offset_table::*;
use crate::parser::ast::*;
use crate::parser::char_reader::*;
use crate::parser::dashu::Integer;
@@ -821,7 +822,7 @@ impl MachineState {
let mut max_old = -1i64;
if !max_steps.is_var() {
let max_steps = Number::try_from(max_steps);
let max_steps = Number::try_from((max_steps, &self.arena.f64_tbl));
let max_steps_n = match max_steps {
Ok(Number::Fixnum(n)) => Some(n.get_num()),
@@ -1132,7 +1133,7 @@ impl MachineState {
for addr in addrs {
let addr = self.store(self.deref(addr));
match Number::try_from(addr) {
match Number::try_from((addr, &self.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => {
if let Ok(n) = u32::try_from(n.get_num()) {
if let Some(c) = std::char::from_u32(n) {
@@ -1241,7 +1242,13 @@ impl Machine {
let mut bp = self
.indices
.get_predicate_code_index(atom!("$clause"), 2, module_name)
.and_then(|idx| idx.local())
.and_then(|idx| {
self.machine_st
.arena
.code_index_tbl
.lookup(idx.into())
.local()
})
.unwrap();
macro_rules! extract_ptr {
@@ -1431,7 +1438,7 @@ impl Machine {
self.machine_st.error_form(err, stub)
})?;
let index_cell = if index_cell_opt.is_some() {
let index_cell_opt = if index_cell_opt.is_some() {
index_cell_opt
} else {
let is_internal_call = name == atom!("$call") && goal_arity > 0;
@@ -1469,11 +1476,13 @@ impl Machine {
}
};
if let Some(code_index) = index_cell {
if !code_index.as_ptr().is_undefined() {
if let Some(code_idx) = index_cell_opt {
let index_ptr = *self.machine_st.arena.code_index_tbl.lookup(code_idx.into());
if !index_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());
return call_at_index(self, name, arity, index_ptr);
}
}
@@ -1653,7 +1662,7 @@ impl Machine {
let idx = CodeIndex::new(
IndexPtr::index(helper_clause_loc),
&mut self.machine_st.arena,
&mut self.machine_st.arena.code_index_tbl,
);
writer.write_with(|section| {
@@ -1694,7 +1703,7 @@ impl Machine {
let idx_cell = self.machine_st.heap[s.saturating_sub(1)];
if HeapCellValueTag::CodeIndex == idx_cell.get_tag() {
if HeapCellValueTag::CodeIndexOffset == idx_cell.get_tag() {
return true;
}
}
@@ -1846,7 +1855,7 @@ impl Machine {
#[inline(always)]
pub(crate) fn bind_from_register(&mut self) {
let reg = self.deref_register(2);
let n = match Number::try_from(reg) {
let n = match Number::try_from((reg, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).ok(),
Ok(Number::Integer(n)) => {
let value: usize = (&*n).try_into().unwrap();
@@ -2608,7 +2617,7 @@ impl Machine {
let addr = match addr {
addr if addr.is_var() => addr,
addr => match Number::try_from(addr) {
addr => match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let result: Result<u8, _> = (&*n).try_into();
if let Ok(value) = result {
@@ -2797,7 +2806,7 @@ impl Machine {
a2
}
_ => {
match Number::try_from(a2) {
match Number::try_from((a2, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u32 = (&*n).try_into().unwrap();
@@ -2864,7 +2873,7 @@ impl Machine {
let n = self.deref_register(1);
let chs = self.deref_register(2);
let string = match Number::try_from(n) {
let string = match Number::try_from((n, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Float(OrderedFloat(n))) => fmt_float(n),
Ok(Number::Fixnum(n)) => n.get_num().to_string(),
Ok(Number::Integer(n)) => n.to_string(),
@@ -2892,7 +2901,7 @@ impl Machine {
let n = self.deref_register(1);
let chs = self.machine_st.registers[2];
let string = match Number::try_from(n) {
let string = match Number::try_from((n, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Float(OrderedFloat(n))) => {
format!("{0:<20?}", n)
}
@@ -2979,13 +2988,8 @@ impl Machine {
debug_assert_eq!(arity, 0);
name.as_char().unwrap()
}
/*
(HeapCellValueTag::Char, c) => {
c
}
*/
_ => {
match Number::try_from(a2) {
match Number::try_from((a2, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u32 = (&*n).try_into().unwrap();
let n = std::char::from_u32(n);
@@ -3223,7 +3227,7 @@ impl Machine {
let err = self.machine_st.instantiation_error();
Err(self.machine_st.error_form(err, stub_gen()))
} else {
match Number::try_from(addr) {
match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u32 = (&*n).try_into().unwrap();
let n = char::try_from(n);
@@ -3370,7 +3374,7 @@ impl Machine {
let err = self.machine_st.instantiation_error();
return Err(self.machine_st.error_form(err, stub_gen()));
} else {
match Number::try_from(addr) {
match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u8 = (&*n).try_into().unwrap();
@@ -3449,7 +3453,7 @@ impl Machine {
let addr = if addr.is_var() {
addr
} else {
match Number::try_from(addr) {
match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(ref n)) if (**n).num_eq(&1_i64) => {
fixnum_as_cell!(Fixnum::build_with(-1))
}
@@ -3603,7 +3607,7 @@ impl Machine {
3,
)?;
let num = match Number::try_from(self.deref_register(2)) {
let num = match Number::try_from((self.deref_register(2), &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).unwrap(),
Ok(Number::Integer(n)) => match (&*n).try_into() as Result<usize, _> {
Ok(u) => u,
@@ -3704,7 +3708,7 @@ impl Machine {
let addr = if addr.is_var() {
addr
} else {
match Number::try_from(addr) {
match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u32 = (&*n).try_into().unwrap();
let n = std::char::from_u32(n);
@@ -4040,7 +4044,7 @@ impl Machine {
} else {
arity_match = |arity_1, arity_2| arity_1 == arity_2;
let arity = match Number::try_from(arity) {
let arity = match Number::try_from((arity, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => Some(n.get_num() as usize),
Ok(Number::Integer(n)) => {
let value: usize = (&*n).try_into().unwrap();
@@ -4299,7 +4303,10 @@ impl Machine {
pub(crate) fn random_integer(&mut self) {
let a1 = self.deref_register(1);
let a2 = self.deref_register(2);
let value = match (Number::try_from(a1), Number::try_from(a2)) {
let value = match (
Number::try_from((a1, &self.machine_st.arena.f64_tbl)),
Number::try_from((a2, &self.machine_st.arena.f64_tbl)),
) {
(Ok(Number::Fixnum(lower)), Ok(Number::Fixnum(upper))) => {
let (lower, upper) = (lower.get_num(), upper.get_num());
if lower >= upper {
@@ -4390,7 +4397,7 @@ impl Machine {
let stub_gen = || functor_stub(atom!("length"), 2);
let len = self.deref_register(2);
let n = match Number::try_from(len) {
let n = match Number::try_from((len, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => match (&*n).try_into() as Result<usize, _> {
Ok(n) => n,
@@ -4581,23 +4588,24 @@ impl Machine {
let tls_cert = self.deref_register(4);
let content_length_limit = self.deref_register(5);
const CONTENT_LENGTH_LIMIT_DEFAULT: u64 = 32768;
let content_length_limit = match Number::try_from(content_length_limit) {
Ok(Number::Fixnum(n)) => {
if n.get_num() >= 0 {
n.get_num() as u64
} else {
CONTENT_LENGTH_LIMIT_DEFAULT
let content_length_limit =
match Number::try_from((content_length_limit, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => {
if n.get_num() >= 0 {
n.get_num() as u64
} else {
CONTENT_LENGTH_LIMIT_DEFAULT
}
}
}
Ok(Number::Integer(n)) => {
let n: Result<u64, _> = (&*n).try_into();
match n {
Ok(u) => u,
Err(_) => CONTENT_LENGTH_LIMIT_DEFAULT,
Ok(Number::Integer(n)) => {
let n: Result<u64, _> = (&*n).try_into();
match n {
Ok(u) => u,
Err(_) => CONTENT_LENGTH_LIMIT_DEFAULT,
}
}
}
_ => CONTENT_LENGTH_LIMIT_DEFAULT,
};
_ => CONTENT_LENGTH_LIMIT_DEFAULT,
};
let ssl_server: Option<(String, String)> = {
match self.machine_st.value_to_str_like(tls_key) {
@@ -4864,7 +4872,8 @@ impl Machine {
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) {
let status_code: u16 = match Number::try_from((status_code, &self.machine_st.arena.f64_tbl))
{
Ok(Number::Fixnum(n)) => n.get_num() as u16,
Ok(Number::Integer(n)) => {
let n: Result<u16, _> = (&*n).try_into();
@@ -4994,7 +5003,7 @@ impl Machine {
if let Some(function_name) = self.machine_st.value_to_str_like(function_name) {
let stub_gen = || functor_stub(atom!("foreign_call"), 3);
fn map_arg(machine_st: &mut MachineState, source: HeapCellValue) -> crate::ffi::Value {
match Number::try_from(source) {
match Number::try_from((source, &machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => Value::Int(n.get_num()),
Ok(Number::Float(n)) => Value::Float(n.into_inner()),
_ => {
@@ -5297,7 +5306,7 @@ impl Machine {
let priority = self.deref_register(1);
let specifier = cell_as_atom_cell!(self.deref_register(2)).get_name();
let priority = match Number::try_from(priority) {
let priority = match Number::try_from((priority, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let n: u16 = (&*n).try_into().unwrap();
n
@@ -5465,7 +5474,7 @@ impl Machine {
pub(crate) fn get_attr_var_queue_beyond(&mut self) {
let addr = self.deref_register(1);
let b = match Number::try_from(addr) {
let b = match Number::try_from((addr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Integer(n)) => {
let value: usize = (&*n).try_into().unwrap();
Some(value)
@@ -5892,7 +5901,7 @@ impl Machine {
pub(crate) fn halt(&mut self) -> std::process::ExitCode {
let code = self.deref_register(1);
let code = match Number::try_from(code) {
let code = match Number::try_from((code, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => u8::try_from(n.get_num()).unwrap(),
Ok(Number::Integer(n)) => {
let n: u8 = (&*n).try_into().unwrap();
@@ -5929,7 +5938,7 @@ impl Machine {
let a1 = self.deref_register(1);
let a2 = self.deref_register(2);
let n = match Number::try_from(a2) {
let n = match Number::try_from((a2, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(bp)) => Integer::from(bp.get_num() as usize),
Ok(Number::Integer(n)) => (*n).clone(),
_ => {
@@ -5974,7 +5983,7 @@ impl Machine {
let name = cell_as_atom!(self.deref_register(2));
let a3 = self.deref_register(3);
let arity = match Number::try_from(a3) {
let arity = match Number::try_from((a3, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => {
let result = (&*n).try_into();
@@ -5992,7 +6001,14 @@ impl Machine {
self.indices
.get_predicate_code_index(name, arity, module_name)
.map(|index| index.local().is_some())
.map(|idx| {
self.machine_st
.arena
.code_index_tbl
.lookup(idx.into())
.local()
.is_some()
})
.unwrap_or(false)
}
@@ -6014,7 +6030,10 @@ impl Machine {
arity,
module_name,
)
.map(|index| index.get())
.map(|idx| *self.machine_st
.arena
.code_index_tbl
.lookup(idx.into()))
.unwrap_or(IndexPtr::dynamic_undefined());
!matches!(index.tag(), IndexPtrTag::DynamicUndefined | IndexPtrTag::Undefined)
@@ -6031,7 +6050,10 @@ impl Machine {
0,
module_name,
)
.map(|index| index.get())
.map(|idx| *self.machine_st
.arena
.code_index_tbl
.lookup(idx.into()))
.unwrap_or(IndexPtr::dynamic_undefined());
!matches!(index.tag(), IndexPtrTag::DynamicUndefined)
@@ -6667,7 +6689,7 @@ impl Machine {
pub(crate) fn set_seed(&mut self) {
let seed = self.deref_register(1);
match Number::try_from(seed) {
match Number::try_from((seed, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => {
let n: u64 = Integer::from(n).try_into().unwrap();
let rng: StdRng = SeedableRng::seed_from_u64(n);
@@ -6695,7 +6717,7 @@ impl Machine {
pub(crate) fn sleep(&mut self) {
let time = self.deref_register(1);
let time = match Number::try_from(time) {
let time = match Number::try_from((time, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Float(n)) => n.into_inner(),
Ok(Number::Fixnum(n)) => n.get_num() as f64,
Ok(Number::Integer(n)) => n.to_f64().value(),
@@ -6730,7 +6752,7 @@ impl Machine {
name
}
_ => {
AtomTable::build_with(&self.machine_st.atom_tbl, &match Number::try_from(port) {
AtomTable::build_with(&self.machine_st.atom_tbl, &match Number::try_from((port, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num().to_string(),
Ok(Number::Integer(n)) => n.to_string(),
_ => {
@@ -6829,7 +6851,7 @@ impl Machine {
let port = if port.is_var() {
String::from("0")
} else {
match Number::try_from(port) {
match Number::try_from((port, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num().to_string(),
Ok(Number::Integer(n)) => n.to_string(),
_ => {
@@ -7107,7 +7129,7 @@ impl Machine {
let position = self.deref_register(2);
let position = match Number::try_from(position) {
let position = match Number::try_from((position, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num() as u64,
Ok(Number::Integer(n)) => {
let n: Result<u64, _> = (&*n).try_into();
@@ -7426,7 +7448,7 @@ impl Machine {
let name = cell_as_atom!(self.deref_register(2));
let arity = self.deref_register(3);
let arity = match Number::try_from(arity) {
let arity = match Number::try_from((arity, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => {
let value: usize = (&*n).try_into().unwrap();
@@ -7454,22 +7476,23 @@ impl Machine {
},
};
let first_idx = match first_idx {
Some(idx) if idx.local().is_some() => {
if let Some(idx) = idx.local() {
idx
} else {
unreachable!()
}
}
_ => {
let stub = functor_stub(name, arity);
let err = self
.machine_st
.existence_error(ExistenceError::Procedure(name, arity));
let first_idx = first_idx.and_then(|first_idx| {
self.machine_st
.arena
.code_index_tbl
.lookup(first_idx.into())
.local()
});
return Err(self.machine_st.error_form(err, stub));
}
let first_idx = if let Some(idx) = first_idx {
idx
} else {
let stub = functor_stub(name, arity);
let err = self
.machine_st
.existence_error(ExistenceError::Procedure(name, arity));
return Err(self.machine_st.error_form(err, stub));
};
let listing =
@@ -7484,7 +7507,7 @@ impl Machine {
#[inline(always)]
pub(crate) fn inlined_instructions(&mut self) {
let index_ptr = self.deref_register(1);
let index_ptr = match Number::try_from(index_ptr) {
let index_ptr = match Number::try_from((index_ptr, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => n.get_num() as usize,
Ok(Number::Integer(n)) => {
let value: usize = (&*n).try_into().unwrap();
@@ -7843,7 +7866,7 @@ impl Machine {
let length = self.deref_register(6);
let length = match Number::try_from(length) {
let length = match Number::try_from((length, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => usize::try_from(n.get_num()).unwrap(),
Ok(Number::Integer(n)) => match (&*n).try_into() as Result<usize, _> {
Ok(u) => u,
@@ -7909,7 +7932,7 @@ impl Machine {
let iterations = self.deref_register(3);
let iterations = match Number::try_from(iterations) {
let iterations = match Number::try_from((iterations, &self.machine_st.arena.f64_tbl)) {
Ok(Number::Fixnum(n)) => u64::try_from(n.get_num()).unwrap(),
Ok(Number::Integer(n)) => {
let n: Result<u64, _> = (&*n).try_into();
@@ -8555,7 +8578,10 @@ impl Machine {
#[inline(always)]
pub(crate) fn pop_count(&mut self) {
let number = self.deref_register(1);
let pop_count = integer_as_cell!(match Number::try_from(number) {
let pop_count = integer_as_cell!(match Number::try_from((
number,
&self.machine_st.arena.f64_tbl
)) {
Ok(Number::Fixnum(n)) => {
Number::Fixnum(Fixnum::build_with(n.get_num().count_ones()))
}