--- IO-AIO/AIO.xs 2009/04/19 13:15:55 1.136 +++ IO-AIO/AIO.xs 2009/04/21 20:12:56 1.139 @@ -314,9 +314,13 @@ break; case EIO_READ: - SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); - *SvEND (req->sv2) = 0; - PUSHs (sv_2mortal (newSViv (req->result))); + { + SvCUR_set (req->sv2, req->stroffset + (req->result > 0 ? req->result : 0)); + *SvEND (req->sv2) = 0; + SvPOK_only (req->sv2); + SvSETMAGIC (req->sv2); + PUSHs (sv_2mortal (newSViv (req->result))); + } break; case EIO_DUP2: @@ -669,15 +673,9 @@ PPCODE: { STRLEN svlen; + int fd = extract_fd (fh, ix == EIO_WRITE); char *svptr = SvPVbyte (data, svlen); UV len = SvUV (length); - int fd; - - if (SvTYPE (data) > SVt_PVMG) - croak ("illegal data argument '%s', must be plain scalar string", SvPV_nolen (data)); - - SvUPGRADE (data, SVt_PV); - SvPOK_only (data); if (dataoffset < 0) dataoffset += svlen; @@ -693,15 +691,11 @@ } else { - /* read: grow scalar as necessary */ + /* read: check type and grow scalar as necessary */ + SvUPGRADE (data, SVt_PV); svptr = SvGROW (data, len + dataoffset + 1); } - if (len < 0) - croak ("length must not be negative"); - - fd = extract_fd (fh, ix == EIO_WRITE); - { dREQ;