poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] pk_parse_version: Provide more context on parse failure


From: Jose E. Marchesi
Subject: Re: [PATCH 1/2] pk_parse_version: Provide more context on parse failure
Date: Tue, 31 Jan 2023 15:36:05 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

Hi Arsen.

OK for master.
Thanks!

> * libpoke/std.pk (raise_exception): New function, takes an
> exception and augments it with more context, to create a new
> exception.  Intended as a helper for errors during parsing.
> (pk_parse_version): Use new raise_exception facility.
> * doc/poke.texi (strtok): Document raise_exception.
> ---
> Evening,
>
> This patchset implements the discussed changes to pk_parse_version, to permit
> parsing and comparing strings automatically, and the more contextually rich
> errors.
>
> OK for master?
>
> Thanks in advance.
>
>  ChangeLog      |  8 ++++++++
>  doc/poke.texi  | 12 +++++++++++-
>  libpoke/std.pk | 25 ++++++++++++++++++-------
>  3 files changed, 37 insertions(+), 8 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 354135da..c9fe04dc 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,11 @@
> +2023-01-31  Arsen Arsenović  <arsen@aarsen.me>
> +
> +     * libpoke/std.pk (raise_exception): New function, takes an
> +     exception and augments it with more context, to create a new
> +     exception.  Intended as a helper for errors during parsing.
> +     (pk_parse_version): Use new raise_exception facility.
> +     * doc/poke.texi (strtok): Document raise_exception.
> +
>  2023-01-30  Arsen Arsenović  <arsen@aarsen.me>
>  
>       poke.texi: Remedy syntax-check fails
> diff --git a/doc/poke.texi b/doc/poke.texi
> index 426c6a8a..98170eb9 100644
> --- a/doc/poke.texi
> +++ b/doc/poke.texi
> @@ -15804,6 +15804,8 @@ @node strtok
>  
>      method popdelim = (string @var{delimiters}) string: @{ @dots{} @}
>      method poprdelim = (string @var{delimiters}) string: @{ @dots{} @}
> +
> +    method raise_exception = (Exception @var{base}, string @var{message}) 
> void: @{ @dots{} @}
>    @}
>  
>  fun strtok = (string @var{a}) String_Tokenizer: @{ @dots{} @}
> @@ -15870,6 +15872,13 @@ @node strtok
>  Raises @code{E_out_of_bounds} if at the end of the string.
>  @end deftypemethod
>  
> +@deftypemethod String_Tokenizer void raise_exception @
> +               (Exception @var{base}, string @var{message})
> +Raises a copy of @var{base} augmented so that it contains a
> +description of the tokenizers current position, as well as the
> +programmer-specified @var{message}.
> +@end deftypemethod
> +
>  @node Character Functions
>  @section Character Functions
>  The Poke standard library provides the following functions to deal
> @@ -16501,8 +16510,9 @@ @node PVM Instruction Index
>  @c  LocalWords:  variadic args PDP programmatically PKL eBPF dst src
>  @c  LocalWords:  BPF Insn Regs le ident ei ELFDATA LSB ELFDAT MSB ios
>  @c  LocalWords:  Ehdr ELFDATANONE osabi abiversion nident Unmapping
> -@c  LocalWords:  Comparator cmp relocations DIEs nelems
> +@c  LocalWords:  Comparator cmp relocations DIEs nelems tokenizers
>  @c  LocalWords:  EOF Rela Addr Xword Sxword Shdr addr addralign fmt
>  @c  LocalWords:  entsize relocs adoleces libtextstyle classname css
>  @c  LocalWords:  ushort ulong uoff abc ltrim whitespace rtrim fdl
>  @c  LocalWords:  quicksort array'length comparator printindex
> +@c  LocalWords:  tokenizer
> diff --git a/libpoke/std.pk b/libpoke/std.pk
> index 956dede5..cb14351f 100644
> --- a/libpoke/std.pk
> +++ b/libpoke/std.pk
> @@ -556,6 +556,17 @@ type String_Tokenizer =
>      string str;
>      computed uint<32> more;
>  
> +    method raise_exception = (Exception base, string message) void:
> +    {
> +      raise Exception {
> +        code = base.code,
> +        name = base.name,
> +        exit_status = base.exit_status,
> +        location = "at position " + ltos (i),
> +        msg = message
> +      };
> +    }
> +
>      method get_more = uint<32>:
>      {
>        return i < str'length;
> @@ -583,7 +594,7 @@ type String_Tokenizer =
>  
>        var res = strtoi (str, base, i);
>        if (res.off == i)
> -        raise E_inval;
> +        raise_exception (E_inval, "expected number");
>  
>        i = res.off;
>        return res.val;
> @@ -707,7 +718,7 @@ fun pk_version_parse = (string a) Pk_Version:
>    var i = strtok (a);
>  
>    if (!i.more)
> -    raise E_inval;
> +    i.raise_exception (E_inval, "expected major.minor");
>  
>    /* Helper that pops an equal character from the tokenizer, and checks that
>       it's the desired character.  */
> @@ -716,12 +727,12 @@ fun pk_version_parse = (string a) Pk_Version:
>      try
>        {
>          if (i.peek () != x)
> -          raise E_inval;
> +          i.raise_exception (E_inval, "expected '" + x as string + "'");
>          i.i++;
>        }
>      catch if E_out_of_bounds
>        {
> -        raise E_inval;
> +        i.raise_exception (E_inval, "expected '" + x as string + "', got 
> EOF");
>        }
>    };
>  
> @@ -738,7 +749,7 @@ fun pk_version_parse = (string a) Pk_Version:
>    catch if E_out_of_bounds
>      {
>        /* If any of these two are missing, it's an invalid.  */
> -      raise E_inval;
> +      i.raise_exception (E_inval, "missing mandatory component");
>      };
>  
>    if (!i.more)
> @@ -763,13 +774,13 @@ fun pk_version_parse = (string a) Pk_Version:
>    catch if E_out_of_bounds
>      {
>        /* If any of these two are missing, it's an invalid.  */
> -      raise E_inval;
> +      i.raise_exception (E_inval, "branch-offset component incomplete");
>      };
>  
>    /* We shouldn't have trailing data at this point, beyond the -gXDIGIT 
> string,
>       or the -dirty string, but both should be stripped already.  */
>    if (i.more)
> -    raise E_inval;
> +    i.raise_exception (E_inval, "trailing data");
>  
>    return res;
>  };



reply via email to

[Prev in Thread] Current Thread [Next in Thread]