int ncode = 0;
for (o = cLISTOPx(expr)->op_first; o; o = o->op_sibling) {
- if (o->op_type == OP_CONST && SvUTF8(cSVOPo_sv))
- code_is_utf8 = 1;
+ if (o->op_type == OP_CONST) {
+ /* skip if we have SVs as well as OPs. In this case,
+ * a) we decide utf8 based on SVs not OPs;
+ * b) the current pad may not match that which the ops
+ * were compiled in, so, so on threaded builds,
+ * cSVOPo_sv would look in the wrong pad */
+ if (!pat_count && SvUTF8(cSVOPo_sv))
+ code_is_utf8 = 1;
+ }
else if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL))
/* count of DO blocks */
ncode++;
}
-plan tests => 463; # Update this when adding/deleting tests.
+plan tests => 464; # Update this when adding/deleting tests.
run_tests() unless caller;
is($m, 'a', '?pat? with (??{a,b,c})');
}
+ {
+ # this code won't actually fail, but it used to fail valgrind,
+ # so its here just to make sure valgrind doesn't fail again
+ # While examining the ops of the secret anon sub wrapped around
+ # the qr//, the pad of the sub was in scope, so cSVOPo_sv
+ # got the const from the wrong pad. By having lots of $s's
+ # (aka gvsv(*s), this forces the targs of the consts which have
+ # been moved to the pad, to have high indices.
+
+ sub {
+ local our $s = "abc";
+ my $qr = qr/^(?{1})$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s/;
+ }->();
+ pass("cSVOPo_sv");
+ }
+
+
} # End of sub run_tests