[m-rev.] for review: Allow user code to create io.error values with system errors.

Peter Wang novalazy at gmail.com
Mon Aug 29 16:31:46 AEST 2022


On Mon, 29 Aug 2022 16:22:32 +1000 Julien Fischer <jfischer at opturion.com> wrote:
> 
> On Mon, 29 Aug 2022, Peter Wang wrote:
> 
> > library/io.m:
> >    Move make_io_error_from_system_error to public interface.
> >
> >    Add make_io_error_from_windows_error.
> >
> >    Rename is_maybe_win32_error to is_error_maybe_win32.
> >    Make it take an argument to indicate whether the error is a Win32
> >    error code.
> >
> >    Make make_io_error_from_maybe_win32_error (an internal predicate)
> >    take an argument to indicate whether the error is a Win32
> >    error code.
> >
> > library/dir.m:
> >    Conform to changes.
> >
> > NEWS:
> >    Announce recent system error related changes.
> > ---
> > NEWS          |   7 +++
> > library/dir.m | 102 ++++++++++++++++++++++++++--------------
> > library/io.m  | 128 ++++++++++++++++++++++++++++++--------------------
> > 3 files changed, 149 insertions(+), 88 deletions(-)
> >
> > diff --git a/NEWS b/NEWS
> > index d898dadb7..10b6dea53 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -101,6 +101,13 @@ Changes to the Mercury standard library
> > 
> > * The following predicates have been added:
> > 
> > +    - pred `make_io_error_from_system_error/5`
> > +    - pred `make_io_error_from_windows_error/5`
> > +    - pred `get_system_error/2`
> > +    - pred `get_errno_error/2`
> > +    - pred `get_windows_error/2`
> > +    - pred `get_exception_object_error/2`
> > +    - pred `get_system_error_name/2`
> >     - pred `write_binary_string_utf8/3`
> >     - pred `write_binary_string_utf8/4`
> 
> We should probably make a more general annoucment of this capability,
> but that doesn't need to be done as part of this diff.
> 

Yes.

> 
> > diff --git a/library/io.m b/library/io.m
> > index b9a8d91ef..70fdb5bcc 100644
> > --- a/library/io.m
> > +++ b/library/io.m
> > @@ -2067,6 +2067,28 @@
> >     %
> > :- func make_io_error(string) = io.error.
> > 
> > +    % make_io_error_from_system_error(SystemError, Prefix, Error, !IO):
> > +    %
> > +    % Construct an io.error value given a system error and an error message
> > +    % prefix, which may be the empty string. The error message will be
> > +    % constructed by appending Prefix and the error message retrieved from the
> > +    % system for SystemError.
> > +    %
> > +    % On C backends, the io.system_error must be an errno value.
> 
> I suggest adding that it must *not* be a Windows error code.
> 

Done.

> > +    % On C# and Java backends, the io.system_error must be an exception object.
> > +    %
> 
> Given the way io.system_error is defined, it's impossible for it to be
> anything else on those backends. I guess an additional requirement
> of this predicate (in Java and C#) is that it be a non-null exception
> object?

Well, I only wrote that for symmetry.

But it raises an interesting question. Since foreign_procs will
invariably return null for io.system_error arguments in case of success,
perhaps we should allow io.system_error to be null?

Peter


More information about the reviews mailing list