From a3e07c8779a37a0cc0a4e5ceac72eec0b30c0c0c Mon Sep 17 00:00:00 2001 From: Ben Morrow Date: Tue, 13 Jul 2010 22:20:21 +0100 Subject: [PATCH] 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. --- op.h | 24 +++++++++++++++++++++++- pod/perlguts.pod | 10 ++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/op.h b/op.h index 30a41c8..2ea1dce 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 is a preprocessing token indicating which entry to set. The type of I 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 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 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. I is a preprocessing token; the type of I depends on I. @@ -687,10 +698,21 @@ preprocessing token; the type of I depends on I. #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 d0178e7..62e99bd 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
 pairs that didn't have a matching C.
+is probably the best way, so the effect is lexically scoped; however it
+is also possible to use the C and C 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
 pairs that
+didn't have a matching C.
 
 =head1 Examining internal data structures with the C functions
 
-- 
2.7.4