fix SV type probing to not break pre perl 5.12
[imager.git] / Imager.xs
index 15750a2..eaf756e 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -454,9 +454,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 +503,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 +523,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;