From 83ead46e13ace9076e1c5de22242b4f9fae9debf Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 14 Oct 2019 00:07:22 -0600 Subject: [PATCH] re: issue #196 --- src/prolog/machine/attributed_variables.rs | 3 ++ src/prolog/machine/project_attributes.pl | 32 +++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/prolog/machine/attributed_variables.rs b/src/prolog/machine/attributed_variables.rs index d3ad71d0..41189fad 100644 --- a/src/prolog/machine/attributed_variables.rs +++ b/src/prolog/machine/attributed_variables.rs @@ -111,6 +111,9 @@ impl MachineState { HeapCellValue::Addr(Addr::StackCell(fr, sc)) => { query_vars.insert(Addr::StackCell(fr, sc)); } + HeapCellValue::Addr(Addr::AttrVar(h)) => { + query_vars.insert(Addr::AttrVar(h)); + } _ => {} }; } diff --git a/src/prolog/machine/project_attributes.pl b/src/prolog/machine/project_attributes.pl index 084d60b8..3b399f98 100644 --- a/src/prolog/machine/project_attributes.pl +++ b/src/prolog/machine/project_attributes.pl @@ -2,8 +2,8 @@ driver(QueryVars, AttrVars) :- gather_modules(AttrVars, Modules0, _), sort(Modules0, Modules), call_project_attributes(Modules, QueryVars, AttrVars), - call_attribute_goals(Modules, QueryVars), - call_attribute_goals(Modules, AttrVars), + call_attribute_goals(Modules, call_query_var_goals, QueryVars), + call_attribute_goals(Modules, call_attr_var_goals, AttrVars), '$return_from_attribute_goals'. enqueue_goals(Goals0) :- @@ -27,17 +27,18 @@ call_project_attributes([], _, _). call_project_attributes([Module|Modules], QueryVars, AttrVars) :- ( catch(Module:project_attributes(QueryVars, AttrVars), E, - '$print_project_attributes_exception'(Module, E)) + '$print_project_attributes_exception'(Module, E) + ) -> true ; true ), call_project_attributes(Modules, QueryVars, AttrVars). -call_attribute_goals([], _). -call_attribute_goals([Module | Modules], AttrVars) :- - call_goals(AttrVars, Module, Goals), +call_attribute_goals([], _, _). +call_attribute_goals([Module | Modules], GoalCaller, AttrVars) :- + call(GoalCaller, AttrVars, Module, Goals), enqueue_goals(Goals), - call_attribute_goals(Modules, AttrVars). + call_attribute_goals(Modules, GoalCaller, AttrVars). '$print_attribute_goals_exception'(Module, E) :- ( E = error(evaluation_error((Module:attribute_goals)/3), attribute_goals/3) @@ -47,8 +48,8 @@ call_attribute_goals([Module | Modules], AttrVars) :- nl ). -call_goals([], _, []). -call_goals([AttrVar|AttrVars], Module, Goals) :- +call_query_var_goals([], _, []). +call_query_var_goals([AttrVar|AttrVars], Module, Goals) :- ( catch(( Module:attribute_goals(AttrVar, Goals, RGoals0), atts:'$default_attr_list'(Module, AttrVar, RGoals0, RGoals) ), @@ -59,7 +60,18 @@ call_goals([AttrVar|AttrVars], Module, Goals) :- -> true ; atts:'$default_attr_list'(Module, AttrVar, Goals, RGoals) ), - call_goals(AttrVars, Module, RGoals). + call_query_var_goals(AttrVars, Module, RGoals). + +call_attr_var_goals([], _, []). +call_attr_var_goals([AttrVar|AttrVars], Module, Goals) :- + ( catch(Module:attribute_goals(AttrVar, Goals, RGoals), + E, + '$print_attribute_goals_exception'(Module, E) + ) + -> true + ; true + ), + call_attr_var_goals(AttrVars, Module, RGoals). gather_modules([], [], _). gather_modules([AttrVar|AttrVars], Modules, Modules0) :- -- 2.54.0