]> Repositorios git - scryer-prolog.git/commitdiff
fail when exception caught from subgoal expansion (#1535)
authorMark Thom <[email protected]>
Sun, 24 Jul 2022 19:36:34 +0000 (13:36 -0600)
committerMark Thom <[email protected]>
Thu, 27 Oct 2022 05:36:07 +0000 (23:36 -0600)
src/loader.pl

index 20db3ba741e29db492d60bbe0679c7d3f952c539..b0905149d249a6697537a02d04ad38966fa80932 100644 (file)
@@ -625,15 +625,45 @@ strip_subst_module(Goal, M1, M2, G) :-
     ;  true
     ).
 
+:- non_counted_backtracking subgoal_expansion/3.
+
+/*
+ * subgoal_expansion differs from goal_expansion only in that it fails
+ * unconditionally after catching an(y) exception, aborting the
+ * inlining process. It is expected that goal expansion will succeed
+ * when expand_goal is later invoked at runtime.
+ */
+
+subgoal_expansion_fail(B) :-
+    builtins:set_cp(B),
+    fail.
+
+subgoal_expansion(Goal, Module, ExpandedGoal) :-
+    '$get_cp'(B),
+    (  atom(Module),
+       '$predicate_defined'(Module, goal_expansion, 2),
+       catch('$call'(Module:goal_expansion(Goal, ExpandedGoal0)),
+             _E,
+             '$call'(loader:subgoal_expansion_fail(B))
+            ),
+       (  var(ExpandedGoal0) ->
+          error:instantiation_error(goal_expansion/2)
+       ;  '$set_cp'(B),
+          subgoal_expansion(ExpandedGoal0, Module, ExpandedGoal)
+       )
+    ;  Goal = ExpandedGoal
+    ).
+
+
 :- non_counted_backtracking expand_subgoal/5.
 
 expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :-
     strip_subst_module(UnexpandedGoals, M, Module, UnexpandedGoals0),
     nonvar(UnexpandedGoals0),
     complete_partial_goal(MS, UnexpandedGoals0, _, SuppArgs, UnexpandedGoals1),
-    (  goal_expansion(UnexpandedGoals1, Module, UnexpandedGoals2),
+    (  subgoal_expansion(UnexpandedGoals1, Module, UnexpandedGoals2),
        (  Module \== user ->
-          goal_expansion(UnexpandedGoals2, user, UnexpandedGoals3)
+          subgoal_expansion(UnexpandedGoals2, user, UnexpandedGoals3)
        ;  UnexpandedGoals3 = UnexpandedGoals2
        )
     ),