]> git.imager.perl.org - imager.git/blobdiff - Imager.xs
note probing verbosity in Changes
[imager.git] / Imager.xs
index 66d3c4448339cb3dd32e215f178c610bcbf45093..470dffb8a58a00db46a2ebe91a530c7e62752a0b 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -30,10 +30,6 @@ extern "C" {
 
 #include "imperl.h"
 
-#ifndef SV_COW_DROP_PV
-#define SV_COW_DROP_PV
-#endif
-
 /*
 
 Context object management
@@ -454,9 +450,44 @@ static void io_destroyer(void *p) {
 static bool
 im_SvREFSCALAR(SV *sv) {
   svtype type = SvTYPE(sv);
-  return type == SVt_PV || type == SVt_PVIV || type == SVt_PVNV
-      || type == SVt_PVMG || type == SVt_IV || type == SVt_NV
-      || type == SVt_PVLV || type == SVt_REGEXP;
+
+  switch (type) {
+  case SVt_PV:
+  case SVt_PVIV:
+  case SVt_PVNV:
+  case SVt_PVMG:
+  case SVt_IV:
+  case SVt_NV:
+  case SVt_PVLV:
+#if PERL_VERSION > 10
+  case SVt_REGEXP:
+#endif
+    return 1;
+
+  default:
+    return 0;
+  }
+}
+
+static const char *
+describe_sv(SV *sv) {
+  if (SvOK(sv)) {
+    if (SvROK(sv)) {
+      svtype type = SvTYPE(SvRV(sv));
+      switch (type) {
+      case SVt_PVCV: return "CV";
+      case SVt_PVGV: return "GV";
+      case SVt_PVLV: return "LV";
+      default: return "some reference";
+      }
+    }
+    else {
+      return "non-reference scalar";
+    }
+  }
+  else {
+    return "undef";
+  }
 }
 
 static i_io_glue_t *
@@ -468,11 +499,11 @@ do_io_new_buffer(pTHX_ SV *data_sv) {
 
   SvGETMAGIC(data_sv);
   if (SvROK(data_sv)) {
-    if (im_SvREFSCALAR(data_sv)) {
+    if (im_SvREFSCALAR(SvRV(data_sv))) {
       sv = SvRV(data_sv);
     }
     else {
-      i_push_error(0, "data is not a scalar or a reference to scalar");
+      i_push_errorf(0, "data is not a scalar or a reference to scalar");
       return NULL;
     }
   }
@@ -488,27 +519,6 @@ do_io_new_buffer(pTHX_ SV *data_sv) {
   return io_new_buffer(data_copy, length, free_buffer, data_copy);
 }
 
-static const char *
-describe_sv(SV *sv) {
-  if (SvOK(sv)) {
-    if (SvROK(sv)) {
-      svtype type = SvTYPE(SvRV(sv));
-      switch (type) {
-      case SVt_PVCV: return "CV";
-      case SVt_PVGV: return "GV";
-      case SVt_PVLV: return "LV";
-      default: return "some reference";
-      }
-    }
-    else {
-      return "non-reference scalar";
-    }
-  }
-  else {
-    return "undef";
-  }
-}
-
 static i_io_glue_t *
 do_io_new_cb(pTHX_ SV *writecb, SV *readcb, SV *seekcb, SV *closecb) {
   struct cbdata *cbd;
@@ -1284,9 +1294,15 @@ i_io_raw_read(ig, buffer_sv, size)
       PPCODE:
         if (size <= 0)
          croak("size negative in call to i_io_raw_read()");
-       if (SvTHINKFIRST(buffer_sv))
-         sv_force_normal_flags(buffer_sv, SV_COW_DROP_PV);
-       SvUPGRADE(buffer_sv, SVt_PV);
+        /* prevent an undefined value warning if they supplied an 
+          undef buffer.
+           Orginally conditional on !SvOK(), but this will prevent the
+          downgrade from croaking */
+       sv_setpvn(buffer_sv, "", 0);
+#ifdef SvUTF8
+       if (SvUTF8(buffer_sv))
+          sv_utf8_downgrade(buffer_sv, FALSE);
+#endif
        buffer = SvGROW(buffer_sv, size+1);
         result = i_io_raw_read(ig, buffer, size);
         if (result >= 0) {
@@ -1409,9 +1425,15 @@ i_io_read(ig, buffer_sv, size)
       PPCODE:
         if (size <= 0)
          croak("size negative in call to i_io_read()");
-       if (SvTHINKFIRST(buffer_sv))
-         sv_force_normal_flags(buffer_sv, SV_COW_DROP_PV);
-       SvUPGRADE(buffer_sv, SVt_PV);
+        /* prevent an undefined value warning if they supplied an 
+          undef buffer.
+           Orginally conditional on !SvOK(), but this will prevent the
+          downgrade from croaking */
+       sv_setpvn(buffer_sv, "", 0);
+#ifdef SvUTF8
+       if (SvUTF8(buffer_sv))
+          sv_utf8_downgrade(buffer_sv, FALSE);
+#endif
        buffer = SvGROW(buffer_sv, size+1);
         result = i_io_read(ig, buffer, size);
         if (result >= 0) {