From: David Mitchell Date: Wed, 12 Aug 2009 00:01:34 +0000 (+0100) Subject: ameliorate B::Deparse slowdown X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=805b10112885d8868f21f8e860792d65e1e6c19d;p=p5sagit%2Fp5-mst-13.2.git ameliorate B::Deparse slowdown commit 2990415a45 improved the ability to deparse inlined constants, but at the cost of having to walk all the symbol tables when each new B::Deparse object is created. Make this scan instead only happen the first time its needed. --- diff --git a/ext/B/B/Deparse.pm b/ext/B/B/Deparse.pm index 9ba2442..5685d09 100644 --- a/ext/B/B/Deparse.pm +++ b/ext/B/B/Deparse.pm @@ -570,7 +570,6 @@ sub new { $self->{'ambient_warnings'} = undef; # Assume no lexical warnings $self->{'ambient_hints'} = 0; $self->{'ambient_hinthash'} = undef; - $self->{'inlined_constants'} = $self->scan_for_constants; $self->init(); while (my $arg = shift @_) { @@ -3655,10 +3654,16 @@ sub const { if (class($sv) eq "SPECIAL") { # sv_undef, sv_yes, sv_no return ('undef', '1', $self->maybe_parens("!1", $cx, 21))[$$sv-1]; - } elsif (class($sv) eq "NULL") { + } + if (class($sv) eq "NULL") { return 'undef'; - } elsif ($cx and my $const = $self->{'inlined_constants'}->{ 0 + $sv->object_2svref }) { - return $const; + } + if ($cx) { + unless ($self->{'inlined_constants'}) { + $self->{'inlined_constants'} = $self->scan_for_constants; + } + my $const = $self->{'inlined_constants'}->{ 0 + $sv->object_2svref }; + return $const if $const; } # convert a version object into the "v1.2.3" string in its V magic if ($sv->FLAGS & SVs_RMG) {