X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FScope%2FUpper.pm;h=0989f6c40a48785e18c3b863ff6ce1fbf3159e94;hb=ec27c147cdcf429339659b2ab0bfe4d989a5d3cc;hp=025fccf2d9bad5e25546c6cea8d663989609c364;hpb=cd407ac6ea98cac0ce701ba7966e2b3fcc5c804d;p=perl%2Fmodules%2FScope-Upper.git diff --git a/lib/Scope/Upper.pm b/lib/Scope/Upper.pm index 025fccf..0989f6c 100644 --- a/lib/Scope/Upper.pm +++ b/lib/Scope/Upper.pm @@ -11,13 +11,13 @@ Scope::Upper - Act on upper scopes. =head1 VERSION -Version 0.25 +Version 0.28 =cut our $VERSION; BEGIN { - $VERSION = '0.25'; + $VERSION = '0.28'; } =head1 SYNOPSIS @@ -613,6 +613,7 @@ When omitted, it defaults to the current context. my $upper_context = UP $from; The context of the scope just above C<$from>. +If C<$from> points to the top-level scope in the current stack, then a warning is emitted and C<$from> is returned (see L for details). =head3 C @@ -620,7 +621,8 @@ The context of the scope just above C<$from>. my $sub_context = SUB $from; The context of the closest subroutine above C<$from>. -Note that C<$from> is returned if it is already a subroutine context ; hence C. +If C<$from> already designates a subroutine context, then it is returned as-is ; hence C. +If no subroutine context is present in the call stack, then a warning is emitted and the current context is returned (see L for details). =head3 C @@ -628,7 +630,8 @@ Note that C<$from> is returned if it is already a subroutine context ; hence C. -Note that C<$from> is returned if it is already an eval context ; hence C. +If C<$from> already designates an eval context, then it is returned as-is ; hence C. +If no eval context is present in the call stack, then a warning is emitted and the current context is returned (see L for details). =head2 Getting a context from a level @@ -641,6 +644,7 @@ When omitted, it defaults to C<0> and those functions return the same context as my $context = SCOPE $level; The C<$level>-th upper context, regardless of its type. +If C<$level> points above the top-level scope in the current stack, then a warning is emitted and the top-level context is returned (see L for details). =head3 C @@ -649,6 +653,7 @@ The C<$level>-th upper context, regardless of its type. The context of the C<$level>-th upper subroutine/eval/format. It kind of corresponds to the context represented by C, but while e.g. C refers to the caller context, C will refer to the top scope in the current context. +If C<$level> points above the top-level scope in the current stack, then a warning is emitted and the top-level context is returned (see L for details). =head2 Examples @@ -712,6 +717,19 @@ Where L, L, L, L and L point # (*) Note that uplevel() will croak if you pass that scope frame, # because it cannot target eval scopes. +=head1 DIAGNOSTICS + +=head2 C + +This warning is emitted when L, L or L end up pointing to a context that is above the top-level context of the current stack. +It indicates that you tried to go higher than the main scope, or to point across a C method, a signal handler, an overloaded or tied method call, a C statement or a C callback. +In this case, the resulting context is the highest reachable one. + +=head2 C + +This warning is emitted when you ask for an L or L context and no such scope can be found in the call stack. +The resulting context is the current one. + =head1 EXPORT The functions L, L, L, L, L, L, L, L, L and L are only exported on request, either individually or by the tags C<':funcs'> and C<':all'>. @@ -742,6 +760,8 @@ $EXPORT_TAGS{'all'} = [ @EXPORT_OK ]; =head1 CAVEATS +It is not possible to act upon a scope that belongs to another perl 'stack', i.e. to target a scope across a C method, a signal handler, an overloaded or tied method call, a C statement or a C callback. + Be careful that local variables are restored in the reverse order in which they were localized. Consider those examples: @@ -792,6 +812,9 @@ In those three cases, L will look for a C statement in its Moreover, in order to handle C statements properly, L currently has to suffer a run-time overhead proportional to the size of the callback in every case (with a small ratio), and proportional to the size of B the code executed as the result of the L call (including subroutine calls inside the callback) when a C statement is found in the L callback. Despite this shortcoming, this XS version of L should still run way faster than the pure-Perl version from L. +Starting from C 5.19.4, it is unfortunately no longer possible to reliably throw exceptions from L'd code while the debugger is in use. +This may be solved in a future version depending on how the core evolves. + =head1 DEPENDENCIES L 5.6.1. @@ -831,17 +854,18 @@ You can find documentation for this module with the perldoc command. perldoc Scope::Upper -Tests code coverage report is available at L. - =head1 ACKNOWLEDGEMENTS Inspired by Ricardo Signes. +The reimplementation of a large part of this module for perl 5.24 was provided by David Mitchell. +His work was sponsored by the Perl 5 Core Maintenance Grant from The Perl Foundation. + Thanks to Shawn M. Moore for motivation. =head1 COPYRIGHT & LICENSE -Copyright 2008,2009,2010,2011,2012,2013,2014,2015 Vincent Pit, all rights reserved. +Copyright 2008,2009,2010,2011,2012,2013,2014,2015,2016 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.