This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
op_free(): don't assert op_private ok when erred
authorDavid Mitchell <davem@iabyn.com>
Thu, 19 Nov 2015 15:49:03 +0000 (15:49 +0000)
committerDavid Mitchell <davem@iabyn.com>
Thu, 19 Nov 2015 16:00:31 +0000 (16:00 +0000)
[perl #126258]

op_free includes an assert to make sure each op's op_private field
only has the flags set that are expected for that op. It's a thing I added
at the same time I added the regen/op_private mechanism, and is more a
general "make sure people are only setting the flags we know about" test.

However, if the op tree is being freed after a compilation error, some
op's flags may be in an inconsistent state; so skip the assert in that case.

e.g.

    perl -e 'grep$0,0}'

op.c

diff --git a/op.c b/op.c
index 0c2af88..a9cfe72 100644 (file)
--- a/op.c
+++ b/op.c
@@ -712,10 +712,23 @@ Perl_op_free(pTHX_ OP *o)
         type = o->op_type;
 
         /* an op should only ever acquire op_private flags that we know about.
-         * If this fails, you may need to fix something in regen/op_private */
-        if (o->op_ppaddr == PL_ppaddr[o->op_type]) {
+         * If this fails, you may need to fix something in regen/op_private.
+         * Don't bother testing if:
+         *   * the op_ppaddr doesn't match the op; someone may have
+         *     overridden the op and be doing strange things with it;
+         *   * we've errored, as op flags are often left in an
+         *     inconsistent state then. Note that an error when
+         *     compiling the main program leaves PL_parser NULL, so
+         *     we can't spot faults in the main code, onoly
+         *     evaled/required code */
+#ifdef DEBUGGING
+        if (   o->op_ppaddr == PL_ppaddr[o->op_type]
+            && PL_parser
+            && !PL_parser->error_count)
+        {
             assert(!(o->op_private & ~PL_op_private_valid[type]));
         }
+#endif
 
         if (o->op_private & OPpREFCOUNTED) {
             switch (type) {