X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/2e800d795e15b864092072119d45b4d3b18b4c88..55149fe1eba76b5f9b1db01ec2e8e47bf7c2abbc:/cv.h diff --git a/cv.h b/cv.h index 5da9a50..36afba7 100644 --- a/cv.h +++ b/cv.h @@ -26,10 +26,10 @@ Null CV pointer. =head1 CV Manipulation Functions This section documents functions to manipulate CVs which are code-values, -or subroutines. For more information, see L. +or subroutines. For more information, see L. =for apidoc Am|HV*|CvSTASH|CV* cv -Returns the stash of the CV. A stash is the symbol table hash, containing +Returns the stash of the CV. A stash is the symbol table hash, containing the package-scoped variables in the package where the subroutine was defined. For more information, see L. @@ -49,7 +49,7 @@ See L. #define CvROOT(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root #define CvXSUB(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub #define CvXSUBANY(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany -#define CvGV(sv) S_CvGV((CV *)(sv)) +#define CvGV(sv) S_CvGV((const CV *)(sv)) #define CvGV_set(cv,gv) Perl_cvgv_set(aTHX_ cv, gv) #define CvFILE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file #ifdef USE_ITHREADS @@ -189,7 +189,7 @@ See L. #define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */ PERL_STATIC_INLINE GV * -S_CvGV(CV *sv) +S_CvGV(const CV *sv) { return CvNAMED(sv) ? 0 @@ -218,19 +218,19 @@ CvNAME_HEK(CV *sv) =for apidoc m|bool|CvWEAKOUTSIDE|CV *cv Each CV has a pointer, C, to its lexically enclosing -CV (if any). Because pointers to anonymous sub prototypes are +CV (if any). Because pointers to anonymous sub prototypes are stored in C<&> pad slots, it is a possible to get a circular reference, -with the parent pointing to the child and vice-versa. To avoid the +with the parent pointing to the child and vice-versa. To avoid the ensuing memory leak, we do not increment the reference count of the CV pointed to by C in the I that the parent -has a C<&> pad slot pointing back to us. In this case, we set the -C flag in the child. This allows us to determine under what +has a C<&> pad slot pointing back to us. In this case, we set the +C flag in the child. This allows us to determine under what circumstances we should decrement the refcount of the parent when freeing the child. There is a further complication with non-closure anonymous subs (i.e. those -that do not refer to any lexicals outside that sub). In this case, the -anonymous prototype is shared rather than being cloned. This has the +that do not refer to any lexicals outside that sub). In this case, the +anonymous prototype is shared rather than being cloned. This has the consequence that the parent may be freed while there are still active children, eg @@ -246,16 +246,16 @@ and the freed BEGIN is accessed. To avoid this, whenever a CV and its associated pad is freed, any C<&> entries in the pad are explicitly removed from the pad, and if the refcount of the pointed-to anon sub is still positive, then that -child's C is set to point to its grandparent. This will only +child's C is set to point to its grandparent. This will only occur in the single specific case of a non-closure anon prototype having one or more active references (such as C<$a> above). One other thing to consider is that a CV may be merely undefined -rather than freed, eg C. In this case, its refcount may +rather than freed, eg C. In this case, its refcount may not have reached zero, but we still delete its pad and its C etc. Since various children may still have their C pointing at this undefined CV, we keep its own C for the time being, so that -the chain of lexical scopes is unbroken. For example, the following +the chain of lexical scopes is unbroken. For example, the following should print 123: my $x = 123;