ParseXS: generate deterministically ordered output
authorKarl Williamson <public@khwilliamson.com>
Mon, 15 Jul 2013 15:55:40 +0000 (09:55 -0600)
committerKarl Williamson <public@khwilliamson.com>
Mon, 15 Jul 2013 16:54:44 +0000 (10:54 -0600)
The generated XS file output was varying between builds because of hash
randomisation.  This sorts the output to make it the same for the same
inputs.  This facilitates eyeballing diffs of two workspaces.

dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm

index 8cf9831..59ee691 100644 (file)
@@ -833,7 +833,8 @@ EOF
     if (%{ $self->{XsubAliases} }) {
       $self->{XsubAliases}->{ $self->{pname} } = 0
         unless defined $self->{XsubAliases}->{ $self->{pname} };
-      while ( my ($xname, $value) = each %{ $self->{XsubAliases} }) {
+      foreach my $xname (sort keys %{ $self->{XsubAliases} }) {
+        my $value = $self->{XsubAliases}{$xname};
         push(@{ $self->{InitFileCode} }, Q(<<"EOF"));
 #        cv = $self->{newXS}(\"$xname\", XS_$self->{Full_func_name}, file$self->{proto});
 #        XSANY.any_i32 = $value;
@@ -847,7 +848,8 @@ EOF
 EOF
     }
     elsif ($self->{interface}) {
-      while ( my ($yname, $value) = each %{ $self->{Interfaces} }) {
+      foreach my $yname (sort keys %{ $self->{Interfaces} }) {
+        my $value = $self->{Interfaces}{$yname};
         $yname = "$self->{Package}\::$yname" unless $yname =~ /::/;
         push(@{ $self->{InitFileCode} }, Q(<<"EOF"));
 #        cv = $self->{newXS}(\"$yname\", XS_$self->{Full_func_name}, file$self->{proto});