From 88841b194dc86c9392a813f9b8b0cf16857acb93 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 21 Jul 2021 00:12:09 +0000 Subject: Always use a fresh clausenr for read teams, and make sure to update the clausenr in call/1, so cuts are local to that call --- builtins.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'builtins.c') diff --git a/builtins.c b/builtins.c index a037a23..e403541 100644 --- a/builtins.c +++ b/builtins.c @@ -229,6 +229,21 @@ canbecalled(Term *t) return 1; } +void +updateclausenr(Term *t, uvlong nr) +{ + /* Change the clause number on the term and its subterms, unless it is a variable */ + if(t->tag == VariableTerm) + return; + + t->clausenr = nr; + if(t->tag == CompoundTerm){ + Term *child; + for(child = t->children; child != nil; child = child->next) + updateclausenr(child, nr); + } +} + int builtincall(Term *goal, Binding **bindings, Module *module) { @@ -238,6 +253,9 @@ builtincall(Term *goal, Binding **bindings, Module *module) if(!canbecalled(callgoal)) Throw(typeerror(L"callable", callgoal)); + updateclausenr(callgoal, clausenr); + clausenr++; + goalstack = addgoals(goalstack, callgoal, module); return 1; } -- cgit v1.2.3