From: Mark Date: Fri, 15 Dec 2023 07:42:58 +0000 (-0700) Subject: Revert "improve performance of lower_bound_of_target_clause (#1598)" X-Git-Tag: v0.9.4~74 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=e5ea95db8d8ddc884860e453f082626b526e503f;p=scryer-prolog.git Revert "improve performance of lower_bound_of_target_clause (#1598)" This reverts commit 8938331915c53e34be8f98002fe8d56d8b7ada08. --- diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index 1a2b35d4..9cb533d1 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -1238,7 +1238,6 @@ call_retract_helper(Head, Body, P, Module) :- ClauseQualifier = builtins ; ClauseQualifier = Module ), - '$debug_hook', ClauseQualifier:'$clause'(Head, Body), '$get_clause_p'(Head, P, Module). diff --git a/src/machine/compile.rs b/src/machine/compile.rs index da2e4bc1..296d076f 100644 --- a/src/machine/compile.rs +++ b/src/machine/compile.rs @@ -42,38 +42,42 @@ pub(super) fn bootstrapping_compile( Ok(()) } -fn lower_bound_of_target_clause(skeleton: &mut PredicateSkeleton, target_pos: usize) -> usize { +fn lower_bound_of_target_clause(skeleton: &PredicateSkeleton, target_pos: usize) -> usize { if target_pos == 0 { return 0; } - let index = target_pos - 1; - let arg_num = skeleton.clauses[index].opt_arg_index_key.arg_num(); + let arg_num = skeleton.clauses[target_pos - 1].opt_arg_index_key.arg_num(); if arg_num == 0 { - return index; + return target_pos - 1; } - skeleton - .clauses[target_pos] - .opt_arg_index_key - .switch_on_term_loc() - .map(|index_loc| { - let search_result = skeleton.clauses.make_contiguous() - [0 .. skeleton.core.clause_assert_margin] - .partition_point(|clause_index_info| { - clause_index_info.clause_start > index_loc - }); - - if search_result < skeleton.core.clause_assert_margin { - search_result - } else { - skeleton.clauses.make_contiguous()[skeleton.core.clause_assert_margin ..] - .partition_point(|clause_index_info| { - clause_index_info.clause_start < index_loc - }) + skeleton.core.clause_assert_margin + let mut index_loc_opt = None; + + for index in (0..target_pos).rev() { + let current_arg_num = skeleton.clauses[index].opt_arg_index_key.arg_num(); + + if current_arg_num == 0 || current_arg_num != arg_num { + return index + 1; + } + + if let Some(index_loc) = index_loc_opt { + let current_index_loc = skeleton.clauses[index] + .opt_arg_index_key + .switch_on_term_loc(); + + if Some(index_loc) != current_index_loc { + return index + 1; } - }).unwrap_or(index) + } else { + index_loc_opt = skeleton.clauses[index] + .opt_arg_index_key + .switch_on_term_loc(); + } + } + + 0 } fn derelictize_try_me_else(