]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
This is 0.18 v0.18
authorVincent Pit <vince@profvince.com>
Mon, 10 Oct 2011 20:50:59 +0000 (22:50 +0200)
committerVincent Pit <vince@profvince.com>
Mon, 10 Oct 2011 20:50:59 +0000 (22:50 +0200)
Changes
META.json
META.yml
README
lib/Scope/Upper.pm

diff --git a/Changes b/Changes
index 9eeadad572da93b6d72fb776e1fd09c034d89764..6a27bd6e8ea15a7a1bd45c8ee08d5c8f28fb8608 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,17 @@
 Revision history for Scope-Upper
 
+0.18    2011-10-10 20:50 UTC
+        + Add : The uid() function returns an unique identifier for each dynamic
+                scope. The validate_uid() function can be used to check whether
+                one such identifier is valid (i.e. that the scope it refers to
+                is still alive).
+        + Chg : It is no longer possible on perl 5.6 to call goto() in an
+                uplevel callback to replace the uplevel call. This change was
+                needed in order to ensure consistency between platforms
+                regarding to the following fix just below.
+        + Fix : The uplevel() tests now pass on Windows.
+                Thanks C.H. Kang for bringing this to my attention.
+
 0.17    2011-10-03 21:45 UTC
         + Fix : uplevel() will now use the correct pad when executing its
                 callback. This fixes at least two issues :
index 746f43ce3a3df135d4d19da7aee771453ca6f78c..d32dc6e57a4c78ab72c3db566c16e8f6b125dfbc 100644 (file)
--- a/META.json
+++ b/META.json
@@ -57,5 +57,5 @@
          "url" : "http://git.profvince.com/?p=perl%2Fmodules%2FScope-Upper.git"
       }
    },
-   "version" : "0.17"
+   "version" : "0.18"
 }
index 36c1da147373dc19d7b8e549f120b687f65ac783..80f4c8d241221c6cfb71061d89dabf6ff813bd1d 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -32,4 +32,4 @@ resources:
   homepage: http://search.cpan.org/dist/Scope-Upper/
   license: http://dev.perl.org/licenses/
   repository: http://git.profvince.com/?p=perl%2Fmodules%2FScope-Upper.git
-version: 0.17
+version: 0.18
diff --git a/README b/README
index faa4a768d5ef3ba30225e7fd74f0e87f3531abe1..7d441b7558fa36830cac4af0e6297130b6b95c27 100644 (file)
--- a/README
+++ b/README
@@ -2,14 +2,17 @@ NAME
     Scope::Upper - Act on upper scopes.
 
 VERSION
-    Version 0.17
+    Version 0.18
 
 SYNOPSIS
     "reap", "localize", "localize_elem", "localize_delete" and "WORDS" :
 
         package Scope;
 
-        use Scope::Upper qw<reap localize localize_elem localize_delete :words>;
+        use Scope::Upper qw<
+         reap localize localize_elem localize_delete
+         :words
+        >;
 
         sub new {
          my ($class, $name) = @_;
@@ -51,22 +54,22 @@ SYNOPSIS
         package UserLand;
 
         {
-         Scope->new("top");      # initializes $UserLand::tag
+         Scope->new("top");    # initializes $UserLand::tag
 
          {
           Scope->catch;
-          my $one = 1 + undef;   # prints "top: Use of uninitialized value..."
+          my $one = 1 + undef; # prints "top: Use of uninitialized value..."
 
           {
            Scope->private;
            eval { require Cwd };
-           print $@;             # prints "Can't locate Cwd.pm in @INC (@INC contains:) at..."
-          }
+           print $@;           # prints "Can't locate Cwd.pm in @INC
+          }                    #         (@INC contains:) at..."
 
-          require Cwd;           # loads Cwd.pm
+          require Cwd;         # loads Cwd.pm
          }
 
-        }                        # prints "top: done"
+        }                      # prints "top: done"
 
     "unwind" and "want_at" :
 
@@ -113,6 +116,28 @@ SYNOPSIS
 
         target('hello'); # "hello from Uplevel::target()"
 
+    "uid" and "validate_uid" :
+
+        use Scope::Upper qw<uid validate_uid>;
+
+        my $uid;
+
+        {
+         $uid = uid();
+         {
+          if ($uid eq uid(UP)) { # yes
+           ...
+          }
+          if (validate_uid($uid)) { # yes
+           ...
+          }
+         }
+        }
+
+        if (validate_uid($uid)) { # no
+         ...
+        }
+
 DESCRIPTION
     This module lets you defer actions *at run-time* that will take place
     when the control flow returns into an upper scope. Currently, you can:
@@ -127,7 +152,9 @@ DESCRIPTION
         which context was in use then with "want_at" ;
 
     *   execute a subroutine in the setting of an upper subroutine stack
-        frame with "uplevel".
+        frame with "uplevel" ;
+
+    *   uniquely identify contextes with "uid" and "validate_uid".
 
 FUNCTIONS
     In all those functions, $context refers to the target scope.
@@ -325,6 +352,78 @@ FUNCTIONS
     Albeit the three exceptions listed above, it passes all the tests of
     Sub::Uplevel.
 
