]> Repositorios git - scryer-prolog.git/commitdiff
Fix bug in finding arity for verify attributes
authorbakaq <[email protected]>
Sat, 1 Feb 2025 18:53:15 +0000 (15:53 -0300)
committerbakaq <[email protected]>
Tue, 4 Feb 2025 07:11:11 +0000 (04:11 -0300)
src/machine/dispatch.rs
tests/scryer/cli/issues/compilation_bug.in/a.pl [new file with mode: 0644]
tests/scryer/cli/issues/compilation_bug.in/b.pl [new file with mode: 0644]
tests/scryer/cli/issues/compilation_bug.in/c.pl [new file with mode: 0644]
tests/scryer/cli/issues/compilation_bug.stdin [new file with mode: 0644]
tests/scryer/cli/issues/compilation_bug.stdout [new file with mode: 0644]
tests/scryer/cli/issues/compilation_bug.toml [new file with mode: 0644]

index 635de289c20b241055cb127c47fb8982ee6370d8..a5ebe291d74633bc20169198395f7b58829a1ee0 100644 (file)
@@ -566,7 +566,38 @@ impl Machine {
                         let mut p = self.machine_st.p;
                         let mut arity = 0;
 
+                        self.indices.code_dir.sort_by(|_, a, _, b| a.cmp(b));
+
+                        let predicate_idx = self
+                            .indices
+                            .code_dir
+                            .binary_search_by_key(&p, |_, x| x.get().p() as usize)
+                            .unwrap_or_else(|x| x - 1);
+
+                        let current_pred_limit = self
+                            .indices
+                            .code_dir
+                            .get_index(predicate_idx + 1)
+                            .map(|x| x.1.p() as usize);
+
                         while self.code[p].is_head_instr() {
+                            //println!("{}: {:?}", p, &self.code[p]);
+                            //println!("{} {:?}", arity, self.code[p]);
+                            for r in self.code[p].registers() {
+                                //println!("reg {:?}", r);
+                                if let RegType::Temp(t) = r {
+                                    arity = std::cmp::max(arity, t);
+                                }
+                            }
+
+                            p += 1;
+                        }
+
+                        let p_interrupt = p;
+
+                        while p < self.code.len()
+                            && current_pred_limit.map(|x| p < x).unwrap_or(true)
+                        {
                             for r in self.code[p].registers() {
                                 if let RegType::Temp(t) = r {
                                     arity = std::cmp::max(arity, t);
@@ -577,14 +608,15 @@ impl Machine {
                         }
 
                         let instr = std::mem::replace(
-                            &mut self.code[p],
+                            &mut self.code[p_interrupt],
                             Instruction::VerifyAttrInterrupt(arity),
                         );
 
                         self.code[VERIFY_ATTR_INTERRUPT_LOC] = instr;
-                        self.machine_st.attr_var_init.cp = p;
+                        self.machine_st.attr_var_init.cp = p_interrupt;
                     }
                     &Instruction::VerifyAttrInterrupt(arity) => {
+                        //println!("VerifyAttr arity: {arity}");
                         // let (_, arity) = self.code[VERIFY_ATTR_INTERRUPT_LOC].to_name_and_arity();
                         // let arity = std::cmp::max(arity, self.machine_st.num_of_args);
                         self.run_verify_attr_interrupt(arity);
diff --git a/tests/scryer/cli/issues/compilation_bug.in/a.pl b/tests/scryer/cli/issues/compilation_bug.in/a.pl
new file mode 100644 (file)
index 0000000..baf223a
--- /dev/null
@@ -0,0 +1,17 @@
+% Issue 2706
+:- use_module(library(atts)).
+:- use_module(library(lists)).
+:- use_module(library(iso_ext)).
+
+:- attribute a/1.
+
+verify_attributes(_,_, []).
+
+asdf([_|Xs], N) :-
+    true,
+    N1 is N - 1,
+    asdf(Xs, N1).
+
+test_a :-
+    put_atts(A, a(1)),
+    call_with_inference_limit(asdf(A, 1), 1000, _).
diff --git a/tests/scryer/cli/issues/compilation_bug.in/b.pl b/tests/scryer/cli/issues/compilation_bug.in/b.pl
new file mode 100644 (file)
index 0000000..b6f5539
--- /dev/null
@@ -0,0 +1,30 @@
+% Issue 2632
+
+% Repro for cycle detection crash
+:- use_module(library(lists)).
+:- use_module(library(clpz)).
+:- use_module(library(error)).
+:- use_module(library(lambda)).
+:- use_module(library(debug)).
+
+clpz:monotonic.
+
+q_r(T/N, T:U) :- 0 #=< #T, 0 #=< #U, #N #= T + U.
+
+qs_Ts_Us(Qs, ΣTs, ΣUs) :-
+    maplist(\Q^T^U^(q_r(Q, T:U)), Qs, Ts, Us),
+    intlist_partsums(Ts, ΣTs),
+    intlist_partsums(Us, ΣUs).
+
+%% Utility predicates used above:
+
+intlist_partsums([X|Xs], [X|Ss]) :-
+    intlist_partsums_acc(Xs, Ss, X).
+
+intlist_partsums_acc([], [], _).
+intlist_partsums_acc([X|Xs], [S|Ss], A) :-
+    #S #= #X + #A,
+    intlist_partsums_acc(Xs, Ss, S).
+
+test_b :-
+    once(qs_Ts_Us(_, [1,3], [5,9])).
diff --git a/tests/scryer/cli/issues/compilation_bug.in/c.pl b/tests/scryer/cli/issues/compilation_bug.in/c.pl
new file mode 100644 (file)
index 0000000..a93848b
--- /dev/null
@@ -0,0 +1,19 @@
+% Issue 2809
+
+:- use_module(library(freeze)).
+
+main1 :-
+  freeze(Minor,true),
+  cbor_minor_value1(Minor, []).
+
+main2 :-
+  freeze(Minor,true),
+  cbor_minor_value2(Minor, []).
+
+cbor_minor_value1(24, S0) :- numbytes_number(1, S0).
+
+cbor_minor_value2(24, S0) :- S0=S1, numbytes_number(1, S1).
+
+numbytes_number(_, []).
+
+test_c :- main1.
diff --git a/tests/scryer/cli/issues/compilation_bug.stdin b/tests/scryer/cli/issues/compilation_bug.stdin
new file mode 100644 (file)
index 0000000..ab869cd
--- /dev/null
@@ -0,0 +1,2 @@
+use_module(a), use_module(b), use_module(c).
+\+ \+ (test_a, test_b, test_c).
diff --git a/tests/scryer/cli/issues/compilation_bug.stdout b/tests/scryer/cli/issues/compilation_bug.stdout
new file mode 100644 (file)
index 0000000..99f1c71
--- /dev/null
@@ -0,0 +1,2 @@
+   true.
+   true.
diff --git a/tests/scryer/cli/issues/compilation_bug.toml b/tests/scryer/cli/issues/compilation_bug.toml
new file mode 100644 (file)
index 0000000..a83959d
--- /dev/null
@@ -0,0 +1,2 @@
+# issue 2706
+args = ["-f", "--no-add-history"]