summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Morrow <ben@morrow.me.uk>2010-07-13 22:20:21 +0100
committerRafael Garcia-Suarez <rgs@consttype.org>2010-07-15 12:28:01 +0200
commita3e07c8779a37a0cc0a4e5ceac72eec0b30c0c0c (patch)
tree5fc7bc44bcb9ba1ef71075cb23a8d41abd37cf24
parent53c0f7b3da3c1d6006f40558f6011132074df828 (diff)
downloadperl-a3e07c8779a37a0cc0a4e5ceac72eec0b30c0c0c.tar.gz
Macros to en/disable blockhook entries.
This allows the individual callbacks to be switched on and off as necessary, without removing the entry from PL_blockhooks.
-rw-r--r--op.h24
-rw-r--r--pod/perlguts.pod10
2 files changed, 29 insertions, 5 deletions
diff --git a/op.h b/op.h
index 30a41c8edd..2ea1dce395 100644
--- a/op.h
+++ b/op.h
@@ -670,6 +670,17 @@ Set an entry in the BHK structure, and set the flags to indicate it is
valid. I<which> is a preprocessing token indicating which entry to set.
The type of I<ptr> depends on the entry.
+=for apidoc Am|void|BhkDISABLE|BHK *hk|which
+Temporarily disable an entry in this BHK structure, by clearing the
+appropriate flag. I<which> is a preprocessor token indicating which
+entry to disable.
+
+=for apidoc Am|void|BhkENABLE|BHK *hk|which
+Re-enable an entry in this BHK structure, by setting the appropriate
+flag. I<which> is a preprocessor token indicating which entry to enable.
+This will assert (under -DDEBUGGING) if the entry doesn't contain a valid
+pointer.
+
=for apidoc m|void|CALL_BLOCK_HOOKS|which|arg
Call all the registered block hooks for type I<which>. I<which> is a
preprocessing token; the type of I<arg> depends on I<which>.
@@ -687,10 +698,21 @@ preprocessing token; the type of I<arg> depends on I<which>.
#define BhkENTRY(hk, which) \
((BhkFLAGS(hk) & BHKf_ ## which) ? ((hk)->bhk_ ## which) : NULL)
+#define BhkENABLE(hk, which) \
+ STMT_START { \
+ BhkFLAGS(hk) |= BHKf_ ## which; \
+ assert(BhkENTRY(hk, which)); \
+ } STMT_END
+
+#define BhkDISABLE(hk, which) \
+ STMT_START { \
+ BhkFLAGS(hk) &= ~(BHKf_ ## which); \
+ } STMT_END
+
#define BhkENTRY_set(hk, which, ptr) \
STMT_START { \
(hk)->bhk_ ## which = ptr; \
- (hk)->bhk_flags |= BHKf_ ## which; \
+ BhkENABLE(hk, which); \
} STMT_END
#define CALL_BLOCK_HOOKS(which, arg) \
diff --git a/pod/perlguts.pod b/pod/perlguts.pod
index d0178e7285..62e99bd386 100644
--- a/pod/perlguts.pod
+++ b/pod/perlguts.pod
@@ -1905,10 +1905,12 @@ start.
Once registered, there is no mechanism to switch these hooks off, so if
that is necessary you will need to do this yourself. An entry in C<%^H>
-is probably the best way, so the effect is lexically scoped. You should
-also be aware that generally speaking at least one scope will have
-opened before your extension is loaded, so you will see some
-C<pre/post_end> pairs that didn't have a matching C<start>.
+is probably the best way, so the effect is lexically scoped; however it
+is also possible to use the C<BhkDISABLE> and C<BhkENABLE> macros to
+temporarily switch entries on and off. You should also be aware that
+generally speaking at least one scope will have opened before your
+extension is loaded, so you will see some C<pre/post_end> pairs that
+didn't have a matching C<start>.
=head1 Examining internal data structures with the C<dump> functions