fail when exception caught from subgoal expansion (#1535)
This commit is contained in:
@@ -625,15 +625,45 @@ strip_subst_module(Goal, M1, M2, G) :-
|
|||||||
; true
|
; 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.
|
:- non_counted_backtracking expand_subgoal/5.
|
||||||
|
|
||||||
expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :-
|
expand_subgoal(UnexpandedGoals, MS, M, ExpandedGoals, HeadVars) :-
|
||||||
strip_subst_module(UnexpandedGoals, M, Module, UnexpandedGoals0),
|
strip_subst_module(UnexpandedGoals, M, Module, UnexpandedGoals0),
|
||||||
nonvar(UnexpandedGoals0),
|
nonvar(UnexpandedGoals0),
|
||||||
complete_partial_goal(MS, UnexpandedGoals0, _, SuppArgs, UnexpandedGoals1),
|
complete_partial_goal(MS, UnexpandedGoals0, _, SuppArgs, UnexpandedGoals1),
|
||||||
( goal_expansion(UnexpandedGoals1, Module, UnexpandedGoals2),
|
( subgoal_expansion(UnexpandedGoals1, Module, UnexpandedGoals2),
|
||||||
( Module \== user ->
|
( Module \== user ->
|
||||||
goal_expansion(UnexpandedGoals2, user, UnexpandedGoals3)
|
subgoal_expansion(UnexpandedGoals2, user, UnexpandedGoals3)
|
||||||
; UnexpandedGoals3 = UnexpandedGoals2
|
; UnexpandedGoals3 = UnexpandedGoals2
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user