replace compare_term_test with parallel iterator, add is_not_variant

This commit is contained in:
Mark Thom
2025-12-11 22:08:16 -08:00
parent 9089f9ddb4
commit 29cd80510b
10 changed files with 488 additions and 475 deletions

View File

@@ -118,7 +118,7 @@ impl MachineState {
}
);
let atom = match compare_term_test!(self, a2, a3) {
let atom = match self.compare_term_test(a2, a3) {
Some(Ordering::Greater) => {
atom!(">")
}
@@ -151,11 +151,8 @@ impl MachineState {
let stub_gen = || functor_stub(atom!("sort"), 2);
let mut list = self.try_from_list(self.registers[1], stub_gen)?;
list.sort_unstable_by(|v1, v2| {
compare_term_test!(self, *v1, *v2).unwrap_or(Ordering::Less)
});
list.dedup_by(|v1, v2| compare_term_test!(self, *v1, *v2) == Some(Ordering::Equal));
list.sort_unstable_by(|v1, v2| self.compare_term_test(*v1, *v2).unwrap_or(Ordering::Less));
list.dedup_by(|v1, v2| self.compare_term_test(*v1, *v2) == Some(Ordering::Equal));
let heap_addr = resource_error_call_result!(
self,
@@ -167,7 +164,7 @@ impl MachineState {
Ok(())
}
fn keysort(&mut self, var_comparison: VarComparison) -> CallResult {
fn keysort(&mut self) -> CallResult {
self.check_keysort_errors()?;
let stub_gen = || functor_stub(atom!("keysort"), 2);
@@ -180,9 +177,7 @@ impl MachineState {
key_pairs.push((key, val));
}
key_pairs.sort_by(|a1, a2| {
compare_term_test!(self, a1.0, a2.0, var_comparison).unwrap_or(Ordering::Less)
});
key_pairs.sort_by(|a1, a2| self.compare_term_test(a1.0, a2.0).unwrap_or(Ordering::Less));
let heap_addr = resource_error_call_result!(
self,
@@ -2034,8 +2029,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
if let Some(Ordering::Greater) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.p += 1;
} else {
self.machine_st.backtrack();
@@ -2045,8 +2039,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
if let Some(Ordering::Greater) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.p = self.machine_st.cp;
} else {
self.machine_st.backtrack();
@@ -2056,7 +2049,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Less) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.p += 1;
} else {
self.machine_st.backtrack();
@@ -2066,7 +2059,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Less) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.p = self.machine_st.cp;
} else {
self.machine_st.backtrack();
@@ -2076,7 +2069,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
self.machine_st.p += 1;
}
@@ -2089,7 +2082,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
self.machine_st.p = self.machine_st.cp;
}
@@ -2102,7 +2095,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
self.machine_st.p += 1;
}
@@ -2115,7 +2108,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
self.machine_st.p = self.machine_st.cp;
}
@@ -2188,7 +2181,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Equal) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.backtrack();
} else {
self.machine_st.p += 1;
@@ -2198,7 +2191,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Equal) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.backtrack();
} else {
self.machine_st.p = self.machine_st.cp;
@@ -2213,19 +2206,11 @@ impl Machine {
step_or_fail!(self.machine_st, self.machine_st.p = self.machine_st.cp);
}
&Instruction::DefaultCallKeySort => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Distinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
step_or_fail!(self.machine_st, self.machine_st.p += 1);
}
&Instruction::DefaultExecuteKeySort => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Distinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
if self.machine_st.fail {
self.machine_st.backtrack();
@@ -2323,8 +2308,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
if let Some(Ordering::Greater) = self.machine_st.compare_term_test(a1, a2) {
increment_call_count!(self.machine_st);
self.machine_st.p += 1;
} else {
@@ -2335,8 +2319,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
if let Some(Ordering::Greater) = self.machine_st.compare_term_test(a1, a2) {
increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
} else {
@@ -2347,7 +2330,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Less) = self.machine_st.compare_term_test(a1, a2) {
increment_call_count!(self.machine_st);
self.machine_st.p += 1;
} else {
@@ -2358,7 +2341,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Less) = self.machine_st.compare_term_test(a1, a2) {
increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
} else {
@@ -2369,7 +2352,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
increment_call_count!(self.machine_st);
self.machine_st.p += 1;
@@ -2383,7 +2366,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
@@ -2397,7 +2380,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
increment_call_count!(self.machine_st);
self.machine_st.p += 1;
@@ -2411,7 +2394,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
match compare_term_test!(self.machine_st, a1, a2) {
match self.machine_st.compare_term_test(a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
@@ -2503,7 +2486,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Equal) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.backtrack();
} else {
increment_call_count!(self.machine_st);
@@ -2514,7 +2497,7 @@ impl Machine {
let a1 = self.machine_st.registers[1];
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
if let Some(Ordering::Equal) = self.machine_st.compare_term_test(a1, a2) {
self.machine_st.backtrack();
} else {
increment_call_count!(self.machine_st);
@@ -2542,11 +2525,7 @@ impl Machine {
}
}
&Instruction::CallKeySort => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Distinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
if self.machine_st.fail {
self.machine_st.backtrack();
@@ -2556,11 +2535,7 @@ impl Machine {
}
}
&Instruction::ExecuteKeySort => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Distinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
if self.machine_st.fail {
self.machine_st.backtrack();
@@ -2570,11 +2545,7 @@ impl Machine {
}
}
&Instruction::CallKeySortWithConstantVarOrdering => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Indistinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
if self.machine_st.fail {
self.machine_st.backtrack();
@@ -2584,11 +2555,7 @@ impl Machine {
}
}
&Instruction::ExecuteKeySortWithConstantVarOrdering => {
try_or_throw!(
self.machine_st,
self.machine_st.keysort(VarComparison::Indistinct),
continue
);
try_or_throw!(self.machine_st, self.machine_st.keysort(), continue);
if self.machine_st.fail {
self.machine_st.backtrack();
@@ -4813,6 +4780,14 @@ impl Machine {
try_or_throw!(self.machine_st, self.argv(), continue);
step_or_fail!(self.machine_st, self.machine_st.p = self.machine_st.cp);
}
&Instruction::CallIsVariant => {
self.machine_st.fail = self.machine_st.is_not_variant();
step_or_fail!(self.machine_st, self.machine_st.p += 1);
}
&Instruction::ExecuteIsVariant => {
self.machine_st.fail = self.machine_st.is_not_variant();
step_or_fail!(self.machine_st, self.machine_st.p = self.machine_st.cp);
}
&Instruction::CallCurrentTime => {
self.current_time();
step_or_fail!(self.machine_st, self.machine_st.p += 1);