[m-rev.] for review: arg_vectors (part 1)

Julien Fischer juliensf at csse.unimelb.edu.au
Thu Dec 21 02:12:36 AEDT 2006


On Thu, 21 Dec 2006, Mark Brown wrote:

> On 18-Dec-2006, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
>>
>> For review by Mark or Zoltan.
>>
>> Estimated hours taken: 14
>> Branches: main
>>
>> Add a new data structure, called an arg_vector, to the compiler that is
>> intended to encapsulate the argument passing conventions that we use.
>> (Primarily those described in the comments at the head of polymorphism.m).
>> The intention is to use this new data structure everywhere we currently use
>> lists to represent procedure and call site argument information.
>
> Could you list the other places that will eventually use this data structure?
> Is it only the proc_info, or are there others (e.g., the parse tree)?

No, in the HLDS the arg_types field in the pred_info is another obvious
candidate as are the argument lists in calls and foreign_calls in the
hlds_goal_expr type.

At the moment I was only intending to use this data structure in the HLDS.
Using it (or something similar) elsewhere is future work.

>>
>> This change adds the new data structure plus supporting utility predicates.
>> It also begins the task of moving the code in the compiler over to the new
>> data structure.  Specifically, this diff change the headvars field in the
>
> s/change/changes/

Fixed.

>> clauses_info structure into an arg_vector.
>>
>> The spots marked XXX ARGVEC will need to be further modified once the
>> proc_info structure has been modified to use arg_vectors.
>>
>> compiler/hlds_args.m:
>> 	New module.  This module defines the arg_vector structure that will
>> 	eventually be used to represent procedure and call site argument
>> 	information throughout the compiler.  It also defines some utility
>> 	procedures that operate on that data structure.
>>
>> compiler/hlds.m:
>> 	Include the new module in the HLDS package.
>>
>> compiler/hlds_clauses.m:
>> 	Modify the clauses_info structure to represent clause arguments as
>> 	arg_vectors rather than lists.
>>
>> 	Adapt the predicates that initialise the clauses_info structure so
>> 	that they correctly handle the arg_vector structure's representation
>> 	of function return values.
>>
>> compiler/polymorphism.m:
>> 	Use the arg_vector data structure when introducing type_infos and
>> 	typeclass_info arguments.
>
> Add "into the heads of clauses" or something like that.  This change doesn't
> cover the case of introducing them in calls in the body.

Done.

>> Index: compiler/hlds_args.m
>> ===================================================================
>> RCS file: compiler/hlds_args.m
>> diff -N compiler/hlds_args.m
>> --- /dev/null	1 Jan 1970 00:00:00 -0000
>> +++ compiler/hlds_args.m	18 Dec 2006 05:31:52 -0000
>> @@ -0,0 +1,326 @@
>> +%-----------------------------------------------------------------------------%
>> +% vim: ft=mercury ts=4 sw=4 et
>> +%-----------------------------------------------------------------------------%
>> +% Copyright (C) 2006 The University of Melbourne.
>> +% This file may only be copied under the terms of the GNU General
>> +% Public License - see the file COPYING in the Mercury distribution.
>> +%-----------------------------------------------------------------------------%
>> +%
>> +% File: hlds_args.m.
>> +% Main authors: juliensf.
>> +%
>> +% This module defines the part of the HLDS that deals with procedure and
>> call
>> +% site arguments.  (See comments at the head of polymorphism.m for further
>> +% details.)
>
> I think you should move the relevant comments here, starting from "The
> argument passing convention is..."
>
> You may need to fix some references elsewhere in polymorphism.m.

I will move the documentation eventually, but not as part of this change.

