[perl #47045] CLONE_SKIP doesn't result in undef copies
Dave Mitchell [Fri, 2 Nov 2007 23:59:27 +0000 (23:59 +0000)]
clarify the documentation on CLONE_SKIP, and ensure that the
undef value has all its flags cleared

p4raw-id: //depot/perl@32213

pod/perlmod.pod
sv.c

index 53f3d21..63f0be9 100644 (file)
@@ -581,6 +581,9 @@ Like C<CLONE>, C<CLONE_SKIP> is called once per package; however, it is
 called just before cloning starts, and in the context of the parent
 thread. If it returns a true value, then no objects of that class will
 be cloned; or rather, they will be copied as unblessed, undef values.
+For example: if in the parent there are two references to a single blessed
+hash, then in the child there will be two references to a single undefined
+scalar value instead.
 This provides a simple mechanism for making a module threadsafe; just add
 C<sub CLONE_SKIP { 1 }> at the top of the class, and C<DESTROY()> will be
 now only be called once per object. Of course, if the child thread needs
diff --git a/sv.c b/sv.c
index 35fc90d..f125409 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -10048,8 +10048,7 @@ Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
 
     /* don't clone objects whose class has asked us not to */
     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
-       SvFLAGS(dstr) &= ~SVTYPEMASK;
-       SvOBJECT_off(dstr);
+       SvFLAGS(dstr) = 0;
        return dstr;
     }