diff options
author | Tony Cook <tony@develop-help.com> | 2015-02-16 15:57:00 +1100 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2015-02-17 10:21:53 +1100 |
commit | 3bea78d24634e630b610f59957e7a019205a67b2 (patch) | |
tree | a020830dd139f1a26c15d115b2d71a4ff9e49beb /utils | |
parent | 816b056ffb99ae54642320e20dc30a59fd1effef (diff) | |
download | perl-3bea78d24634e630b610f59957e7a019205a67b2.tar.gz |
h2ph: correct handling of hex constants for the preamble
Previously they were treated as identifiers resulting in code
generated like C< &0xFFF >.
We also try to prevent compile-time warnings from large hex integers,
the user isn't responsible for the generated code, so we delay those
warnings to run-time.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/h2ph.PL | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/utils/h2ph.PL b/utils/h2ph.PL index 9a8b14dca8..d082f22723 100644 --- a/utils/h2ph.PL +++ b/utils/h2ph.PL @@ -769,7 +769,7 @@ sub inc_dirs sub build_preamble_if_necessary { # Increment $VERSION every time this function is modified: - my $VERSION = 3; + my $VERSION = 4; my $preamble = "$Dest_dir/_h2ph_pre.ph"; # Can we skip building the preamble file? @@ -788,6 +788,11 @@ sub build_preamble_if_necessary open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!"; print PREAMBLE "# This file was created by h2ph version $VERSION\n"; + # Prevent non-portable hex constants from warning. + # + # We still produce an overflow warning if we can't represent + # a hex constant as an integer. + print PREAMBLE "no warnings qw(portable);\n"; foreach (sort keys %define) { if ($opt_D) { @@ -814,6 +819,18 @@ DEFINE # integer: print PREAMBLE "unless (defined &$_) { sub $_() { $1 } }\n\n"; + } elsif ($define{$_} =~ /^([+-]?0x[\da-f]+)U?L{0,2}$/i) { + # hex integer + # Special cased, since perl warns on hex integers + # that can't be represented in a UV. + # + # This way we get the warning at time of use, so the user + # only gets the warning if they happen to use this + # platform-specific definition. + my $code = $1; + $code = "hex('$code')" if length $code > 10; + print PREAMBLE + "unless (defined &$_) { sub $_() { $code } }\n\n"; } elsif ($define{$_} =~ /^\w+$/) { my $def = $define{$_}; if ($isatype{$def}) { |