fix caller with re_evals.
authorDavid Mitchell <davem@iabyn.com>
Wed, 24 Apr 2013 13:41:33 +0000 (14:41 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 24 Apr 2013 15:39:47 +0000 (16:39 +0100)
commit5fbe83117ea59ccad42477c465113c7550a3675d
treeffcf1737c4f5bb9c679653cc1e6df3a91c044e81
parentb00652470bcd63ec9dee77ad3149214aebcee0df
fix caller with re_evals.

(See RT #113928)

In code like

    sub foo {  /A(?{ bar; caller(); }B/; }

the regex /A(?{B})C/ is, from a scope point of view, supposed to
be compiled and executed as:

    /A/ && do { B } && /C/;

i.e. the code block in B is part of the same sub as the code surrounding
the regex. Thus the result of caller() above should see the caller as
whoever called foo.

Due to an implementation detail, we actually push a hidden extra
sub CX before calling the pattern. This detail was leaking when caller()
was used. Fux it so that it ignores this extra context frame.

Conversely, for a qr//, that *is* supposed to be seen as an extra level
of anonymous sub, so add tests to ensure that is so.
i.e.

    $r = qr/...(?{code}).../
    /...$r.../

is supposed to behave like

    $r = sub { code };
    $r->();
pp_ctl.c
t/re/reg_eval_scope.t