diff options
author | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-04-07 09:11:38 +0000 |
---|---|---|
committer | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-04-07 09:11:38 +0000 |
commit | 267cbce72d0da7af102852e6d7e0bb5c1ce41da6 (patch) | |
tree | e88e609455d2fcc6a3a5798a149a35c831628841 | |
parent | 9070af9fb87632d66faa82c00ab8b5cf20323a2b (diff) | |
download | perl-267cbce72d0da7af102852e6d7e0bb5c1ce41da6.tar.gz |
Cleanup correction for failed :Via() layer, also set an error code.
p4raw-id: //depot/perlio@9603
-rw-r--r-- | ext/PerlIO/Via/Via.xs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/ext/PerlIO/Via/Via.xs b/ext/PerlIO/Via/Via.xs index 0abcece8a7..cb3f328e6c 100644 --- a/ext/PerlIO/Via/Via.xs +++ b/ext/PerlIO/Via/Via.xs @@ -126,7 +126,7 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg) { STRLEN pkglen = 0; char *pkg = SvPV(arg,pkglen); - s->obj = arg; + s->obj = SvREFCNT_inc(arg); s->stash = gv_stashpvn(pkg, pkglen, FALSE); if (s->stash) { @@ -135,7 +135,10 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg) if (result) { if (sv_isobject(result)) - s->obj = SvREFCNT_inc(result); + { + s->obj = SvREFCNT_inc(result); + SvREFCNT_dec(arg); + } else if (SvIV(result) != 0) return SvIV(result); } @@ -147,6 +150,13 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg) else { Perl_warn(aTHX_ "Cannot find package '%.*s'",(int) pkglen,pkg); +#ifdef ENOSYS + errno = ENOSYS; +#else +#ifdef ENOENT + errno = ENOENT; +#endif +#endif code = -1; } } |