detect module resolved cut in interpreted (,)

This commit is contained in:
Mark Thom
2021-11-21 23:09:39 -07:00
parent 073f281f1e
commit 7507e88406
5 changed files with 19 additions and 20 deletions

View File

@@ -37,11 +37,9 @@ pub enum ArenaHeaderTag {
OutputFileStream = 0b10100, OutputFileStream = 0b10100,
NamedTcpStream = 0b011100, NamedTcpStream = 0b011100,
NamedTlsStream = 0b100000, NamedTlsStream = 0b100000,
// PausedPrologStream = 0b101100,
ReadlineStream = 0b110000, ReadlineStream = 0b110000,
StaticStringStream = 0b110100, StaticStringStream = 0b110100,
ByteStream = 0b111000, ByteStream = 0b111000,
// StandardInputStream = 0b100,
StandardOutputStream = 0b1100, StandardOutputStream = 0b1100,
StandardErrorStream = 0b11000, StandardErrorStream = 0b11000,
NullStream = 0b111100, NullStream = 0b111100,

View File

@@ -220,6 +220,12 @@ _ ; G :- call('$call'(G)).
set_cp(B) :- '$set_cp'(B). set_cp(B) :- '$set_cp'(B).
:- non_counted_backtracking comma_dispatch/3.
comma_dispatch(G1, G2, B) :-
comma_dispatch_prep((G1, G2), B, Conts),
comma_dispatch_call_list(Conts).
:- non_counted_backtracking comma_dispatch_prep/3. :- non_counted_backtracking comma_dispatch_prep/3.
comma_dispatch_prep(Gs, B, [Cont|Conts]) :- comma_dispatch_prep(Gs, B, [Cont|Conts]) :-
@@ -227,20 +233,18 @@ comma_dispatch_prep(Gs, B, [Cont|Conts]) :-
( functor(Gs, ',', 2) -> ( functor(Gs, ',', 2) ->
arg(1, Gs, G1), arg(1, Gs, G1),
arg(2, Gs, G2), arg(2, Gs, G2),
( G1 == ! -> ( nonvar(G1), ( G1 = ! ; G1 = _:! ) ->
Cont = builtins:set_cp(B) Cont = builtins:set_cp(B)
; callable(G1) -> ; Cont = G1
Cont = G1
; Cont = throw(error(type_error(callable, G1), call/1))
), ),
comma_dispatch_prep(G2, B, Conts) comma_dispatch_prep(G2, B, Conts)
; ( Gs = ! ; Gs = _:! ) ->
Cont = builtins:set_cp(B),
Conts = []
; Cont = Gs, ; Cont = Gs,
Conts = [] Conts = []
) )
; Gs == ! -> ; Cont = Gs,
Cont = builtins:set_cp(B),
Conts = []
; Cont = throw(error(type_error(callable, Gs), call/1)),
Conts = [] Conts = []
). ).
@@ -302,13 +306,6 @@ comma_dispatch_call_list([G1]) :-
'$call'(G1). '$call'(G1).
:- non_counted_backtracking comma_dispatch/3.
comma_dispatch(G1, G2, B) :-
comma_dispatch_prep((G1, G2), B, Conts),
comma_dispatch_call_list(Conts).
% univ. % univ.
:- non_counted_backtracking univ_errors/3. :- non_counted_backtracking univ_errors/3.

View File

@@ -691,10 +691,14 @@ expand_goal_cases((\+ Goals0), Module, ExpandedGoals, HeadVars) :-
expand_goal_cases((Module:Goals0), _, ExpandedGoals, HeadVars) :- expand_goal_cases((Module:Goals0), _, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, Goals1, HeadVars), expand_goal(Goals0, Module, Goals1, HeadVars),
ExpandedGoals = (Module:Goals1). ExpandedGoals = (Module:Goals1).
expand_goal_cases(call(Goals0), _, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, Goals1, HeadVars),
ExpandedGoals = call(Goals1).
expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :- expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :-
( var(UnexpandedGoals) -> ( var(UnexpandedGoals) ->
expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars) UnexpandedGoals = ExpandedGoals
% expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars)
; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), ; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
( Module \== user -> ( Module \== user ->
goal_expansion(UnexpandedGoals1, user, Goals) goal_expansion(UnexpandedGoals1, user, Goals)

View File

@@ -185,7 +185,7 @@ submit_query_and_print_results(Term0, VarList) :-
( functor(Term0, call, _) -> ( functor(Term0, call, _) ->
Term = Term0 % prevent pre-mature expansion of incomplete goal Term = Term0 % prevent pre-mature expansion of incomplete goal
% in the first argument, which is done by call/N % in the first argument, which is done by call/N
; expand_goal(call(Term0), user, call(Term)) ; expand_goal(Term0, user, Term)
), ),
setup_call_cleanup(bb_put('$first_answer', true), setup_call_cleanup(bb_put('$first_answer', true),
submit_query_and_print_results_(Term, VarList), submit_query_and_print_results_(Term, VarList),