Propagate const/mutable/not into the SvPV call for retrieving an
[p5sagit/p5-mst-13.2.git] / universal.c
index e02bf00..0a729e9 100644 (file)
@@ -176,7 +176,11 @@ XS(XS_version_stringify);
 XS(XS_version_numify);
 XS(XS_version_vcmp);
 XS(XS_version_boolean);
+#ifdef HASATTRIBUTE_NORETURN
+XS(XS_version_noop) __attribute__noreturn__;
+#else
 XS(XS_version_noop);
+#endif
 XS(XS_version_is_alpha);
 XS(XS_version_qv);
 XS(XS_utf8_is_utf8);
@@ -250,7 +254,6 @@ XS(XS_UNIVERSAL_isa)
     dXSARGS;
     SV *sv;
     const char *name;
-    STRLEN n_a;
 
     if (items != 2)
        Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
@@ -264,7 +267,7 @@ XS(XS_UNIVERSAL_isa)
                || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
        XSRETURN_UNDEF;
 
-    name = (const char *)SvPV(ST(1),n_a);
+    name = SvPV_nolen_const(ST(1));
 
     ST(0) = boolSV(sv_derived_from(sv, name));
     XSRETURN(1);
@@ -277,7 +280,6 @@ XS(XS_UNIVERSAL_can)
     const char *name;
     SV   *rv;
     HV   *pkg = NULL;
-    STRLEN n_a;
 
     if (items != 2)
        Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
@@ -291,7 +293,7 @@ XS(XS_UNIVERSAL_can)
                || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
        XSRETURN_UNDEF;
 
-    name = (const char *)SvPV(ST(1),n_a);
+    name = SvPV_nolen_const(ST(1));
     rv = &PL_sv_undef;
 
     if (SvROK(sv)) {
@@ -357,10 +359,9 @@ XS(XS_UNIVERSAL_VERSION)
                           "%s does not define $%s::VERSION--version check failed",
                           name, name);
            } else {
-               STRLEN n_a;
                Perl_croak(aTHX_
                             "%s defines neither package nor VERSION--version check failed",
-                            SvPVx(ST(0),n_a) );
+                            SvPVx_nolen_const(ST(0)) );
             }
        }
 
@@ -394,13 +395,13 @@ XS(XS_version_new)
        Perl_croak(aTHX_ "Usage: version::new(class, version)");
     SP -= items;
     {
-        const char *classname = SvPV_nolen(ST(0));
+        const char *classname = SvPV_nolen_const(ST(0));
         SV *vs = ST(1);
        SV *rv;
        if (items == 3 )
        {
            vs = sv_newmortal(); 
-           Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen(ST(2)));
+           Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
        }
 
        rv = new_version(vs);
@@ -534,25 +535,16 @@ XS(XS_version_boolean)
 
 XS(XS_version_noop)
 {
-     dXSARGS;
-     if (items < 1)
-         Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)");
-     {
-         SV *  lobj = Nullsv;
-
-         if (sv_derived_from(ST(0), "version")) {
-              SV *tmp = SvRV(ST(0));
-              lobj = tmp;
-         }
-         else
-              Perl_croak(aTHX_ "lobj is not of type version");
-
-         {
-              Perl_croak(aTHX_ "operation not supported with version object");
-         }
-
-     }
-     XSRETURN_EMPTY;
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)");
+    if (sv_derived_from(ST(0), "version"))
+       Perl_croak(aTHX_ "operation not supported with version object");
+    else
+       Perl_croak(aTHX_ "lobj is not of type version");
+#ifndef HASATTRIBUTE_NORETURN
+    XSRETURN_EMPTY;
+#endif
 }
 
 XS(XS_version_is_alpha)
@@ -647,7 +639,7 @@ XS(XS_utf8_valid)
          SV *  sv = ST(0);
          {
               STRLEN len;
-              const char *s = SvPV(sv,len);
+              const char *s = SvPV_const(sv,len);
               if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
                    XSRETURN_YES;
               else
@@ -815,7 +807,7 @@ XS(XS_PerlIO_get_layers)
                  SV **varp = svp;
                  SV **valp = svp + 1;
                  STRLEN klen;
-                  const char *key = SvPV(*varp, klen);
+                  const char *key = SvPV_const(*varp, klen);
 
                  switch (*key) {
                  case 'i':
@@ -925,6 +917,7 @@ XS(XS_Internals_hash_seed)
     /* Using dXSARGS would also have dITEM and dSP,
      * which define 2 unused local variables.  */
     dAXMARK;
+    (void)mark;
     XSRETURN_UV(PERL_HASH_SEED);
 }
 
@@ -933,6 +926,7 @@ XS(XS_Internals_rehash_seed)
     /* Using dXSARGS would also have dITEM and dSP,
      * which define 2 unused local variables.  */
     dAXMARK;
+    (void)mark;
     XSRETURN_UV(PL_rehash_seed);
 }