#include "imperl.h"
-#ifndef SV_COW_DROP_PV
-#define SV_COW_DROP_PV
-#endif
-
/*
Context object management
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 *
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;
}
}
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;
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) {
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) {