This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Filter::Util::Call to 1.08
[perl5.git] / xsutils.c
index dcc8d09..3bc1f93 100644 (file)
--- a/xsutils.c
+++ b/xsutils.c
@@ -1,6 +1,6 @@
 /*    xsutils.c
  *
- *    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ *    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
  *    by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
@@ -9,8 +9,10 @@
  */
 
 /*
- * "Perilous to us all are the devices of an art deeper than we possess
- * ourselves." --Gandalf
+ * 'Perilous to us all are the devices of an art deeper than we possess
+ *  ourselves.'                                            --Gandalf
+ *
+ *     [p.597 of _The Lord of the Rings_, III/xi: "The Palantír"]
  */
 
 
@@ -77,9 +79,9 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
                case 'l':
                    if (memEQ(name, "lvalue", 6)) {
                        if (negated)
-                           CvFLAGS((CV*)sv) &= ~CVf_LVALUE;
+                           CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_LVALUE;
                        else
-                           CvFLAGS((CV*)sv) |= CVf_LVALUE;
+                           CvFLAGS(MUTABLE_CV(sv)) |= CVf_LVALUE;
                        continue;
                    }
                    break;
@@ -87,18 +89,18 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
                case 'k':
                    if (memEQ(name, "locked", 6)) {
                        if (negated)
-                           CvFLAGS((CV*)sv) &= ~CVf_LOCKED;
+                           CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_LOCKED;
                        else
-                           CvFLAGS((CV*)sv) |= CVf_LOCKED;
+                           CvFLAGS(MUTABLE_CV(sv)) |= CVf_LOCKED;
                        continue;
                    }
                    break;
                case 'h':
                    if (memEQ(name, "method", 6)) {
                        if (negated)
-                           CvFLAGS((CV*)sv) &= ~CVf_METHOD;
+                           CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_METHOD;
                        else
-                           CvFLAGS((CV*)sv) |= CVf_METHOD;
+                           CvFLAGS(MUTABLE_CV(sv)) |= CVf_METHOD;
                        continue;
                    }
                    break;
@@ -120,7 +122,7 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
                    break;
                case 'e':
                    if (memEQ(name, "uniqu", 5)) {
-                       if (SvTYPE(sv) == SVt_PVGV) {
+                       if (isGV_with_GP(sv)) {
                            if (negated) {
                                GvUNIQUE_off(sv);
                            } else {
@@ -203,7 +205,7 @@ usage:
 
     switch (SvTYPE(sv)) {
     case SVt_PVCV:
-       cvflags = CvFLAGS((CV*)sv);
+       cvflags = CvFLAGS((const CV *)sv);
        if (cvflags & CVf_LOCKED)
            XPUSHs(newSVpvs_flags("locked", SVs_TEMP));
 #ifdef CVf_LVALUE
@@ -212,11 +214,11 @@ usage:
 #endif
        if (cvflags & CVf_METHOD)
            XPUSHs(newSVpvs_flags("method", SVs_TEMP));
-        if (GvUNIQUE(CvGV((CV*)sv)))
+        if (GvUNIQUE(CvGV((const CV *)sv)))
            XPUSHs(newSVpvs_flags("unique", SVs_TEMP));
        break;
     case SVt_PVGV:
-       if (GvUNIQUE(sv))
+       if (isGV_with_GP(sv) && GvUNIQUE(sv))
            XPUSHs(newSVpvs_flags("unique", SVs_TEMP));
        break;
     default:
@@ -260,8 +262,8 @@ usage:
                stash = CvSTASH(sv);
            break;
        case SVt_PVGV:
-           if (GvGP(sv) && GvESTASH((GV*)sv))
-               stash = GvESTASH((GV*)sv);
+           if (isGV_with_GP(sv) && GvGP(sv) && GvESTASH(MUTABLE_GV(sv)))
+               stash = GvESTASH(MUTABLE_GV(sv));
            break;
        default:
            break;