sc: prevent upgrade preparation from modifying original data
authorMischa POSLAWSKY <perl@shiar.org>
Sat, 20 Jun 2015 04:20:26 +0000 (06:20 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 22 Jun 2015 13:38:51 +0000 (15:38 +0200)
Copy only final values, not entire references.

sc.plp

diff --git a/sc.plp b/sc.plp
index a85788435866cb120fc6a95f27a395ec1d48581f..e426a6e5ae6f5c822c5386fdf4c33839d5e17cf5 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -55,13 +55,14 @@ print "Also see the $_ table.\n" for join(', ',
 print "</p>\n\n";
 
 sub addupgrade {
-       my ($ref, $increase) = @_;
+       my ($ref, $increase, $org) = @_;
        if (ref $increase eq 'HASH') {
-               addupgrade(\${$ref}->{$_}, $increase->{$_}) for keys %{$increase};
+               addupgrade(\${$ref}->{$_}, $increase->{$_}, $org->{$_}) for keys %{$increase};
        }
        elsif (ref $increase eq 'ARRAY') {
-               addupgrade(\${$ref}->[$_], $increase->[$_]) for 0 .. $#{$increase};
+               addupgrade(\${$ref}->[$_], $increase->[$_], $org->[$_]) for 0 .. $#{$increase};
        }
+       ${$ref} //= $org;
        ${$ref} += $increase if $increase =~ /^-?[0-9.]+/;
 }
 
@@ -69,7 +70,7 @@ for my $unit (@{$units}) {
        for my $upgrade (@{ $unit->{upgrade} }) {
                while (my ($col, $increase) = each %{$upgrade}) {
                        defined $unit->{$col} or next;
-                       addupgrade(\( $unit->{upgraded}->{$col} //= $unit->{$col} ), $increase);
+                       addupgrade(\$unit->{upgraded}->{$col}, $increase, $unit->{$col});
                }
        }
 }