This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add $B::OP::does_parent variable
authorDavid Mitchell <davem@iabyn.com>
Mon, 2 Feb 2015 17:05:23 +0000 (17:05 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 2 Feb 2015 17:05:23 +0000 (17:05 +0000)
This will help people write B:: code that can, in a backwards-compatible way,
handle the parent method that has recently been added, and whose behaviour
varies depending on whether perl was built with PERL_OP_PARENT.

ext/B/B.pm
ext/B/B.xs

index f028d7c..5deaa2c 100644 (file)
@@ -1139,6 +1139,11 @@ data structure.  See top of C<op.h> for more info.
 Returns the OP's parent. If it has no parent, or if your perl wasn't built
 with C<-DPERL_OP_PARENT>, returns NULL.
 
+Note that the global variable C<$B::OP::does_parent> is undefined on older
+perls that don't support the C<parent> method, is defined but false on
+perls that support the method but were built without  C<-DPERL_OP_PARENT>,
+and is true otherwise.
+
 =item name
 
 This returns the op name as a string (e.g. "add", "rv2av").
index 31e855b..c4d218e 100644 (file)
@@ -788,6 +788,7 @@ BOOT:
 {
     CV *cv;
     const char *file = __FILE__;
+    SV *sv;
     MY_CXT_INIT;
     B_init_my_cxt(aTHX_ &(MY_CXT));
     cv = newXS("B::init_av", intrpvar_sv_common, file);
@@ -820,6 +821,14 @@ BOOT:
     ASSIGN_COMMON_ALIAS(I, warnhook);
     cv = newXS("B::diehook", intrpvar_sv_common, file);
     ASSIGN_COMMON_ALIAS(I, diehook);
+    sv = get_sv("B::OP::does_parent", GV_ADDMULTI);
+    sv_setsv(sv,
+#ifdef PERL_OP_PARENT
+        &PL_sv_yes
+#else
+        &PL_sv_no
+#endif
+    );
 }
 
 #ifndef PL_formfeed