Skip to content

Commit

Permalink
h2ph: correct handling of hex constants for the preamble
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tonycoz committed Feb 16, 2015
1 parent 816b056 commit 3bea78d
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion utils/h2ph.PL
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand All @@ -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) {
Expand All @@ -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}) {
Expand Down

0 comments on commit 3bea78d

Please sign in to comment.