# New Ticket Created by Sam S.
# Please include the string: [perl #131870]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=131870 >
When the same regex is used concurrently from multiple `start` threads,
looking up already matched captures like $0 or $<foo> from an embedded
code block *inside* that regex is unreliable:
➜ await do for ^10 -> $i { start { "A".match: /(“A”) { say "BOOM:
$i) ", $0 if not $0 }/ } }
BOOM: 2) Nil
BOOM: 4) Nil
BOOM: 2) 「A」
BOOM: 3) 「A」
BOOM: 6) Nil
That example shouldn't print anything, because `$0` should always be a
truthy `Match` object after the `(“A”)`.
But in practice, it demonstrates the incorrect behavior shown above on
most runs: *Some* iterations (different ones each time) seem to see `$0`
as `Nil` or as a falsy `Match`.
Additional failure modes that occur more rarely:
- "Type check failed in binding to parameter '<anon>';" error
- hanging indefinitely
Increase the `^10` to `^1000` or so to guarantee failure.
---
Bisect finds:
https://gist.github.com/c04a40f14712ce5a67dc171f87d3bcdb
https://github.com/rakudo/rakudo/commit/08e39ee
However:
<Zoffix> It's not a regression tho
<Zoffix> Or maybe it is.
<Zoffix> It's just before that commit, it looks like the $/ was
shared around, so it wasn't necesarily "not $0"
<Zoffix> c: 08e39ee2653b1ae^ await ^100 .map: -> $i { $/ = 42;
start { "$i".match: /(\d+)/; if $i != +$0 { say "Boom: $i $0" } } }
<committable6> Zoffix,
https://gist.github.com/557c6716c35afeee06cd90a3daf22c47
<Zoffix> Yup.
---
This is Rakudo version 2017.07-136-gda4a0f50a built on MoarVM version
2017.07-318-g604da4d0
implementing Perl 6.c.