[m-rev.] for review: finer-grained fucntions for configuration information

Julien Fischer jfischer at opturion.com
Sun Sep 10 20:33:41 AEST 2023


Hi Zoltan,

Are you intending to review this one?  If not, I will commit it later this
evening.

Julien.

On Sat, 9 Sep 2023, Julien Fischer wrote:

>
> For review by Zoltan.
>
> ---------------------
>
> Finer-grained functions for configuration information.
>
> library/library.m:
>     Add finer-grained functions for returning configuration information.
>     Implement the existing version/2 predicate using these new functions.
>
> compiler/handle_options.m:
> profiler/mercury_profile.m:
> slice/mcov.m:
>     Use the new functions.
>
> NEWS.md:
>     Announce the new functions.
>
> Julien.
>
> diff --git a/NEWS.md b/NEWS.md
> index 89f9f7c..18fbdde 100644
> --- a/NEWS.md
> +++ b/NEWS.md
> @@ -479,6 +479,14 @@ Changes to the Mercury standard library
>      - pred `have_make_temp_directory/0`
>      - pred `get_temp_directory/3`
>
> +### Changes to the `library` module
> +
> +* The following functions have been added:
> +
> +    - func `architecture/0`
> +    - func `mercury_version/0`
> +    - func `package_version/`
> +
>  ### Changes to the `list` module
>
> * The following predicates and functions have been added:
> diff --git a/compiler/handle_options.m b/compiler/handle_options.m
> index ea5e4f7..f93509c 100644
> --- a/compiler/handle_options.m
> +++ b/compiler/handle_options.m
> @@ -3116,7 +3116,7 @@ disable_smart_recompilation(ProgressStream, 
> OptionDescr, !Globals, !IO) :-
>  %---------------------------------------------------------------------------%
>
> display_compiler_version(ProgressStream, !IO) :-
> -    library.version(Version, _FullArch),
> +    Version = library.mercury_version,
>     io.format(ProgressStream, "Mercury Compiler, version %s", [s(Version)],
>          !IO),
>     Package = library.package_version,
> diff --git a/library/library.m b/library/library.m
> index e135614..f0aaed9 100644
> --- a/library/library.m
> +++ b/library/library.m
> @@ -21,7 +21,15 @@
>      %
>  :- pred version(string::out, string::out) is det.
>
> -    % Return the package version.
> +    % Return the Mercury version string.
> +    %
> +:- func mercury_version = string.
> +
> +    % Return the architecture string.
> +    %
> +:- func architecture = string.
> +
> +    % Return the package version string.
>      %
>  :- func package_version = string.
>
> @@ -227,43 +235,77 @@
>  :- import_module term_size_prof_builtin.
>  :- import_module test_bitset.
>
> -% version must be implemented using pragma foreign_proc,
> -% so we can get at the MR_VERSION and MR_FULLARCH configuration parameters.
> -% We can't just generate library.m from library.m.in at configuration time,
> -% because that would cause bootstrapping problems: we might not have
> -% a working Mercury compiler to compile library.m with.
> +%---------------------------------------------------------------------------%
>
> -:- pragma no_inline(pred(library.version/2)).
> +version(Version, Fullarch) :-
> +    Version = mercury_version,
> +    Fullarch = architecture.
> +
> +%---------------------%
> +
> +% mercury_version, architecture and package_version must be implemented 
> using
> +% pragma foreign_proc, so we can get at the MR_VERSION, MR_FULLARCH and
> +% MR_PACKAGE configuration parameters (and their C# and Java equivalents).
> +% We cannot just generate library.m from library.m.in at configuration time,
> +% because that would cause bootstrapping problems: we might not have a 
> working
> +% Mercury compiler to compile library.m with.
> +
> +:- pragma no_inline(func(mercury_version/0)).
>
> :- pragma foreign_proc("C",
> -    version(Version::out, Fullarch::out),
> +    mercury_version = (Version::out),
>      [will_not_call_mercury, promise_pure, thread_safe,
>  will_not_modify_trail],
>  "
>     MR_ConstString version_string = MR_VERSION;
> -    MR_ConstString fullarch_string = MR_FULLARCH;
> -
> -    // We need to cast away const here, because Mercury declares Version
> -    // and Fullarch to have type MR_String, not MR_ConstString.
> +    // We need to cast away const here, because Mercury declares Version to
> +    // have type MR_String, not MR_ConstString.
>     Version = (MR_String) (MR_Word) version_string;
> -    Fullarch = (MR_String) (MR_Word) fullarch_string;
>  ").
>
> :- pragma foreign_proc("C#",
> -    version(Version::out, Fullarch::out),
> +    mercury_version = (Version::out),
>      [will_not_call_mercury, promise_pure, thread_safe],
>  "
>     Version = runtime.Constants.MR_VERSION;
> -    Fullarch = runtime.Constants.MR_FULLARCH;
>  ").
>
> :- pragma foreign_proc("Java",
> -    version(Version::out, Fullarch::out),
> +    mercury_version = (Version::out),
>      [will_not_call_mercury, promise_pure, thread_safe],
>  "
>     Version = jmercury.runtime.Constants.MR_VERSION;
> +").
> +
> +%---------------------%
> +
> +:- pragma no_inline(func(architecture/0)).
> +
> +:- pragma foreign_proc("C",
> +    architecture = (Fullarch::out),
> +    [will_not_call_mercury, promise_pure, thread_safe, 
> will_not_modify_trail],
> +"
> +    MR_ConstString fullarch_string = MR_FULLARCH;
> +    // We need to cast away const here, because Mercury declares Fullarch to
> +    // have type MR_String, not MR_ConstString.
> +    Fullarch = (MR_String) (MR_Word) fullarch_string;
> +").
> +
> +:- pragma foreign_proc("C#",
> +    architecture = (Fullarch::out),
> +    [will_not_call_mercury, promise_pure, thread_safe],
> +"
> +    Fullarch = runtime.Constants.MR_FULLARCH;
> +").
> +
> +:- pragma foreign_proc("Java",
> +    architecture = (Fullarch::out),
> +    [will_not_call_mercury, promise_pure, thread_safe],
> +"
>      Fullarch = jmercury.runtime.Constants.MR_FULLARCH;
>  ").
>
> +%---------------------%
> +
>  :- pragma no_inline(func(package_version/0)).
>
> :- pragma foreign_proc("C",
> @@ -271,6 +313,8 @@
>      [will_not_call_mercury, promise_pure, thread_safe,
>  will_not_modify_trail],
>  "
>     MR_ConstString package_string = MR_PKGVERSION;
> +    // We need to cast away const here, because Mercury declares Package to
> +    // have type MR_String, not MR_ConstString.
>      Package = (MR_String) (MR_Word) package_string;
>  ").
>
> diff --git a/profiler/mercury_profile.m b/profiler/mercury_profile.m
> index 3c14c7a..e42be34 100644
> --- a/profiler/mercury_profile.m
> +++ b/profiler/mercury_profile.m
> @@ -92,7 +92,7 @@ postprocess_options(Args, !IO) :-
>  :- pred display_version(io.text_output_stream::in, io::di, io::uo) is det.
>
> display_version(OutputStream, !IO) :-
> -    library.version(Version, _FullArch),
> +    Version = library.mercury_version,
>     io.format(OutputStream, "Mercury profiler, version %s", [s(Version)],
>          !IO),
>     Package = library.package_version,
> diff --git a/slice/mcov.m b/slice/mcov.m
> index 8839ca2..aab3ebd 100644
> --- a/slice/mcov.m
> +++ b/slice/mcov.m
> @@ -437,7 +437,7 @@ write_path_port_for_user(OutStream, port_and_path(Port, 
> Path), !IO) :-
>  :- pred display_version(io.text_output_stream::in, io::di, io::uo) is det.
>
> display_version(OutStream, !IO) :-
> -    library.version(Version, _FullArch),
> +    Version = library.mercury_version,
>      io.format(OutStream,
>          "Mercury Coverage Testing Tool, version %s",
>          [s(Version)], !IO),
>
>


More information about the reviews mailing list