diff options
author | Nicholas Clark <nick@ccl4.org> | 2009-10-13 13:01:52 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2009-10-13 13:01:52 +0100 |
commit | 98fe6610b077571e54be1d655e66e1ad657a8910 (patch) | |
tree | 532bceb1ec03d62f050fe0aaa10aae2addb9f312 /util.c | |
parent | 26c7b074d5d3f0a79fab5f1c4eb28f38e81b88d2 (diff) | |
download | perl-98fe6610b077571e54be1d655e66e1ad657a8910.tar.gz |
Change S_ckwarn_common() to looping over the packed warning value.
The core never uses WARN3() or WARN4(), and rarely uses WARN2(), so the
previous code, effectively an unwrapped loop, wasn't a speed up. Functionally
equivalent smaller code fits better into CPU caches.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -1627,15 +1627,26 @@ S_ckwarn_common(pTHX_ U32 w) if (PL_curcop->cop_warnings == pWARN_NONE) return FALSE; + /* Check the assumption that at least the first slot is non-zero. */ + assert(unpackWARN1(w)); + + /* Check the assumption that it is valid to stop as soon as a zero slot is + seen. */ + if (!unpackWARN2(w)) { + assert(!unpackWARN3(w)); + assert(!unpackWARN4(w)); + } else if (!unpackWARN3(w)) { + assert(!unpackWARN4(w)); + } + /* Right, dealt with all the special cases, which are implemented as non- pointers, so there is a pointer to a real warnings mask. */ - return isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)) - || (unpackWARN2(w) && - isWARN_on(PL_curcop->cop_warnings, unpackWARN2(w))) - || (unpackWARN3(w) && - isWARN_on(PL_curcop->cop_warnings, unpackWARN3(w))) - || (unpackWARN4(w) && - isWARN_on(PL_curcop->cop_warnings, unpackWARN4(w))); + do { + if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w))) + return TRUE; + } while (w >>= WARNshift); + + return FALSE; } /* Set buffer=NULL to get a new one. */ |