>> +%-----------------------------------------------------------------------------%
>> +
>> +:- module hlds.hlds_args.
>> +:- interface.
>> +
>> +:- import_module mdbcomp.prim_data.
>> +
>> +:- import_module list.
>> +:- import_module map.
>> +:- import_module maybe.
>> +:- import_module set.
>> +
>> +%-----------------------------------------------------------------------------%
>> +
>> +	% This type represents the arguments to a predicate symbol, or the
>> +	% arguments and result of a function symbol.  The arguments may be
>> +	% variables, types, modes, etc, depending on the context.
>> +	%
>> +	% Rather than keep all arguments in a single list, we retain
>> +	% information about the origin of each argument (such as whether
>> +	% it was introduced by polymorphism.m to hold a type_info).  This
>> +	% simplifies the processing in polymorphism.m, and also abstracts
>> +	% away the specific calling convention that we use.
>> +    %
>> +:- type arg_vector(T).
>
> Since it applies to procedure arguments, why not call it proc_args?  If we
> later add a similar data structure for data constructors, which also have
> an argument convention, what will it be called?
>
> (I think I asked you this in person, but I can't remember the answer.)

There are already a lot of names in the compiler that have either "proc" 
or "args" in them - I just found it an awkward name to work with.  How
about something like proc_arg_vector, then the version for data constructors
can be ctor_arg_vector?

>> +%-----------------------------------------------------------------------------%
>> +%
>> +% Utility predicates that operate on arg_vectors
>> +%
>> +
>> +    % Return a list of the items in a arg_vector.  The order of the
>> +    % list corresponds to that required by the calling conventions.
>> +    % See comments at the head of polymorphism.m. for details.  If the
>> +    % arg_vector represents a function then the last element in the list
>
> s/represents/is for/

Done.

>> +    % will correspond to the function return value.
>
> That last sentence is really part of the calling convention, and can be
> omitted.  It should be added in the documentation above, though.


There's no harm in repeating it here.

>> +    %
>> +:- func arg_vector_to_list(arg_vector(T)) = list(T).
>> +
>> +    % Return the set of items in an arg_vector.
>> +    %
>> +:- func arg_vector_to_set(arg_vector(T)) = set(T).
>> +
>> +    % Apply a renaming to an arg_vector.
>> +    % Useful for renaming variables etc.
>> +    %
>> +:- pred apply_renaming_to_arg_vector(map(T, T)::in,
>> +    arg_vector(T)::in, arg_vector(T)::out) is det.
>> +
>> +    % partition_arg_vector_by_origin(Vec, PolyArgs, NonPolyArgs):
>> +    %
>> +    % Partition the argument vector into two lists depending on whether
>> +    % something was introduced by the polymorphism transformation or not.
>> +    %
>> +:- pred partition_arg_vector_by_origin(arg_vector(T)::in, list(T)::out,
>> +    list(T)::out) is det.
>
> partition_arg_vector_poly_args?

I'll use this one.

> split_arg_vector_poly_args?

>> +%-----------------------------------------------------------------------------%
>> +%-----------------------------------------------------------------------------%
>> +
>> +:- implementation.
>> +
>> +:- import_module libs.compiler_util.
>> +:- import_module parse_tree.prog_util.
>> +:- import_module parse_tree.prog_type.
>> +    % Require for apply_partial_map_to_list
>> +    % XXX that should really live in a different module.
>
> In map.m, I'd suggest.
>

Okay, but as a separate change.

>> +%-----------------------------------------------------------------------------%
>> +
>> +    % The first six fields are set by the polymorphism pass.
>> +    %
>> +:- type arg_vector(T)
>> +    --->    arg_vector(
>> +                av_instance_type_infos :: list(T),
>> +                % Type_infos for the unconstrained type variables in an
>> +                % instance declaration.
>
> ...in the order that they first appear in the instance arguments.

Added.

>> +arg_vector_init(PredOrFunc, Args0) = ArgVec :-
>> +    (
>> +        PredOrFunc = predicate,
>> +        Args = Args0,
>> +        MaybeRetVal = no
>> +    ;
>> +        PredOrFunc = function,
>> +        pred_args_to_func_args(Args0, Args, RetVal),
>
> Why not just use list.det_split_last?  The pred args vs func args abstraction
> is not needed here, particularly since the comment for arg_vector_init
> states that the function result should be last.

It now uses list.det_split_last.

> If this data structure is intended to be used throughout the compiler, then
> pred_args_to_func_args should eventually become obsolete.
>
>> Index: compiler/polymorphism.m
>> ===================================================================
>> RCS file:
>> /home/mercury/mercury1/repository/mercury/compiler/polymorphism.m,v
>> retrieving revision 1.310
>> diff -u -r1.310 polymorphism.m
>> --- compiler/polymorphism.m	7 Dec 2006 15:31:12 -0000	1.310
>> +++ compiler/polymorphism.m	15 Dec 2006 03:51:58 -0000
>> @@ -462,19 +463,10 @@
>>      map.lookup(PredTable0, PredId, PredInfo0),
>>      pred_info_clauses_info(PredInfo0, ClausesInfo0),
>>      clauses_info_get_vartypes(ClausesInfo0, VarTypes0),
>> -    clauses_info_get_headvars(ClausesInfo0, HeadVars),
>> +    clauses_info_get_headvars(ClausesInfo0, HeadVarVec),
>
> Since the field is still called "headvars", I'd keep that for the variable
> names as well.  Use HeadVarList in places where a list is still used.

Okay.

Cheers,
Julien.
--------------------------------------------------------------------------
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