develooper Front page | perl.perl5.porters | Postings from January 2015

Re: [perl #123616] Weed out needless PERL_UNUSED_ARG

Thread Previous | Thread Next
From:
bulk88
Date:
January 18, 2015 01:10
Subject:
Re: [perl #123616] Weed out needless PERL_UNUSED_ARG
Message ID:
BLU436-SMTP30E064DBA1B539ED3C654FDF4D0@phx.gbl
hv@crypt.org wrote:
> "bulk88 via RT" <perlbug-followup@perl.org> wrote:
> :Im inclined to say https://rt.perl.org/Ticket/Attachment/1326848/707965/0001-Removed-PERL_UNUSED_ARG-in-S_grok_bslash_x.patch is wrong. output_warning is unused in non-DEBUGGING and DEBUGGING. I removed it as an experiment and both build types compiled, see attached patch.
> 
> How is that managing to compile line 226, just after the context lines
> in the patch:
>     if (strict || ! output_warning) {
> ?
> 
> Hugo


My patch worked on blead from Jan 6 2015/ 
735ecbe919d740c2d0068de6daf6f2359bbcd3eb  :(

var output_warning really was unused on that day

PERL_STATIC_INLINE bool
S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg,
                       const bool output_warning, const bool strict,
                       const bool silence_non_portable,
                       const bool UTF)
{

/*  Documentation to be supplied when interface nailed down finally
  *  This returns FALSE if there is an error which the caller need not 
recover
  *  from; , otherwise TRUE.  In either case the caller should look at *len
  *  On input:
  *	s   is the address of a pointer to a NULL terminated string that begins
  *	    with 'x', and the previous character was a backslash.  At exit, *s
  *	    will be advanced to the byte just after those absorbed by this
  *	    function.  Hence the caller can continue parsing from there.  In
  *	    the case of an error, this routine has generally positioned *s to
  *	    point just to the right of the first bad spot, so that a message
  *	    that has a "<--" to mark the spot will be correctly positioned.
  *	uv  points to a UV that will hold the output value, valid only if the
  *	    return from the function is TRUE
  *      error_msg is a pointer that will be set to an internal buffer 
giving an
  *	    error message upon failure (the return is FALSE).  Untouched if
  *	    function succeeds
  *	output_warning says whether to output any warning messages, or suppress
  *	    them
  *	strict is true if anything out of the ordinary should cause this to
  *	    fail instead of warn or be silent.  For example, it requires
  *	    exactly 2 digits following the \x (when there are no braces).
  *	    3 digits could be a mistake, so is forbidden in this mode.
  *      silence_non_portable is true if to suppress warnings about the code
  *          point returned being too large to fit on all platforms.
  *	UTF is true iff the string *s is encoded in UTF-8.
  */
     char* e;
     STRLEN numbers_len;
     I32 flags = PERL_SCAN_DISALLOW_PREFIX;

     PERL_ARGS_ASSERT_GROK_BSLASH_X;

     PERL_UNUSED_ARG(output_warning);

     assert(**s == 'x');
     (*s)++;

     if (strict) {
         flags |= PERL_SCAN_SILENT_ILLDIGIT;
     }

     if (**s != '{') {
         STRLEN len = (strict) ? 3 : 2;

	*uv = grok_hex(*s, &len, &flags, NULL);
	*s += len;
         if (strict && len != 2) {
             if (len < 2) {
                 *s += (UTF) ? UTF8SKIP(*s) : 1;
                 *error_msg = "Non-hex character";
             }
             else {
                 *error_msg = "Use \\x{...} for more than two hex 
characters";
             }
             return FALSE;
         }
	return TRUE;
     }

     e = strchr(*s, '}');
     if (!e) {
         (*s)++;  /* Move past the '{' */
         while (isXDIGIT(**s)) { /* Position beyond the legal digits */
             (*s)++;
         }
         /* XXX The corresponding message above for \o is just '\\o{'; other
          * messages for other constructs include the '}', so are 
inconsistent.
          */
	*error_msg = "Missing right brace on \\x{}";
	return FALSE;
     }

     (*s)++;    /* Point to expected first digit (could be first byte of 
utf8
                   sequence if not a digit) */
     numbers_len = e - *s;
     if (numbers_len == 0) {
         if (strict) {
             (*s)++;    /* Move past the } */
             *error_msg = "Number with no digits";
             return FALSE;
         }
         return TRUE;
     }

     flags |= PERL_SCAN_ALLOW_UNDERSCORES;
     if (silence_non_portable) {
         flags |= PERL_SCAN_SILENT_NON_PORTABLE;
     }

     *uv = grok_hex(*s, &numbers_len, &flags, NULL);
     /* Note that if has non-hex, will ignore everything starting with 
that up
      * to the '}' */

     if (strict && numbers_len != (STRLEN) (e - *s)) {
         *s += numbers_len;
         *s += (UTF) ? UTF8SKIP(*s) : 1;
         *error_msg = "Non-hex character";
         return FALSE;
     }

     /* Return past the '}' */
     *s = e + 1;

     return TRUE;
}


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About