[m-rev.] For review: Improve the name mangling of foreign methods in the IL backend

Jonathan Morgan jonmmorgan at gmail.com
Fri Jun 8 14:44:57 AEST 2007


On 6/7/07, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
> The problem here is that the ml code generator introduces
> constructors for the classes it generates for du types.  (The relevant
> piece of code is ml_type_gen.m:795.)
>
> The mlds_defn's for these constructor methods have their entity_name
> field set to `entity_export("<constructor>")' for some reason.  (This
> doesn't quite line with the documentation for entity_export/1 in
> mlds.m which says they are for pragma exported entities.)
>
> It looks (from the comments in ml_type_gen.m) that this particular name
> is just used as a place-holder, as the actual constructor names are
> backend specific.  I not sure why we do things in this particular way?
> Pete, do you have any ideas?
>
> I think we can work-around the problem at the moment by only performing
> the sanity check when we do not have a constructor method.  The
> diff below makes this change.  With it the valid/foreign_type_spec
> passes again - I haven't checked whether it is okay with respect to
> the rest of Jon's change.
>
> Index: mlds_to_il.m
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/compiler/mlds_to_il.m,v
> retrieving revision 1.181
> diff -u -r1.181 mlds_to_il.m
> --- mlds_to_il.m        6 Jun 2007 01:17:34 -0000       1.181
> +++ mlds_to_il.m        7 Jun 2007 08:46:24 -0000
> @@ -1051,13 +1051,6 @@
>           ClassMember, !Info) :-
>       Entity = mlds_function(_MaybePredProcId, Params, MaybeStatement,
>           Attributes, EnvVarNames),
> -    ( Name = entity_function(PredLabel0, ProcId0, MaybeSeqNum0, _PredId) ->
> -        PredLabel = PredLabel0,
> -        ProcId = ProcId0,
> -        MaybeSeqNum = MaybeSeqNum0
> -    ;
> -        unexpected(this_file, "IL procedure is not a function")
> -    ),
>
>       expect(set.empty(EnvVarNames), this_file,
>           "generate_method: EnvVarNames"),
> @@ -1087,6 +1080,13 @@
>               class_member_name(ParentClass, ctor), []))]
>       ;
>           IsCons = no,
> +        ( Name = entity_function(PredLabel0, ProcId0, MaybeSeqNum0, _) ->
> +            PredLabel = PredLabel0,
> +            ProcId = ProcId0,
> +            MaybeSeqNum = MaybeSeqNum0
> +        ;
> +            unexpected(this_file, "IL procedure is not a function")
> +        ),
>           predlabel_to_il_id(PredLabel, ProcId, MaybeSeqNum, MemberName0),
>           predlabel_to_managed_id(PredLabel, ProcId, MaybeSeqNum,
>                   ManagedMemberName0),
> @@ -1160,9 +1160,9 @@
>       % in an exception handler and call the initialization instructions
>       % in the cctor of this module.
>       (
> -        PredLabel = mlds_user_pred_label(pf_predicate, no, "main", 2,
> -            model_det, no),
> -        MaybeSeqNum = no
> +        Name = entity_function(MainPredLabel, _, no, _PredId),
> +        MainPredLabel = mlds_user_pred_label(pf_predicate, no, "main", 2,
> +            model_det, no)
>       ->
>           EntryPoint = [entrypoint],
>           !:Info = !.Info ^ has_main := yes,

The workaround looks fine with respect to my changes.  You could move
the construction of MemberName and ManagedMemberName inside the
if-then-else and remove all the PredLabel0's and similar if you felt
it made it clearer.

Jon
--------------------------------------------------------------------------
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