ameliorate B::Deparse slowdown
authorDavid Mitchell <davem@iabyn.com>
Wed, 12 Aug 2009 00:01:34 +0000 (01:01 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 12 Aug 2009 00:12:32 +0000 (01:12 +0100)
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.

(cherry picked from commit 805b10112885d8868f21f8e860792d65e1e6c19d)

ext/B/B/Deparse.pm

index 9ba2442..5685d09 100644 (file)
@@ -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) {