[m-dev.] for review: fix lambda bug
Fergus Henderson
fjh at cs.mu.OZ.AU
Thu Sep 16 05:19:17 AEST 1999
I will go ahead and commit this.
On 04-Sep-1999, Fergus Henderson <fjh at cs.mu.OZ.AU> wrote:
> Hi,
>
> Zoltan, could you please review this one?
>
> ----------
>
> Estimated hours taken: 4
>
> compiler/lambda.m:
> Fix a bug: when adding extra type_infos need for lambda procs,
> we need to add extra type_infos for the lambda parameters too,
> not just for the the lambda goal's non-locals.
> This bug caused an internal compiler error when compiling
> extras/trailed_update/tests/var_test.m.
>
> diff -u -r1.55 lambda.m
> --- compiler/lambda.m 1999/08/13 01:43:03 1.55
> +++ compiler/lambda.m 1999/09/03 19:29:31
> @@ -313,34 +305,12 @@
> % (see the documentation at top of this file)
> ExistQVars = [],
> LambdaGoal = _ - LambdaGoalInfo,
> - goal_info_get_nonlocals(LambdaGoalInfo, LambdaNonLocals),
> + goal_info_get_nonlocals(LambdaGoalInfo, LambdaGoalNonLocals),
> + set__insert_list(LambdaGoalNonLocals, Vars, LambdaNonLocals),
> goal_util__extra_nonlocal_typeinfos(TVarMap, TCVarMap, VarTypes,
> ExistQVars, LambdaNonLocals, ExtraTypeInfos),
>
> ----------
>
> Estimated hours taken: 0.5
>
> compiler/lambda.m:
> Clean up the code a bit: lambda__transform_lambda does not
> need to be exported, since it isn't used elsewhere, and the
> code is in fact clearer if it is manually inlined into its
> caller (lambda__process_lambda).
>
> Workspace: /usr/hg2/fjh/mercury
> Index: compiler/lambda.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/lambda.m,v
> retrieving revision 1.55
> diff -u -r1.55 lambda.m
> --- compiler/lambda.m 1999/08/13 01:43:03 1.55
> +++ compiler/lambda.m 1999/09/03 19:29:31
> @@ -69,8 +69,7 @@
>
> :- interface.
>
> -:- import_module hlds_module, hlds_pred, hlds_goal, prog_data.
> -:- import_module list, map, set.
> +:- import_module hlds_module, hlds_pred.
>
> :- pred lambda__process_module(module_info, module_info).
> :- mode lambda__process_module(in, out) is det.
> @@ -78,24 +77,16 @@
> :- pred lambda__process_pred(pred_id, module_info, module_info).
> :- mode lambda__process_pred(in, in, out) is det.
>
> -:- pred lambda__transform_lambda(pred_or_func, lambda_eval_method, string,
> - list(prog_var), list(mode), determinism, list(prog_var),
> - set(prog_var), hlds_goal, unification, prog_varset,
> - map(prog_var, type), class_constraints, tvarset,
> - map(tvar, type_info_locn), map(class_constraint, prog_var),
> - pred_markers, aditi_owner, module_info, unify_rhs,
> - unification, module_info).
> -:- mode lambda__transform_lambda(in, in, in, in, in, in, in, in, in, in,
> - in, in, in, in, in, in, in, in, in, out, out, out) is det.
> -
> %-----------------------------------------------------------------------------%
> %-----------------------------------------------------------------------------%
>
> :- implementation.
>
> +:- import_module hlds_goal, prog_data.
> :- import_module hlds_data, make_hlds, globals, options, type_util.
> :- import_module goal_util, prog_util, mode_util, inst_match, llds, arg_info.
>
> +:- import_module list, map, set.
> :- import_module term, varset, bool, string, std_util, require.
>
> :- type lambda_info --->
> @@ -291,11 +282,12 @@
> :- mode lambda__process_lambda(in, in, in, in, in, in, in, in, out, out,
> in, out) is det.
>
> -lambda__process_lambda(PredOrFunc, EvalMethod, Vars, Modes, Det,
> +lambda__process_lambda(PredOrFunc, EvalMethod, Vars, Modes, Detism,
> OrigNonLocals0, LambdaGoal, Unification0, Functor,
> Unification, LambdaInfo0, LambdaInfo) :-
> LambdaInfo0 = lambda_info(VarSet, VarTypes, _PredConstraints, TVarSet,
> - TVarMap, TCVarMap, Markers, POF, PredName, Owner, ModuleInfo0),
> + TVarMap, TCVarMap, Markers, POF, OrigPredName, Owner,
> + ModuleInfo0),
>
> % Calculate the constraints which apply to this lambda
> % expression.
> @@ -313,34 +305,12 @@
> % (see the documentation at top of this file)
> ExistQVars = [],
> LambdaGoal = _ - LambdaGoalInfo,
> - goal_info_get_nonlocals(LambdaGoalInfo, LambdaNonLocals),
> + goal_info_get_nonlocals(LambdaGoalInfo, LambdaGoalNonLocals),
> + set__insert_list(LambdaGoalNonLocals, Vars, LambdaNonLocals),
> goal_util__extra_nonlocal_typeinfos(TVarMap, TCVarMap, VarTypes,
> ExistQVars, LambdaNonLocals, ExtraTypeInfos),
> - lambda__transform_lambda(PredOrFunc, EvalMethod, PredName, Vars, Modes,
> - Det, OrigNonLocals0, ExtraTypeInfos, LambdaGoal, Unification0,
> - VarSet, VarTypes, Constraints, TVarSet, TVarMap, TCVarMap,
> - Markers, Owner, ModuleInfo0, Functor, Unification, ModuleInfo),
> - LambdaInfo = lambda_info(VarSet, VarTypes, Constraints, TVarSet,
> - TVarMap, TCVarMap, Markers, POF, PredName, Owner, ModuleInfo).
> -
> -:- pred lambda__constraint_contains_vars(list(tvar), class_constraint).
> -:- mode lambda__constraint_contains_vars(in, in) is semidet.
> -
> -lambda__constraint_contains_vars(LambdaVars, ClassConstraint) :-
> - ClassConstraint = constraint(_, ConstraintTypes),
> - list__map(type_util__vars, ConstraintTypes, ConstraintVarsList),
> - list__condense(ConstraintVarsList, ConstraintVars),
> - % Probably not the most efficient way of doing it, but I
> - % wouldn't think that it matters.
> - set__list_to_set(LambdaVars, LambdaVarsSet),
> - set__list_to_set(ConstraintVars, ConstraintVarsSet),
> - set__subset(ConstraintVarsSet, LambdaVarsSet).
> + OrigVars = OrigNonLocals0,
>
> -lambda__transform_lambda(PredOrFunc, EvalMethod, OrigPredName, Vars, Modes,
> - Detism, OrigVars, ExtraTypeInfos, LambdaGoal, Unification0,
> - VarSet, VarTypes, Constraints, TVarSet, TVarMap, TCVarMap,
> - Markers, Owner, ModuleInfo0, Functor,
> - Unification, ModuleInfo) :-
> (
> Unification0 = construct(Var0, _, _, UniModes0, _, _, _)
> ->
> @@ -350,26 +320,26 @@
> error("lambda__transform_lambda: weird unification")
> ),
>
> - % Optimize a special case: replace
> - % `lambda([Y1, Y2, ...] is Detism, p(X1, X2, ..., Y1, Y2, ...))'
> - % where `p' has determinism `Detism' with
> - % `p(X1, X2, ...)'
> - %
> - % This optimization is only valid if the modes of the Xi are
> - % input, since only input arguments can be curried.
> - % It's also only valid if all the inputs in the Yi precede the
> - % outputs. It's also not valid if any of the Xi are in the Yi.
> + set__delete_list(LambdaGoalNonLocals, Vars, NonLocals1),
>
> - LambdaGoal = _ - LambdaGoalInfo,
> - goal_info_get_nonlocals(LambdaGoalInfo, NonLocals0),
> - set__delete_list(NonLocals0, Vars, NonLocals1),
> -
> % We need all the typeinfos, including the ones that are not used,
> % for the layout structure describing the closure.
> set__union(NonLocals1, ExtraTypeInfos, NonLocals),
>
> set__to_sorted_list(NonLocals, ArgVars1),
> +
> (
> + % Optimize a special case: replace
> + % `lambda([Y1, Y2, ...] is Detism,
> + % p(X1, X2, ..., Y1, Y2, ...))'
> + % where `p' has determinism `Detism' with
> + % `p(X1, X2, ...)'
> + %
> + % This optimization is only valid if the modes of the Xi are
> + % input, since only input arguments can be curried.
> + % It's also only valid if all the inputs in the Yi precede the
> + % outputs. It's also not valid if any of the Xi are in the Yi.
> +
> LambdaGoal = call(PredId0, ProcId0, CallVars,
> _, _, PredName0) - _,
> module_info_pred_proc_info(ModuleInfo0, PredId0, ProcId0,
> @@ -441,7 +411,7 @@
> goal_info_get_context(LambdaGoalInfo, LambdaContext),
> % The TVarSet is a superset of what it really ought be,
> % but that shouldn't matter.
> - % XXX existentially typed lambda expressions are not
> + % Existentially typed lambda expressions are not
> % yet supported (see the documentation at top of this file)
> ExistQVars = [],
> lambda__uni_modes_to_modes(UniModes1, OrigArgModes),
> @@ -542,7 +512,23 @@
> VarToReuse = no,
> RLExprnId = no,
> Unification = construct(Var, ConsId, ArgVars, UniModes,
> - VarToReuse, cell_is_unique, RLExprnId).
> + VarToReuse, cell_is_unique, RLExprnId),
> + LambdaInfo = lambda_info(VarSet, VarTypes, Constraints, TVarSet,
> + TVarMap, TCVarMap, Markers, POF, OrigPredName, Owner,
> + ModuleInfo).
> +
> +:- pred lambda__constraint_contains_vars(list(tvar), class_constraint).
> +:- mode lambda__constraint_contains_vars(in, in) is semidet.
> +
> +lambda__constraint_contains_vars(LambdaVars, ClassConstraint) :-
> + ClassConstraint = constraint(_, ConstraintTypes),
> + list__map(type_util__vars, ConstraintTypes, ConstraintVarsList),
> + list__condense(ConstraintVarsList, ConstraintVars),
> + % Probably not the most efficient way of doing it, but I
> + % wouldn't think that it matters.
> + set__list_to_set(LambdaVars, LambdaVarsSet),
> + set__list_to_set(ConstraintVars, ConstraintVarsSet),
> + set__subset(ConstraintVarsSet, LambdaVarsSet).
>
> :- pred lambda__uni_modes_to_modes(list(uni_mode), list(mode)).
> :- mode lambda__uni_modes_to_modes(in, out) is det.
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh> | of excellence is a lethal habit"
PGP: finger fjh at 128.250.37.3 | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list