This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Avoid AV and HV in perlio.c by inventing PerlIO_list_t which is AV-ish
[perl5.git] / ext / PerlIO / Via / Via.xs
index 3f491da..fcf316c 100644 (file)
@@ -33,7 +33,7 @@ typedef struct
  CV *FLUSH;
  CV *SETLINEBUF;
  CV *CLEARERR;
- CV *ERROR;
+ CV *mERROR;
  CV *mEOF;
 } PerlIOVia;
 
@@ -70,7 +70,6 @@ PerlIOVia_method(pTHX_ PerlIO *f,char *method,CV **save,int flags,...)
    IV count;
    dSP;
    SV *arg;
-   int i = 0;
    ENTER;
    PUSHMARK(sp);
    XPUSHs(s->obj);
@@ -126,7 +125,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 +134,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 +149,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;
       }
     }
@@ -155,7 +164,7 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg)
 }
 
 PerlIO *
-PerlIOVia_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
+PerlIOVia_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
 {
  if (!f)
   {
@@ -382,7 +391,6 @@ PerlIOVia_get_base(PerlIO *f)
 {
  if (PerlIOBase(f)->flags & PERLIO_F_CANREAD)
   {
-   dTHX;
    PerlIOVia *s = PerlIOSelf(f,PerlIOVia);
    if (s->var)
     {
@@ -400,7 +408,6 @@ PerlIOVia_get_ptr(PerlIO *f)
    PerlIOVia *s = PerlIOSelf(f,PerlIOVia);
    if (s->var)
     {
-     dTHX;
      STDCHAR *p = (STDCHAR *)(SvEND(s->var) - s->cnt);
      return p;
     }
@@ -459,21 +466,21 @@ PerlIOVia_clearerr(PerlIO *f)
  PerlIOBase_clearerr(f);
 }
 
-IV
-PerlIOVia_error(PerlIO *f)
+SV *
+PerlIOVia_getarg(PerlIO *f)
 {
  dTHX;
  PerlIOVia *s = PerlIOSelf(f,PerlIOVia);
- SV *result = PerlIOVia_method(aTHX_ f,MYMethod(ERROR),G_SCALAR,Nullsv);
- return (result) ? SvIV(result) : PerlIOBase_error(f);
+ return PerlIOVia_method(aTHX_ f,MYMethod(GETARG),G_SCALAR,Nullsv);
 }
 
-SV *
-PerlIOVia_getarg(PerlIO *f)
+IV
+PerlIOVia_error(PerlIO *f)
 {
  dTHX;
  PerlIOVia *s = PerlIOSelf(f,PerlIOVia);
- return PerlIOVia_method(aTHX_ f,MYMethod(GETARG),G_SCALAR,Nullsv);
+ SV *result = PerlIOVia_method(aTHX_ f,"ERROR",&s->mERROR,G_SCALAR,Nullsv);
+ return (result) ? SvIV(result) : PerlIOBase_error(f);
 }
 
 IV