[m-rev.] semidet code managed in ssdb
oan at missioncriticalit.com
oan at missioncriticalit.com
Mon Oct 29 13:49:33 AEDT 2007
On 29/10/2007, "Peter Wang" <novalazy at gmail.com> wrote:
>On 2007-10-27, Olivier Annet <oan at missioncriticalit.com> wrote:
>> Hi,
>>
>> could someone review my code before the commit please.
>>
>> ===================================================================
>>
>>
>> Estimated hours taken: 50
>> Branches: main
>>
>> The source-to-source debugger is able to manage the semidet predicate/function
>> now.
>>
>>
>> compiler/ssdebug.m:
>> Modification to manage the semidet function.
>> Optimization in the generation of the goal's argument at exit point.
>>
>> ssdb/ssdb.m:
>> Correction of some bugs in the prompt.
>>
>> tools/lmc.in:
>> Search in the `ssdb' directory for C header files and modules.
>>
>>
>> Index: compiler/ssdebug.m
>> ===================================================================
>> RCS file: /home/mercury1/repository/mercury/compiler/ssdebug.m,v
>> retrieving revision 1.6
>> diff -u -r1.6 ssdebug.m
>> --- compiler/ssdebug.m 18 Oct 2007 14:59:44 -0000 1.6
>> +++ compiler/ssdebug.m 26 Oct 2007 06:06:35 -0000
>> @@ -149,6 +149,7 @@
>>
>> :- import_module check_hlds.mode_util.
>> :- import_module check_hlds.polymorphism.
>> +:- import_module check_hlds.purity.
>> :- import_module hlds.goal_util.
>> :- import_module hlds.hlds_goal.
>> :- import_module hlds.instmap.
>> @@ -177,9 +178,51 @@
>>
>> %-----------------------------------------------------------------------------%
>>
>> -process_proc(PredId, _ProcId, !ProcInfo, !ModuleInfo, !IO) :-
>> + %
>> + % Switch on the determinism used. It's the compiler determinism which
>> + % is used. The determinism for the goal migth be the same.
>> + %
>> +process_proc(PredId, ProcId, !ProcInfo, !ModuleInfo, !IO) :-
>> +
>> + proc_info_get_inferred_determinism(!.ProcInfo, Determinism),
>> +
>> + ( Determinism = detism_det,
>> + process_proc_det(PredId, ProcId, !ProcInfo, !ModuleInfo, !IO)
>> +
>> + ; Determinism = detism_semi,
>> + process_proc_semi(PredId, ProcId, !ProcInfo, !ModuleInfo, !IO)
>> +
>> + ; Determinism = detism_multi,
>> + error("determ_multi: not yet implemented in ssdb")
>> +
>> + ; Determinism = detism_non,
>> + error("determ_non: not yet implemented in ssdb")
>> +
>> + ; Determinism = detism_cc_multi,
>> + error("determ_cc_multi: not yet implemented in ssdb")
>> +
>> + ; Determinism = detism_cc_non,
>> + error("detism_cc_non: not yet implemented in ssdb")
>> +
>> + ; Determinism = detism_erroneous,
>> + error("detism_erroneous: not yet implemented in ssdb")
>> +
>> + ; Determinism = detism_failure,
>> + error("detism_failure: not yet implemented in ssdb")
>> +
>> + ).
>
>Write switches just like disjunctions.
>
>> +
>> + %
>> + % Generate code for a deterministic goal
>> + %
>> +:- pred process_proc_det(pred_id::in, proc_id::in,
>> + proc_info::in, proc_info::out, module_info::in, module_info::out,
>> + io::di, io::uo) is det.
>> +
>> +process_proc_det(PredId, ProcId, !ProcInfo, !ModuleInfo, !IO) :-
>> proc_info_get_goal(!.ProcInfo, Goal0),
>> -
>> + HldsGoalInfo = get_hlds_goal_info(Goal0),
>> +
>
>Call it GoalInfo0 to match Goal0. Name Goal0 more clearly, e.g. BodyGoal0.
>
>> some [!PredInfo, !Varset, !Vartypes] (
>> proc_info_get_varset(!.ProcInfo, !:Varset),
>> proc_info_get_vartypes(!.ProcInfo, !:Vartypes),
>> @@ -196,120 +239,241 @@
>> %
>> proc_info_get_headvars(!.ProcInfo, HeadVars),
>> proc_info_get_initial_instmap(!.ProcInfo, !.ModuleInfo, InitInstMap),
>> -
>> - %
>> +
>> + %
>> % Make a list which records the value for each of the head variables at
>> % the call port.
>> %
>> - make_call_list_arg(ssdb_call, InitInstMap, HeadVars, CallArgListVar,
>> - CallArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> - !Vartypes),
>> + make_arg_list(0, InitInstMap, HeadVars, map.init, CallArgListVar,
>> + CallArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> + !Vartypes, map.init, BoundVarDescsAtCall),
>>
>> %
>> % Generate the call.
>> % Generate the call to handle_event(call).
>
>Delete the first line.
>
>> - % Return a list of goals.
>> %
>> - make_handle_event_call(ssdb_call, ProcIdVar, CallArgListVar,
>> + make_call_handle_event(ssdb_call, ProcIdVar, CallArgListVar,
>
>Why did you rename it?
We could get confuse with make_handle_event_call (e.g. why there is no
make_handle_event_exit). It was to make to difference between the call
to the predicate and the call at an event point.
>
>> HandleEventCallGoals, !ModuleInfo, !Varset, !Vartypes),
>> -
>> +
>> %
>> % Get the updated InstMap.
>> %
>> update_instmap(Goal0, InitInstMap, UpdatedInstMap),
>
>Call that FinalInstMap.
>
>>
>> - %
>> + %
>> + % Rename the variable
>> + %
>
>Full stop.
>
>> + proc_info_instantiated_head_vars(!.ModuleInfo, !.ProcInfo,
>> + InstantiatedVars),
>> + goal_info_get_instmap_delta(HldsGoalInfo) = InstMapDelta,
>> + create_renaming(InstantiatedVars, InstMapDelta, !Varset, !Vartypes,
>> + RenamingGoals, _NewVars, Renaming),
>> + rename_some_vars_in_goal(Renaming, Goal0, Goal1),
>> +
>> + %
>> % Make the variable list at the exit port. It's currently a completely
>> % new list instead of adding on to the list generated for the call
>> % port.
>> %
>> - % XXX Optimization : Only output variables should be regenerated.
>> - %
>> - make_call_list_arg(ssdb_exit, UpdatedInstMap, HeadVars, ExitArgListVar,
>> - ExitArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> - !Vartypes),
>> + make_arg_list(0, UpdatedInstMap, HeadVars, Renaming, ExitArgListVar,
>> + ExitArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> + !Vartypes, BoundVarDescsAtCall, _BoundVarDescsAtExit),
>>
>> %
>> % Generate the exit.
>> % Generate the call to handle_event(exit).
>
>Delete the first line.
>
>> - % Return a list of goals.
>> %
>> - make_handle_event_call(ssdb_exit, ProcIdVar, ExitArgListVar,
>> + make_call_handle_event(ssdb_exit, ProcIdVar, ExitArgListVar,
>> HandleEventExitGoals, !ModuleInfo, !Varset, !Vartypes),
>>
>>
>> %
>> - % Place the call and exit events around the initial goal.
>> + % Organize the order of the generated code.
>> %
>> ConjGoals = ProcIdGoals ++ CallArgListGoals ++ HandleEventCallGoals ++
>> - [Goal0 | ExitArgListGoals] ++ HandleEventExitGoals,
>> + [Goal1 | ExitArgListGoals] ++ HandleEventExitGoals ++ RenamingGoals,
>>
>> + goal_info_init(GoalInfoWP),
>> + GoalWithoutPurity = hlds_goal(conj(plain_conj, ConjGoals), GoalInfoWP),
>> +
>> + %
>> + % Get the purity of the goal
>> + %
>
>.
>
>> + Purity = goal_info_get_purity(HldsGoalInfo),
>> + ScopeReason = promise_purity(dont_make_implicit_promises, Purity),
>> goal_info_init(GoalInfo),
>> - Goal = hlds_goal(conj(plain_conj, ConjGoals), GoalInfo),
>> + Goal = hlds_goal(scope(ScopeReason, GoalWithoutPurity), GoalInfo),
>
>You don't need a promise if the goal is already impure.
>
>>
>> - proc_info_set_varset(!.Varset, !ProcInfo),
>> - proc_info_set_vartypes(!.Vartypes, !ProcInfo),
>> + commit_goal_changes(Goal, PredId, ProcId, !.PredInfo, !ProcInfo,
>> + !ModuleInfo, !.Varset, !.Vartypes)
>> + ).
>>
>> - proc_info_set_goal(Goal, !ProcInfo),
>>
>> - requantify_proc(!ProcInfo),
>> - recompute_instmap_delta_proc(yes, !ProcInfo, !ModuleInfo),
>> + %
>> + % Generate code for un semi-det goal
>
>a semidet goal
>
>> + %
>> +:- pred process_proc_semi(pred_id::in, proc_id::in,
>> + proc_info::in, proc_info::out, module_info::in, module_info::out,
>> + io::di, io::uo) is det.
>>
>> - module_info_set_pred_info(PredId, !.PredInfo, !ModuleInfo)
>> - ).
>> +process_proc_semi(PredId, ProcId, !ProcInfo, !ModuleInfo, !IO) :-
>> + proc_info_get_goal(!.ProcInfo, Goal0),
>
>Same as before.
>
>> + some [!PredInfo, !Varset, !Vartypes] (
>> + proc_info_get_varset(!.ProcInfo, !:Varset),
>> + proc_info_get_vartypes(!.ProcInfo, !:Vartypes),
>>
>> + %
>> + % Make the ssdb_proc_id.
>> + %
>> + module_info_pred_info(!.ModuleInfo, PredId, !:PredInfo),
>> + make_proc_id_construction(!.PredInfo, !.ProcInfo, ProcIdGoals,
>> + ProcIdVar, !Varset, !Vartypes),
>
>I think ProcIdGoals and ProcIdVar sound too similar to ProcId.
>
>> +
>> + %
>> + % Get list(prog_var) and there type.
>> + %
>
>Get the list of head variables and their types.
>
>> + proc_info_get_headvars(!.ProcInfo, HeadVars),
>> + proc_info_get_initial_instmap(!.ProcInfo, !.ModuleInfo, InitInstMap),
>>
>> + %
>> + % Make a list which records the value for each of the head variables at
>> + % the call port.
>> + %
>> + make_arg_list(0, InitInstMap, HeadVars, map.init, CallArgListVar,
>> + CallArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> + !Vartypes, map.init, BoundVarDescsAtCall),
>>
>> -:- pred make_call_list_arg(ssdb_event_type::in, instmap::in,
>> - list(prog_var)::in, prog_var::out, list(hlds_goal)::out,
>> - module_info::in, module_info::out, proc_info::in, proc_info::out,
>> - pred_info::in, pred_info::out, prog_varset::in, prog_varset::out,
>> - vartypes::in, vartypes::out) is det.
>> + %
>> + % Generate the call.
>> + % Generate the call to handle_event(call).
>> + %
>
>Delete one line.
>
>> + make_call_handle_event(ssdb_call, ProcIdVar, CallArgListVar,
>> + HandleEventCallGoals, !ModuleInfo, !Varset, !Vartypes),
>>
>> -make_call_list_arg(Event, InstMap, HeadVars, ArgListVar, ArgListGoals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes) :-
>> + %
>> + % Get the updated InstMap.
>> + %
>> + update_instmap(Goal0, InitInstMap, UpdatedInstMap),
>
>FinalInstMap
>
>>
>> - (
>> - ( Event = ssdb_call
>> - ; Event = ssdb_exit
>> - ),
>> -
>> %
>> - % Make the list of argument at call/exit point
>> + % Rename the variable
>> %
>
>.
>
>> - make_arg_list(0, InstMap, HeadVars, ArgListVar, ArgListGoals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes)
>> + proc_info_instantiated_head_vars(!.ModuleInfo, !.ProcInfo,
>> + InstantiatedVars),
>> + get_hlds_goal_info(Goal0) = HldsGoalInfo,
>
>Same as before.
>
>> + goal_info_get_instmap_delta(HldsGoalInfo) = InstMapDelta,
>> + create_renaming(InstantiatedVars, InstMapDelta, !Varset, !Vartypes,
>> + RenamingGoals, _NewVars, Renaming),
>> + rename_some_vars_in_goal(Renaming, Goal0, Goal1),
>> +
>> + %
>> + % Make the variable list at the exit port. It's currently a completely
>> + % new list instead of adding on to the list generated for the call
>> + % port.
>> + %
>> + make_arg_list(0, UpdatedInstMap, HeadVars, Renaming, ExitArgListVar,
>> + ExitArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> + !Vartypes, BoundVarDescsAtCall, _BoundVarDescsAtExit),
>>
>> - ;
>> - ( Event = ssdb_fail
>> - ; Event = ssdb_redo
>> - ),
>> + %
>> + % Generate the exit.
>> + % Generate the call to handle_event(exit).
>> + %
>
>same
>
>> + make_call_handle_event(ssdb_exit, ProcIdVar, ExitArgListVar,
>> + HandleEventExitGoals, !ModuleInfo, !Varset, !Vartypes),
>> +
>> +
>> + %
>> + % Generate the goal's list argument.
>> + %
>
>Generate the list of head variables at the fail port.
>
>> + make_arg_list(0, InitInstMap, [], Renaming, FailArgListVar,
>> + FailArgListGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset,
>> + !Vartypes, BoundVarDescsAtCall, _BoundVarDescsAtFail),
>>
>> %
>> - % Make the list of argument at fail/redo point
>> - % Need only to generate the empty list.
>> + % Generate the fail.
>> + % Generate the call to handle_event(fail).
>> + %
>
>same
>
>> + make_call_handle_event(ssdb_fail, ProcIdVar, FailArgListVar,
>> + HandleEventFailGoals, !ModuleInfo, !Varset, !Vartypes),
>> +
>> + make_fail(FailGoal, !.ModuleInfo),
>
>make_fail_call
>
>> +
>> +
>> %
>> - make_arg_list(0, InstMap, HeadVars, ArgListVar, ArgListGoals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes)
>> + % Organize the order of the generated code.
>> + %
>> + CallVarGoal = ProcIdGoals ++ CallArgListGoals ++ HandleEventCallGoals,
>> + GoalsIf = [Goal1],
>
>"Cond" would be better than "If".
>
>> + GoalsThen = ExitArgListGoals ++ HandleEventExitGoals ++ RenamingGoals,
>> + GoalsElse = FailArgListGoals ++ HandleEventFailGoals ++ [FailGoal],
>> +
>> + goal_info_init(GoalInfo0),
>> + goal_list_determinism(GoalsIf, Detism),
>> + goal_info_set_determinism(Detism, GoalInfo0, GoalInfo),
>
>GoalInfoIf
>
>> +
>> + goal_info_set_determinism(detism_det, GoalInfo0, GoalInfoThen),
>> + goal_info_set_determinism(detism_semi, GoalInfo0, GoalInfoElse),
>> +
>> + IteExistVars = [],
>> + IfGoal = hlds_goal(conj(plain_conj, GoalsIf), GoalInfo),
>> + ThenGoal = hlds_goal(conj(plain_conj, GoalsThen), GoalInfoThen),
>> + ElseGoal = hlds_goal(conj(plain_conj, GoalsElse), GoalInfoElse),
>> +
>> + % XXX not sure about determinism
>> + GoalITE = hlds_goal(if_then_else(IteExistVars, IfGoal, ThenGoal,
>> + ElseGoal), GoalInfo),
>> +
>> + ConjGoal = CallVarGoal ++ [GoalITE],
>
>Move the "CallVarGoal =" line closer to here.
>
>> + GoalWithoutPurity = hlds_goal(conj(plain_conj, ConjGoal), GoalInfo),
>> +
>> + %
>> + % Get the purity of the initial goal.
>> + %
>> + Purity = goal_info_get_purity(HldsGoalInfo),
>> + ScopeReason = promise_purity(dont_make_implicit_promises, Purity),
>> + Goal = hlds_goal(scope(ScopeReason, GoalWithoutPurity), GoalInfo),
>> +
>> + commit_goal_changes(Goal, PredId, ProcId, !.PredInfo, !ProcInfo,
>> + !ModuleInfo, !.Varset, !.Vartypes)
>> ).
>>
>>
>>
>> +:- pred commit_goal_changes(hlds_goal::in, pred_id::in, proc_id::in,
>> + pred_info::in, proc_info::in, proc_info::out,
>> + module_info::in, module_info::out, prog_varset::in, vartypes::in) is det.
>> +
>> +commit_changes(Goal, PredId, ProcId, !.PredInfo, !ProcInfo, !ModuleInfo,
>> + Varset, Vartypes) :-
>
>Should be commit_goal_changes.
>
>> + proc_info_set_varset(Varset, !ProcInfo),
>> + proc_info_set_vartypes(Vartypes, !ProcInfo),
>> +
>> + proc_info_set_goal(Goal, !ProcInfo),
>> +
>> + requantify_proc(!ProcInfo),
>> + recompute_instmap_delta_proc(yes, !ProcInfo, !ModuleInfo),
>> + pred_info_set_proc_info(ProcId, !.ProcInfo, !PredInfo),
>> + repuritycheck_proc(!.ModuleInfo, proc(PredId, ProcId), !PredInfo),
>> + module_info_set_pred_info(PredId, !.PredInfo, !ModuleInfo).
>
>Fix the indentation.
>
>>
>> -:- pred make_handle_event_call(ssdb_event_type::in, prog_var::in,
>> +
>> +%-----------------------------------------------------------------------------%
>> +
>> +
>> + %
>> + % Build the following goal : handle_event(ProcId, Event, ListOfArgument).
>
>Arguments
>
>> + %
>> +:- pred make_call_handle_event(ssdb_event_type::in, prog_var::in,
>> prog_var::in, list(hlds_goal)::out, module_info::in, module_info::out,
>> prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.
>>
>> -make_handle_event_call(Event, ProcIdVar, ArgListVar, Goals, !ModuleInfo,
>> +make_call_handle_event(Event, ProcIdVar, ArgListVar, Goals, !ModuleInfo,
>> !Varset, !Vartypes) :-
>>
>> make_ssdb_event_type_construction(Event, EventConstructor, EventVar,
>> !Varset, !Vartypes),
>>
>> - %
>> - % Build the following goal
>> - % handle_event(ProcId, Event, VarList).
>> - %
>> SSDBModule = mercury_ssdb_builtin_module,
>> Features = [],
>> InstMapSrc = [],
>> @@ -321,7 +485,6 @@
>>
>> Goals = [EventConstructor, HandleEventGoal].
>>
>> -%-----------------------------------------------------------------------------%
>>
>> %
>> % make_proc_id_construction(PredInfo, ProcInfo,
>> @@ -332,8 +495,7 @@
>> % ssdb_proc_id.
>> %
>> :- pred make_proc_id_construction(pred_info::in, proc_info::in,
>> - hlds_goals::out, prog_var::out,
>> - prog_varset::in, prog_varset::out,
>> + hlds_goals::out, prog_var::out, prog_varset::in, prog_varset::out,
>> vartypes::in, vartypes::out) is det.
>>
>> make_proc_id_construction(PredInfo,
>> @@ -360,6 +522,22 @@
>>
>> Goals = [ConstructModuleName, ConstructPredName, ConstructProcIdGoal].
>>
>> +
>> + %
>> + % make_fail(FailGoal, ModuleInfo)
>> + %
>> + % Contruct the fail goal.
>> + %
>> +:- pred make_fail(hlds_goal::out, module_info::in) is det.
>> +
>> +make_fail(FailGoal, ModuleInfo) :-
>> + Features = [],
>> + InstMapSrc = [],
>> + Context = term.context_init,
>> + goal_util.generate_simple_call(mercury_public_builtin_module,
>> + "false", pf_predicate, only_mode, detism_failure, purity_pure,
>> + [], Features, InstMapSrc, ModuleInfo, Context, FailGoal).
>
>Indentation.
>
>> +
>> %-----------------------------------------------------------------------------%
>>
>>
>> @@ -374,27 +552,37 @@
>> % to display.
>> %
>> :- pred make_arg_list(int::in, instmap::in, list(prog_var)::in,
>> - prog_var::out, list(hlds_goal)::out, module_info::in, module_info::out,
>> - proc_info::in, proc_info::out, pred_info::in, pred_info::out,
>> - prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.
>> + map(prog_var, prog_var)::in, prog_var::out, list(hlds_goal)::out,
>> + module_info::in, module_info::out, proc_info::in, proc_info::out,
>> + pred_info::in, pred_info::out, prog_varset::in, prog_varset::out,
>> + vartypes::in, vartypes::out,
>> + map(prog_var, prog_var)::in, map(prog_var, prog_var)::out) is det.
>>
>> -make_arg_list(_, _, [], Var, [Goal], !ModuleInfo, !ProcInfo, !PredInfo,
>> - !Varset, !Vartypes) :-
>> +make_arg_list(_, _, [], _, Var, [Goal], !ModuleInfo, !ProcInfo, !PredInfo,
>> + !Varset, !Vartypes, !BoundVarDescs) :-
>
>Please name the anonymous variables.
>
>>
>> svvarset.new_named_var("EmptyVarList", Var, !Varset),
>> svmap.det_insert(Var, list_var_value_type, !Vartypes),
>> ConsId = cons(qualified(unqualified("list"), "[]" ), 0),
>> construct_functor(Var, ConsId, [], Goal).
>>
>> -make_arg_list(Pos0, InstMap, [VarToInspect | ListCallVar], Var, Goals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes) :-
>> +make_arg_list(Pos0, InstMap, [VarToInspect | ListCallVar], Renaming, Var,
>> + Goals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes,
>> + !BoundVarDescs) :-
>
>Please rename ListCallVar, Var and Goals.
>
>>
>> Pos = Pos0 + 1,
>>
>> - make_arg_list(Pos, InstMap, ListCallVar, Var0, Goals0,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes),
>> - make_var_value(InstMap, VarToInspect, VarDesc, Pos0, ValueGoals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes),
>> + make_arg_list(Pos, InstMap, ListCallVar, Renaming, Var0, Goals0,
>> + !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes, !BoundVarDescs),
>
>Put a comment to explain the next part:
>
>> +
>> + ( map.search(!.BoundVarDescs, VarToInspect, ExistingVarDesc) ->
>> + ValueGoals = [],
>> + VarDesc = ExistingVarDesc
>> + ;
>> + make_var_value(InstMap, VarToInspect, Renaming, VarDesc, Pos0,
>> + ValueGoals, !ModuleInfo, !ProcInfo, !PredInfo, !Varset, !Vartypes,
>> + !BoundVarDescs)
>> + ),
>>
>> svvarset.new_named_var("FullListVar", Var, !Varset),
>> svmap.det_insert(Var, list_var_value_type, !Vartypes),
>> @@ -426,22 +614,23 @@
>> % -> unbound_head_var(Name, Pos) if it is an unbound argument
>> % -> bound_head_var(type_of_T, Name, Position, T) if it is a bound argument
>> %
>> -:- pred make_var_value(instmap::in, prog_var::in, prog_var::out,
>> - int::in, list(hlds_goal)::out, module_info::in, module_info::out,
>> - proc_info::in, proc_info::out, pred_info::in, pred_info::out,
>> - prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.
>> +:- pred make_var_value(instmap::in, prog_var::in, map(prog_var, prog_var)::in,
>> + prog_var::out, int::in, list(hlds_goal)::out,
>> + module_info::in, module_info::out, proc_info::in, proc_info::out,
>> + pred_info::in, pred_info::out, prog_varset::in, prog_varset::out,
>> + vartypes::in, vartypes::out, map(prog_var, prog_var)::in,
>> + map(prog_var, prog_var)::out) is det.
>>
>>
>> -make_var_value(InstMap, VarToInspect, VarDesc, VarPos, Goals,
>> - !ModuleInfo, !ProcInfo, !PredInfo, !VarSet, !VarTypes) :-
>> +make_var_value(InstMap, VarToInspect, Renaming, VarDesc, VarPos, Goals,
>> + !ModuleInfo, !ProcInfo, !PredInfo, !VarSet, !VarTypes, !BoundVarDescs) :-
>>
>>
>> SSDBModule = mercury_ssdb_builtin_module,
>> TypeCtor = type_ctor(qualified(SSDBModule, "var_value"), 0),
>>
>> - % Find the name of the prog_var.
>> varset.lookup_name(!.VarSet, VarToInspect, VarName),
>> -
>> +
>> make_string_const_construction_alloc(VarName, yes("VarName"),
>> ConstructVarName, VarNameVar, !VarSet, !VarTypes),
>>
>> @@ -450,15 +639,16 @@
>>
>> ( var_is_ground_in_instmap(!.ModuleInfo, InstMap, VarToInspect) ->
>>
>> - %
>> - % Update proc_varset and proc_vartypes, without this, the
>> - % polymorphism_make_type_info_var uses a prog_var which is
>> - % already bound.
>> - %
>> - proc_info_set_varset(!.VarSet, !ProcInfo),
>> - proc_info_set_vartypes(!.VarTypes, !ProcInfo),
>>
>> - %
>> + %
>> + % Update proc_varset and proc_vartypes, without this, the
>> + % polymorphism_make_type_info_var uses a prog_var which is
>> + % already bound.
>> + %
>> + proc_info_set_varset(!.VarSet, !ProcInfo),
>> + proc_info_set_vartypes(!.VarTypes, !ProcInfo),
>> +
>> + %
>> % Create dynamic constructor for the value of the argument.
>> %
>> % Call polymorphism.m to create the type_infos, add an hidden field
>> @@ -467,31 +657,44 @@
>> % some[T] bound_head_var(string, int, T) ---->
>> % some[T] bound_head_var(type_of_T, string, int, T)
>> %
>> - create_poly_info(!.ModuleInfo, !.PredInfo, !.ProcInfo,
>> - PolyInfo0),
>> - term.context_init(Context),
>> - map.lookup(!.VarTypes, VarToInspect, MerType),
>> - polymorphism_make_type_info_var(MerType, Context, TypeInfoVar,
>> - TypeInfoGoal, PolyInfo0, PolyInfo),
>> - poly_info_extract(PolyInfo, !PredInfo, !ProcInfo,
>> - !:ModuleInfo),
>> -
>> - %
>> - % Give a new prog_var to the polymorphic structure.
>> - %
>> - svvarset.new_named_var("VarType", VarTypo, !VarSet),
>> - svmap.det_insert(VarTypo, MerType, !VarTypes),
>> + create_poly_info(!.ModuleInfo, !.PredInfo, !.ProcInfo,
>> + PolyInfo0),
>> + term.context_init(Context),
>> + map.lookup(!.VarTypes, VarToInspect, MerType),
>> + polymorphism_make_type_info_var(MerType, Context, TypeInfoVar,
>> + TypeInfoGoal, PolyInfo0, PolyInfo),
>> + poly_info_extract(PolyInfo, !PredInfo, !ProcInfo,
>> + !:ModuleInfo),
>> +
>> + proc_info_get_varset(!.ProcInfo, !:VarSet),
>> + proc_info_get_vartypes(!.ProcInfo, !:VarTypes),
>> +
>> + %
>> + % Give a new prog_var to the polymorphic structure.
>> + %
>
>That comment doesn't describe what it does.
>
>> + svvarset.new_named_var("VarType", VarTypo, !VarSet),
>> + svmap.det_insert(VarTypo, MerType, !VarTypes),
>
>VarType
>
>>
>> % Constructor of the variable's description.
>> svvarset.new_named_var("VarDesc", VarDesc, !VarSet),
>> ConsId = cons(qualified(SSDBModule, "bound_head_var"), 3),
>> construct_type(TypeCtor, [], VarType),
>> svmap.det_insert(VarDesc, VarType, !VarTypes),
>> - construct_functor(VarDesc, ConsId, [TypeInfoVar, VarNameVar,
>> - VarPosVar, VarToInspect], ConstructVarGoal),
>> +
>> + ( map.is_empty(Renaming) ->
>> + construct_functor(VarDesc, ConsId, [TypeInfoVar, VarNameVar,
>> + VarPosVar, VarToInspect], ConstructVarGoal)
>
>Explain that.
>
>> + ;
>> + map.lookup(Renaming, VarToInspect, RenamedVar),
>> + construct_functor(VarDesc, ConsId, [TypeInfoVar, VarNameVar,
>> + VarPosVar, RenamedVar], ConstructVarGoal)
>> + ),
>>
>> Goals = [ConstructVarName, ConstructVarPos | TypeInfoGoal] ++
>> - [ConstructVarGoal]
>> + [ConstructVarGoal],
>> +
>> + svmap.det_insert(VarToInspect, VarDesc, !BoundVarDescs)
>> +
>> ;
>> svvarset.new_named_var("VarDesc", VarDesc, !VarSet),
>> ConsId = cons(qualified(SSDBModule, "unbound_head_var"), 2),
>> Index: ssdb/ssdb.m
>> ===================================================================
>> RCS file: /home/mercury1/repository/mercury/ssdb/ssdb.m,v
>> retrieving revision 1.6
>> diff -u -r1.6 ssdb.m
>> --- ssdb/ssdb.m 18 Oct 2007 08:27:08 -0000 1.6
>> +++ ssdb/ssdb.m 26 Oct 2007 06:06:35 -0000
>> @@ -173,6 +173,7 @@
>> % XXX Not yet implemented : redo, fail.
>> %
>> handle_event(ProcId, Event, ListVarValue) :-
>> +
>> impure get_event_num_inc(EventNum),
>> impure update_depth(Event, PrintDepth),
>>
>> @@ -180,6 +181,7 @@
>> Event = ssdb_call,
>> % set the new CSN.
>> impure get_csn_inc(_),
>> +
>> % set the list_var_value of the debugger state with the list received
>> impure set_list_var_value(ListVarValue),
>>
>> @@ -197,12 +199,14 @@
>> impure set_list_var_value_in_stack(ListVarValue),
>> semipure get_debugger_state(InitialState),
>> stack.top_det(InitialState ^ ssdb_stack, StackFrame)
>> +
>> ;
>> Event = ssdb_redo,
>> error("ssdb_redo: not yet implemented")
>> ;
>> Event = ssdb_fail,
>> - error("ssdb_fail: not yet implemented")
>> + semipure get_debugger_state(InitialState),
>> + stack.top_det(InitialState ^ ssdb_stack, StackFrame)
>> ),
>>
>> semipure get_debugger_state(State0),
>> @@ -228,7 +232,9 @@
>> ;
>> NextStop0 = ns_final_port(StopCSN),
>> (
>> - Event = ssdb_exit,
>> + ( Event = ssdb_exit
>> + ; Event = ssdb_fail
>> + ),
>
>There are tab characters here.
>
>> is_same_event(StopCSN, CSN, Stop)
>> ;
>> Event = ssdb_call,
>> @@ -256,7 +262,7 @@
>> io.nl(!IO),
>>
>> semipure get_shadow_stack(ShadowStack),
>> - impure prompt(ShadowStack, 0, WhatNext, !IO),
>> + impure prompt(Event, ShadowStack, 0, WhatNext, !IO),
>>
>> impure consume_io(!.IO),
>>
>> @@ -291,12 +297,16 @@
>> StateEv1 = PopState ^ ssdb_stack := FinalStack1,
>> impure set_debugger_state(StateEv1)
>>
>> + ; Event = ssdb_fail,
>
>indent
>
>
>Peter
All other remarks have been taken in account.
>
>--------------------------------------------------------------------------
>mercury-reviews mailing list
>Post messages to: mercury-reviews at csse.unimelb.edu.au
>Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
>Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
>--------------------------------------------------------------------------
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list