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