This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Avoid a redundant check in mro.c
authorFather Chrysostomos <sprout@cpan.org>
Sat, 27 Nov 2010 15:11:20 +0000 (07:11 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 27 Nov 2010 15:41:47 +0000 (07:41 -0800)
This code is never reached if oldstash is a hash without an HvENAME.

So instead of checking oldstash in the ?:, then hvename in the if(),
we can do one check.

If oldstash is no longer in the symbol table, then this code is never
reached, because of the if(!fetched_isarev) guard.

mro.c

diff --git a/mro.c b/mro.c
index 4b90e67..ec0fb60 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -984,13 +984,17 @@ S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes,
     if(!fetched_isarev) {
        /* If oldstash is not null, then we can use its HvENAME to look up
           the isarev hash, since all its subclasses will be listed there.
+          It will always have an HvENAME. It the HvENAME was removed
+          above, then fetch_isarev will be true, and this code will not be
+          reached.
 
-          If oldstash is null or is no longer in the symbol table, then
-          this is an empty spot with no stash in it, so subclasses could
-          be listed in isarev hashes belonging to any of the names, so we
-          have to check all of them. */
-       char *hvename = oldstash ? HvENAME(oldstash) : NULL;
-       if (hvename) {
+          If oldstash is null, then this is an empty spot with no stash in
+          it, so subclasses could be listed in isarev hashes belonging to
+          any of the names, so we have to check all of them.
+        */
+       if (oldstash) {
+           /* Extra variable to avoid a compiler warning */
+           char * const hvename = HvENAME(oldstash);
            fetched_isarev = TRUE;
            svp = hv_fetch(PL_isarev, hvename, HvENAMELEN_get(oldstash), 0);
            if (svp) isarev = MUTABLE_HV(*svp);