+  "uid $context"
+    Returns an unique identifier (UID) for the context (or dynamic scope)
+    pointed by $context, or for the current context if $context is omitted.
+    This UID will only be valid for the life time of the context it
+    represents, and another UID will be generated next time the same scope
+    is executed.
+
+        my $uid;
+
+        {
+         $uid = uid;
+         if ($uid eq uid()) { # yes, this is the same context
+          ...
+         }
+         {
+          if ($uid eq uid()) { # no, we are one scope below
+           ...
+          }
+          if ($uid eq uid(UP)) { # yes, UP points to the same scope as $uid
+           ...
+          }
+         }
+        }
+
+        # $uid is now invalid
+
+        {
+         if ($uid eq uid()) { # no, this is another block
+          ...
+         }
+        }
+
+    For example, each loop iteration gets its own UID :
+
+        my %uids;
+
+        for (1 .. 5) {
+         my $uid = uid;
+         $uids{$uid} = $_;
+        }
+
+        # %uids has 5 entries
+
+    The UIDs are not guaranteed to be numbers, so you must use the "eq"
+    operator to compare them.
+
+    To check whether a given UID is valid, you can use the "validate_uid"
+    function.
+
+  "validate_uid $uid"
+    Returns true if and only if $uid is the UID of a currently valid context
+    (that is, it designates a scope that is higher than the current one in
+    the call stack).
+
+        my $uid;
+
+        {
+         $uid = uid();
+         if (validate_uid($uid)) { # yes
+          ...
+         }
+         {
+          if (validate_uid($uid)) { # yes
+           ...
+          }
+         }
+        }
+
+        if (validate_uid($uid)) { # no
+         ...
+        }
+
 CONSTANTS
   "SU_THREADSAFE"
     True iff the module could have been built when thread-safety features.
@@ -375,13 +474,13 @@ WORDS
            {
             reap \&cleanup => $cxt;
             ...
-           }     # $cxt = SCOPE(0), or HERE
+           }     # $cxt = SCOPE(0) = HERE
            ...
-          }->(); # $cxt = SCOPE(1), or UP, or SUB, or CALLER, or CALLER(0)
+          }->(); # $cxt = SCOPE(1) = UP = SUB = CALLER(0)
           ...
-         };      # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1)
+         };      # $cxt = SCOPE(2) = UP UP =  UP SUB = EVAL = CALLER(1)
          ...
-        }->();   # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
+        }->();   # $cxt = SCOPE(3) = SUB UP SUB = SUB EVAL = CALLER(2)
         ...
 
     Where "localize", "localize_elem" and "localize_delete" act depending on
@@ -392,19 +491,19 @@ WORDS
           sub {
            {
             localize '$x' => 1 => $cxt;
-            # $cxt = SCOPE(0), or HERE
+            # $cxt = SCOPE(0) = HERE
             ...
            }
-           # $cxt = SCOPE(1), or UP, or SUB, or CALLER, or CALLER(0)
+           # $cxt = SCOPE(1) = UP = SUB = CALLER(0)
            ...
           }->();
-          # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1)
+          # $cxt = SCOPE(2) = UP UP = UP SUB = EVAL = CALLER(1)
           ...
          };
-         # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
+         # $cxt = SCOPE(3) = SUB UP SUB = SUB EVAL = CALLER(2)
          ...
         }->();
-        # $cxt = SCOPE(4), UP SUB UP SUB, or UP SUB EVAL, or UP CALLER(2), or TOP
+        # $cxt = SCOPE(4), UP SUB UP SUB = UP SUB EVAL = UP CALLER(2) = TOP
         ...
 
     Where "unwind", "want_at" and "uplevel" point to depending on the $cxt:
@@ -413,15 +512,15 @@ WORDS
          eval {
           sub {
            {
-            unwind @things => $cxt;     # or uplevel { ... } $cxt;
+            unwind @things => $cxt;   # or uplevel { ... } $cxt;
             ...
            }
            ...
-          }->(); # $cxt = SCOPE(0 .. 1), or HERE, or UP, or SUB, or CALLER(0)
+          }->(); # $cxt = SCOPE(0) = SCOPE(1) = HERE = UP = SUB = CALLER(0)
           ...
-         };      # $cxt = SCOPE(2), or UP UP, or UP SUB, or EVAL, or CALLER(1) (*)
+         };      # $cxt = SCOPE(2) = UP UP = UP SUB = EVAL = CALLER(1) (*)
          ...
-        }->();   # $cxt = SCOPE(3), or SUB UP SUB, or SUB EVAL, or CALLER(2)
+        }->();   # $cxt = SCOPE(3) = SUB UP SUB = SUB EVAL = CALLER(2)
         ...
 
         # (*) Note that uplevel() will croak if you pass that scope frame,
@@ -472,9 +571,16 @@ CAVEATS
     may help to use a perl higher than 5.8.9 or 5.10.0, as they contain some
     context-related fixes.
 
-    Calling "goto" to replace an "uplevel"'d code frame does not work when a
-    custom runloop is used or when debugging flags are set with "perl -D".
-    In those two cases, "uplevel" will look for a "goto &sub" statement in
+    Calling "goto" to replace an "uplevel"'d code frame does not work :
+
+    *   for a "perl" older than the 5.8 series ;
+
+    *   for a "DEBUGGING" "perl" run with debugging flags set (as in "perl
+        -D ...") ;
+
+    *   when the runloop callback is replaced by another module.
+
+    In those three cases, "uplevel" will look for a "goto &sub" statement in
     its callback and, if there is one, throw an exception before executing
     the code.
 
index 7ebfca3bd94e0847e9b0390ee8fe56268112aafa..b5936dbfa325253e1d2625c83205d71055c33cb7 100644 (file)
@@ -9,13 +9,13 @@ Scope::Upper - Act on upper scopes.
 
 =head1 VERSION
 
-Version 0.17
+Version 0.18
 
 =cut
 
 our $VERSION;
 BEGIN {
- $VERSION = '0.17';
+ $VERSION = '0.18';
 }
 
 =head1 SYNOPSIS