cvsuser     03/07/01 08:41:06

  Modified:    .        embed.c io.ops
               classes  parrotio.pmc
               include/parrot io.h
               io       io.c io_unix.c
  Log:
  This is the first step of the IO-system away from the mem_sys_alloc/free
  memory-managment system to a full-fledged PMC-based system.
  
  In this patch only the ParrotIO structures are transformed to a
  PMC. This is simply done by wrapping the ParrotIO in a PMC_data. For
  easier access of the layer-pointer (this is the first thing that is
  actually needed if a function is called) is stored in the
  cache.struct_val. The rest of the patch is mostly to an update of
  parrot to the new prototypes.
  
  The filedescriptor-ops are not deleted in this patch, but use
  a hack to always create a new temporary PMC from the filedescriptor.
  
  The standard filedescriptors stdin, stdout and stderr are protected
  from closing by the PMC_destroy function by marking them as
  PIO_F_SHARED. Don't know if this is a right solution.
  
  Courtesy of Jürgen Bömmels <[EMAIL PROTECTED]>
  
  (Committer's note: I think this exposes some latent bugs, as it fails
  9 tests on OS X, but getting it in is worth it so other folks can
  thump the thing)
  
  Revision  Changes    Path
  1.69      +3 -3      parrot/embed.c
  
  Index: embed.c
  ===================================================================
  RCS file: /cvs/public/parrot/embed.c,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -w -r1.68 -r1.69
  --- embed.c   14 Jun 2003 17:48:31 -0000      1.68
  +++ embed.c   1 Jul 2003 15:41:00 -0000       1.69
  @@ -1,7 +1,7 @@
   /* embed.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: embed.c,v 1.68 2003/06/14 17:48:31 dan Exp $
  + *     $Id: embed.c,v 1.69 2003/07/01 15:41:00 dan Exp $
    *  Overview:
    *     The Parrot embedding interface.
    *  Data Structure and Algorithms:
  @@ -71,7 +71,7 @@
       off_t program_size, wanted;
       char *program_code;
       struct PackFile *pf;
  -    ParrotIO * io = NULL;
  +    PMC * io = NULL;
       INTVAL is_mapped = 0;
   
   #ifdef HAS_HEADER_SYSSTAT
  @@ -84,7 +84,7 @@
   
       if (filename == NULL || strcmp(filename, "-") == 0) {
           /* read from STDIN */
  -        io = PIO_STDIN(interpreter);
  +        io = new_io_pmc(interpreter, PIO_STDIN(interpreter));
           /* read 1k at a time */
           program_size = 0;
       }
  
  
  
  1.24      +41 -60    parrot/io.ops
  
  Index: io.ops
  ===================================================================
  RCS file: /cvs/public/parrot/io.ops,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -w -r1.23 -r1.24
  --- io.ops    30 Jun 2003 07:47:32 -0000      1.23
  +++ io.ops    1 Jul 2003 15:41:00 -0000       1.24
  @@ -36,7 +36,7 @@
   =cut
   
   inline op close(in PMC) {
  -     PIO_close(interpreter, (ParrotIO*)(PMC_data($1)));
  +     PIO_close(interpreter, $1);
        goto NEXT();
   }
   
  @@ -58,20 +58,15 @@
     ParrotIO *io;
     mode = string_to_cstring(interpreter, $3);
   
  -  io = PIO_fdopen(interpreter, $2, mode);
  +  $1 = PIO_fdopen(interpreter, $2, mode);
  +  if (!$1) {
  +    $1 = pmc_new(interpreter, enum_class_PerlUndef);
  +  }
     /* string_cstring_free(mode); */
     /* TODO all results from sring_to_cstring() need freeing
        but this generates ugly warnings WRT discarding the const
        qualifier -lt
      */
  -  if (io) {
  -    $1 = pmc_new_noinit(interpreter, enum_class_ParrotIO);
  -    VTABLE_init(interpreter, $1);
  -    PMC_data($1) = io;
  -  }
  -  else {
  -    $1 = pmc_new(interpreter, enum_class_PerlUndef);
  -  }
   #else
       $1 = pmc_new(interpreter, enum_class_PerlUndef);
   #endif
  @@ -88,22 +83,16 @@
   =cut
   
   inline op open(out PMC, in STR, in STR) {
  -  ParrotIO * io;
     /* These char * need to go away soon */
     const char * path, * mode;
   
     path = string_to_cstring(interpreter, $2);
     mode = string_to_cstring(interpreter, $3);
   
  -  io = PIO_open(interpreter, path, mode);
  +  $1 = PIO_open(interpreter, path, mode);
     /* string_cstring_free(mode); */
     /* string_cstring_free(path); */
  -  if(io) {
  -    $1 = pmc_new_noinit(interpreter, enum_class_ParrotIO);
  -    VTABLE_init(interpreter, $1);
  -    PMC_data($1) = io;
  -  }
  -  else {
  +  if(!$1) {
       $1 = pmc_new(interpreter, enum_class_PerlUndef);
     }
     goto NEXT();
  @@ -123,7 +112,7 @@
   
   op open(out INT, in STR) {
     char *path = string_to_cstring(interpreter, $2);
  -  ParrotIO *io = PIO_open(interpreter, path, "+<");
  +  PMC *io = PIO_open(interpreter, path, "+<");
     /* string_cstring_free(path); */
     if (io) {
       $1 = PIO_getfd(interpreter, io);
  @@ -137,7 +126,7 @@
   op open(out INT, in STR, in STR) {
     char *path = string_to_cstring(interpreter, $2);
     char *mode = string_to_cstring(interpreter, $3);
  -  ParrotIO *io = PIO_open(interpreter, path, mode);
  +  PMC *io = PIO_open(interpreter, path, mode);
     /* string_cstring_free(mode); */
     /* string_cstring_free(path); */
     if (io) {
  @@ -151,7 +140,7 @@
   
   ########################################
   
  -=item B<close>(out INT)
  +=item B<close>(inout INT)
   
   Close file opened on file descriptor $1.
   
  @@ -165,7 +154,7 @@
       table = ((ParrotIOData*)interpreter->piodata)->table;
       io = table[$1];
       table[$1] = NULL;
  -    PIO_close(interpreter, io);
  +    PIO_close(interpreter, new_io_pmc(interpreter, io));
     }
     goto NEXT();
   }
  @@ -208,16 +197,18 @@
   op print(in STR) {
     STRING *s = $1;
     if (s && string_length(s)) {
  -    PIO_putps(interpreter, PIO_STDOUT(interpreter), s);
  +    PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
  +              s);
     }
     goto NEXT();
   }
   
   op print(in PMC) {
     PMC *p = $1;
  -  STRING *s = (p->vtable->get_string(interpreter, p));
  +  STRING *s = (VTABLE_get_string(interpreter, p));
     if (s) {
  -    PIO_putps(interpreter, PIO_STDOUT(interpreter), s);
  +    PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
  +              s);
     }
     goto NEXT();
   }
  @@ -226,14 +217,14 @@
   op print(in INT, in INT) {
     ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
     STRING *s = Parrot_sprintf_c(interpreter, INTVAL_FMT, $2);
  -  PIO_putps(interpreter, io, s);
  +  PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
     goto NEXT();
   }
   
   op print(in INT, in NUM) {
     ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
     STRING *s = Parrot_sprintf_c(interpreter, "%f", (double)$2);
  -  PIO_putps(interpreter, io, s);
  +  PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
     goto NEXT();
   }
   
  @@ -241,7 +232,7 @@
     STRING *s = $2;
     ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
     if (s && string_length(s)) {
  -    PIO_putps(interpreter, io, s);
  +    PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
     }
     goto NEXT();
   }
  @@ -251,14 +242,14 @@
     ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
     STRING *s = (p->vtable->get_string(interpreter, p));
     if (s) {
  -    PIO_putps(interpreter, io, s);
  +    PIO_putps(interpreter, new_io_pmc(interpreter, io), s);
     }
     goto NEXT();
   }
   
   op flush(in INT) {
     ParrotIO *io = ((ParrotIOData*)interpreter->piodata)->table[$1];
  -  PIO_flush(interpreter, io);
  +  PIO_flush(interpreter, new_io_pmc(interpreter, io));
     goto NEXT();
   }
   
  @@ -271,10 +262,8 @@
   =cut
   
   op print(in PMC, in STR) {
  -  ParrotIO * io;
  -  io = (ParrotIO*)(PMC_data($1));
  -  if ($2 && io) {
  -    PIO_write(interpreter, io, ($2)->strstart, string_length($2));
  +  if ($2 && $1) {
  +    PIO_write(interpreter, $1, ($2)->strstart, string_length($2));
     }
     goto NEXT();
   }
  @@ -289,8 +278,8 @@
   
   op printerr(in STR) {
     if ($1) {
  -    PIO_write(interpreter, PIO_STDERR(interpreter), ($1)->strstart,
  -                     string_length($1));
  +    PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDERR(interpreter)),
  +              $1);
     }
     goto NEXT();
   }
  @@ -311,28 +300,22 @@
   =cut
   
   op puts(in STR) {
  -  if (($1) && string_length($1)) {
  -    PIO_write(interpreter, PIO_STDOUT(interpreter), ($1)->strstart,
  -                     string_length($1));
  +  if ($1) {
  +    PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)),
  +             $1);
     }
     goto NEXT();
   }
   
   op puts(in INT) {
     STRING * s = string_from_int(interpreter, $1);
  -  if (string_length(s)) {
  -    PIO_write(interpreter, PIO_STDOUT(interpreter), s->strstart,
  -                     string_length(s));
  -  }
  +  PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)), s);
     goto NEXT();
   }
   
   op puts(in NUM) {
     STRING * s = Parrot_sprintf_c(interpreter, "%f", $1);
  -  if (string_length(s)) {
  -    PIO_write(interpreter, PIO_STDOUT(interpreter), s->strstart,
  -                     string_length(s));
  -  }
  +  PIO_putps(interpreter, new_io_pmc(interpreter, PIO_STDOUT(interpreter)), s);
     goto NEXT();
   }
   
  @@ -363,7 +346,8 @@
       n = $2;
     $1 = string_make(interpreter, NULL, n, NULL, 0, NULL);
     memset(($1)->strstart, 0, n);
  -  nr = PIO_read(interpreter, PIO_STDIN(interpreter), ($1)->strstart, (size_t)n);
  +  nr = PIO_read(interpreter, new_io_pmc(interpreter, PIO_STDIN(interpreter)),
  +                ($1)->strstart, (size_t)n);
     if(nr > 0)
       ($1)->strlen = ($1)->bufused = nr;
     else
  @@ -380,8 +364,7 @@
       n = $3;
     $1 = string_make(interpreter, NULL, n, NULL, 0, NULL);
     memset(($1)->strstart, 0, n);
  -  nr = PIO_read(interpreter, (ParrotIO*)(PMC_data($2)),
  -    ($1)->strstart, (size_t)n);
  +  nr = PIO_read(interpreter, $2, ($1)->strstart, (size_t)n);
     if(nr > 0)
       ($1)->strlen = ($1)->bufused = nr;
     else
  @@ -405,9 +388,11 @@
     memset(($1)->strstart, 0, 65535);
   
     if ($2 >= 0) {
  +    PMC *pmc;
       io = ((ParrotIOData*)interpreter->piodata)->table[$2];
  -    PIO_setlinebuf(interpreter, io);
  -    len = PIO_read(interpreter, io, ($1)->strstart, 65534);
  +    pmc = new_io_pmc(interpreter, io);
  +    PIO_setlinebuf(interpreter, pmc);
  +    len = PIO_read(interpreter, pmc, ($1)->strstart, 65534);
       ($1)->strlen = ($1)->bufused = len;
     }
     goto NEXT();
  @@ -430,19 +415,15 @@
   =cut
   
   op seek(out INT, in PMC, in INT, in INT) {
  -  ParrotIO * io;
  -  io = (ParrotIO*)(PMC_data($2));
  -  if (io) {
  -    $1 = (INTVAL)PIO_seek(interpreter, io, 0, $3, $4);
  +  if ($2) {
  +    $1 = (INTVAL)PIO_seek(interpreter, $2, 0, $3, $4);
     }
     goto NEXT();
   }
   
   op seek(out INT, in PMC, in INT, in INT, in INT) {
  -  ParrotIO * io;
  -  io = (ParrotIO*)(PMC_data($2));
  -  if (io) {
  -    $1 = (INTVAL)PIO_seek(interpreter, io, $3, $4, $5);
  +  if ($2) {
  +    $1 = (INTVAL)PIO_seek(interpreter, $2, $3, $4, $5);
     }
     goto NEXT();
   }
  
  
  
  1.2       +4 -4      parrot/classes/parrotio.pmc
  
  Index: parrotio.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/parrotio.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- parrotio.pmc      23 Jun 2003 09:26:18 -0000      1.1
  +++ parrotio.pmc      1 Jul 2003 15:41:02 -0000       1.2
  @@ -1,7 +1,7 @@
   /* ParrotIO.pmc
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: parrotio.pmc,v 1.1 2003/06/23 09:26:18 leo Exp $
  + *     $Id: parrotio.pmc,v 1.2 2003/07/01 15:41:02 dan Exp $
    *  Overview:
    *     These are the vtable functions for Parrot IO
    *  Data Structure and Algorithms:
  @@ -26,8 +26,8 @@
       }
   
       void destroy () {
  -     if (PMC_data(SELF)) {
  -         PIO_close(interpreter, (ParrotIO*)(PMC_data(SELF)));
  -     }
  +     ParrotIO *io = PMC_data(SELF);
  +        if (!(io->flags & PIO_F_SHARED))
  +            PIO_close(interpreter, SELF); 
       }
   }
  
  
  
  1.33      +21 -21    parrot/include/parrot/io.h
  
  Index: io.h
  ===================================================================
  RCS file: /cvs/public/parrot/include/parrot/io.h,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -w -r1.32 -r1.33
  --- io.h      23 Jun 2003 09:26:25 -0000      1.32
  +++ io.h      1 Jul 2003 15:41:05 -0000       1.33
  @@ -1,7 +1,7 @@
   /* io.h
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: io.h,v 1.32 2003/06/23 09:26:25 leo Exp $
  + *     $Id: io.h,v 1.33 2003/07/01 15:41:05 dan Exp $
    *  Overview:
    *      Parrot IO subsystem
    *  Data Structure and Algorithms:
  @@ -293,42 +293,42 @@
   extern void PIO_finish(theINTERP);
   extern INTVAL PIO_init_stacks(theINTERP);
   extern void PIO_atexit(theINTERP);
  -extern INTVAL PIO_push_layer(theINTERP, ParrotIOLayer *, ParrotIO *);
  -extern ParrotIOLayer *PIO_pop_layer(theINTERP, ParrotIO *);
  +extern INTVAL PIO_push_layer(theINTERP, ParrotIOLayer *, PMC *);
  +extern ParrotIOLayer *PIO_pop_layer(theINTERP, PMC *);
   extern ParrotIOLayer *PIO_copy_stack(ParrotIOLayer *);
   
   
  +extern struct PMC *new_io_pmc(struct Parrot_Interp *, ParrotIO *);
   extern void free_io_header(ParrotIO *);
   extern ParrotIOTable alloc_pio_array(int);
   extern int realloc_pio_array(ParrotIOTable *, int);
  -extern ParrotIO *PIO_new(struct Parrot_Interp *, ParrotIO *,
  -                         INTVAL, INTVAL, INTVAL);
  -extern void PIO_destroy(theINTERP, ParrotIO *io);
  +extern ParrotIO *PIO_new(struct Parrot_Interp *, INTVAL, INTVAL, INTVAL);
  +extern void PIO_destroy(theINTERP, PMC *io);
   
   extern INTVAL PIO_base_init(theINTERP, ParrotIOLayer *proto);
   extern ParrotIOLayer *PIO_base_new_layer(ParrotIOLayer *proto);
   extern void PIO_base_delete_layer(ParrotIOLayer *proto);
   
   extern INTVAL PIO_parse_open_flags(const char *flagstr);
  -extern ParrotIO *PIO_open(theINTERP, const char *, const char *);
  -extern ParrotIO *PIO_fdopen(theINTERP, PIOHANDLE, const char *);
  -extern INTVAL PIO_close(theINTERP, ParrotIO *);
  -extern void PIO_flush(theINTERP, ParrotIO *);
  -extern INTVAL PIO_read(theINTERP, ParrotIO *, void *, size_t);
  -extern INTVAL PIO_write(theINTERP, ParrotIO *, void *, size_t);
  -extern INTVAL PIO_setbuf(theINTERP, ParrotIO *, size_t);
  -extern INTVAL PIO_setlinebuf(theINTERP, ParrotIO *);
  -extern INTVAL PIO_puts(theINTERP, ParrotIO *, const char *);
  -extern INTVAL PIO_seek(theINTERP, ParrotIO *, INTVAL hi,
  +extern PMC *PIO_open(theINTERP, const char *, const char *);
  +extern PMC *PIO_fdopen(theINTERP, PIOHANDLE, const char *);
  +extern INTVAL PIO_close(theINTERP, PMC *);
  +extern void PIO_flush(theINTERP, PMC *);
  +extern INTVAL PIO_read(theINTERP, PMC *, void *, size_t);
  +extern INTVAL PIO_write(theINTERP, PMC *, void *, size_t);
  +extern INTVAL PIO_setbuf(theINTERP, PMC *, size_t);
  +extern INTVAL PIO_setlinebuf(theINTERP, PMC *);
  +extern INTVAL PIO_puts(theINTERP, PMC *, const char *);
  +extern INTVAL PIO_seek(theINTERP, PMC *, INTVAL hi,
                          INTVAL lo, INTVAL whence);
  -extern INTVAL PIO_eof(theINTERP, ParrotIO *);
  +extern INTVAL PIO_eof(theINTERP, PMC *);
   
  -extern INTVAL PIO_putps(theINTERP, ParrotIO *io, STRING *s);
  -extern INTVAL PIO_fprintf(theINTERP, ParrotIO *io, const char *s, ...);
  +extern INTVAL PIO_putps(theINTERP, PMC *io, STRING *s);
  +extern INTVAL PIO_fprintf(theINTERP, PMC *io, const char *s, ...);
   extern INTVAL PIO_printf(theINTERP, const char *s, ...);
   extern INTVAL PIO_eprintf(theINTERP, const char *s, ...);
  -extern INTVAL PIO_getfd(theINTERP, ParrotIO *io);
  -extern PIOOFF_T PIO_tell(theINTERP, ParrotIO *io);
  +extern INTVAL PIO_getfd(theINTERP, PMC *io);
  +extern PIOOFF_T PIO_tell(theINTERP, PMC *io);
   
   /* Put platform specific macros here if you must */
   #ifdef PIO_OS_WIN32
  
  
  
  1.40      +121 -98   parrot/io/io.c
  
  Index: io.c
  ===================================================================
  RCS file: /cvs/public/parrot/io/io.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -w -r1.39 -r1.40
  --- io.c      30 Jun 2003 16:02:54 -0000      1.39
  +++ io.c      1 Jul 2003 15:41:06 -0000       1.40
  @@ -1,7 +1,7 @@
   /* io.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *      $Id: io.c,v 1.39 2003/06/30 16:02:54 leo Exp $
  + *      $Id: io.c,v 1.40 2003/07/01 15:41:06 dan Exp $
    *  Overview:
    *      This is the Parrot IO subsystem API.  Generic IO stuff
    *      goes here, each specific layer goes in its own file...
  @@ -40,16 +40,15 @@
   
   PIOOFF_T piooffsetzero;
   
  -#if 0
  -void
  -free_io_header(ParrotIO *io)
  +PMC *
  +new_io_pmc(theINTERP, ParrotIO *io)
   {
  -    /* Free buffer if it was malloced */
  -    if (io->b.startb && (io->b.flags & PIO_BF_MALLOC))
  -        free(io->b.startb);
  -    free(io);
  +    PMC *new_pmc;
  +    new_pmc = pmc_new(interpreter, enum_class_ParrotIO);
  +    PMC_data(new_pmc) = io;
  +    new_pmc->cache.struct_val = io->stack;
  +    return new_pmc;
   }
  -#endif
   
   ParrotIOTable
   alloc_pio_array(int numhandles)
  @@ -69,18 +68,15 @@
   }
   
   /*
  - * Create a new IO stream, optionally reusing old structure.
  + * Create a new IO stream,
    */
   ParrotIO *
  -PIO_new(theINTERP, ParrotIO *old, INTVAL iotype, INTVAL flags, INTVAL mode)
  +PIO_new(theINTERP, INTVAL iotype, INTVAL flags, INTVAL mode)
   {
       ParrotIO *new_io;
   
       UNUSED(iotype);
   
  -    if (old) {
  -        /* FIXME: Reuse old IO */
  -    }
       new_io = (ParrotIO *)mem_sys_allocate(sizeof(ParrotIO));
       new_io->fpos = new_io->lpos = piooffsetzero;
       new_io->flags = flags;
  @@ -98,8 +94,9 @@
    * Destroying the IO-Stream, at the moment only free memory
    */
   void
  -PIO_destroy(theINTERP, ParrotIO *io)
  +PIO_destroy(theINTERP, PMC *pmc)
   {
  +    ParrotIO *io = PMC_data(pmc);
       UNUSED(interpreter);
   
       if (io->b.startb && (io->b.flags & PIO_BF_MALLOC))
  @@ -137,7 +134,7 @@
       }
   
       if (Interp_flags_TEST(interpreter, PARROT_DEBUG_FLAG)) {
  -        PIO_puts(interpreter, PIO_STDERR(interpreter),
  +        PIO_puts(interpreter, new_io_pmc(interpreter, PIO_STDERR(interpreter)),
                    "PIO: IO system initialized.\n");
       }
   }
  @@ -156,7 +153,7 @@
   
       for (i = 0 ; i < PIO_NR_OPEN; i++) {
           if ( (io = GET_INTERP_IOD(interpreter)->table[i]) ) {
  -            PIO_close(interpreter, io);
  +            PIO_close(interpreter, new_io_pmc(interpreter, io));
           }
       }
       for (p = GET_INTERP_IO(interpreter); p; ) {
  @@ -275,12 +272,15 @@
    * Push a layer onto an IO object or the default stack
    */
   INTVAL
  -PIO_push_layer(theINTERP, ParrotIOLayer *layer, ParrotIO *io)
  +PIO_push_layer(theINTERP, ParrotIOLayer *layer, PMC *pmc)
   {
       ParrotIOLayer *t;
  +
       if (layer == NULL)
           return -1;
  -    if (io != NULL) {
  +    if (pmc != NULL) {
  +        ParrotIO *io = PMC_data(pmc);
  +
           if (io->stack == NULL && (layer->flags & PIO_L_TERMINAL) == 0) {
               /* Error( 1st layer must be terminal) */
               return -1;
  @@ -328,9 +328,11 @@
    * Pop a layer from an IO object or the default stack
    */
   ParrotIOLayer *
  -PIO_pop_layer(theINTERP, ParrotIO *io)
  +PIO_pop_layer(theINTERP, PMC *pmc)
   {
       ParrotIOLayer *layer;
  +    ParrotIO *io = PMC_data(pmc);
  +
       if (io) {
           layer = io->stack;
           if (layer) {
  @@ -437,12 +439,14 @@
    * API for controlling buffering specifics on an IO stream
    */
   INTVAL
  -PIO_setbuf(theINTERP, ParrotIO *io, size_t bufsize)
  +PIO_setbuf(theINTERP, PMC *pmc, size_t bufsize)
   {
  -    ParrotIOLayer *l = io->stack;
  -    PIO_flush(interpreter, io);
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
  +    PIO_flush(interpreter, pmc);
       while (l) {
           if (l->api->SetBuf) {
  +            ParrotIO *io = PMC_data(pmc);
               return (*l->api->SetBuf) (interpreter, l, io, bufsize);
           }
           l = PIO_DOWNLAYER(l);
  @@ -453,12 +457,13 @@
   
   
   INTVAL
  -PIO_setlinebuf(theINTERP, ParrotIO *io)
  +PIO_setlinebuf(theINTERP, PMC *pmc)
   {
  -    ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
   
       while (l) {
           if (l->api->SetLineBuf) {
  +            ParrotIO *io = PMC_data(pmc);            
               return (*l->api->SetLineBuf) (interpreter, l, io);
           }
           l = PIO_DOWNLAYER(l);
  @@ -468,18 +473,19 @@
   }
   
   
  -ParrotIO *
  +PMC *
   PIO_open(theINTERP, const char *spath, const char *sflags)
   {
       ParrotIO *io;
       ParrotIOLayer *l = GET_INTERP_IO(interpreter);
       INTVAL flags = PIO_parse_open_flags(sflags);
  +
       while (l) {
           if (l->api->Open) {
               io = (*l->api->Open) (interpreter, l, spath, flags);
               if (io) {
                   io->stack = GET_INTERP_IO(interpreter);
  -                return io;
  +                return new_io_pmc(interpreter, io);
               }
               else {
                   return NULL;
  @@ -496,18 +502,24 @@
    * This is particularly used to init Parrot Standard IO onto
    * the OS IO handles (0,1,2).
    */
  -ParrotIO *
  +PMC *
   PIO_fdopen(theINTERP, PIOHANDLE fd, const char *sflags)
   {
       ParrotIO *io;
       INTVAL flags;
       ParrotIOLayer *l = GET_INTERP_IO(interpreter);
  +
       flags = PIO_parse_open_flags(sflags);
       while (l) {
           if (l->api->FDOpen) {
               io = (*l->api->FDOpen) (interpreter, l, fd, flags);
  +            if (io) {
               io->stack = GET_INTERP_IO(interpreter);
  -            return io;
  +                return new_io_pmc(interpreter, io);
  +            }
  +            else {
  +                return NULL;
  +            }
           }
           l = PIO_DOWNLAYER(l);
       }
  @@ -516,56 +528,57 @@
   
   
   INTVAL
  -PIO_close(theINTERP, ParrotIO *io)
  +PIO_close(theINTERP, PMC *pmc)
   {
       INTVAL res;
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Close) {
  -                PIO_flush(interpreter, io);
  +            ParrotIO *io = PMC_data(pmc);
  +            PIO_flush(interpreter, pmc);
                   res =  (*l->api->Close) (interpreter, l, io);
  -                PIO_destroy(interpreter, io);
  +            PIO_destroy(interpreter, pmc);
                   return res;
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
  +
       return 0;
   }
   
   
   void
  -PIO_flush(theINTERP, ParrotIO *io)
  +PIO_flush(theINTERP, PMC *pmc)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Flush) {
  +            ParrotIO *io = PMC_data(pmc);
                   (*l->api->Flush) (interpreter, l, io);
                   return;
               }
               l = PIO_DOWNLAYER(l);
           }
       }
  -}
   
   
   /*
    * Iterate down the stack to the first layer implementing "Read" API
    */
   INTVAL
  -PIO_read(theINTERP, ParrotIO *io, void *buffer, size_t len)
  +PIO_read(theINTERP, PMC *pmc, void *buffer, size_t len)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Read) {
  +            ParrotIO *io = PMC_data(pmc);
                   return (*l->api->Read) (interpreter, l, io, buffer, len);
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
   
       return 0;
   }
  @@ -575,17 +588,17 @@
    * Iterate down the stack to the first layer implementing "Write" API
    */
   INTVAL
  -PIO_write(theINTERP, ParrotIO *io, void *buffer, size_t len)
  +PIO_write(theINTERP, PMC *pmc, void *buffer, size_t len)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Write) {
  +            ParrotIO *io = PMC_data(pmc);
                   return (*l->api->Write) (interpreter, l, io, buffer, len);
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
   
       return 0;
   }
  @@ -597,17 +610,18 @@
    * a 1 and 2 arg version of seek opcode.
    */
   INTVAL
  -PIO_seek(theINTERP, ParrotIO *io, INTVAL hi, INTVAL lo, INTVAL w)
  +PIO_seek(theINTERP, PMC *pmc, INTVAL hi, INTVAL lo, INTVAL w)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Seek) {
  +            ParrotIO *io = PMC_data(pmc);
                   return (*l->api->Seek) (interpreter, l, io, hi, lo, w);
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
  +
       return -1;
   }
   
  @@ -616,17 +630,17 @@
    * Iterate down the stack to the first layer implementing "Tell" API
    */
   PIOOFF_T
  -PIO_tell(theINTERP, ParrotIO *io)
  +PIO_tell(theINTERP, PMC *pmc)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->Tell) {
  +            ParrotIO *io = PMC_data(pmc);
                   return (*l->api->Tell) (interpreter, l, io);
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
   
       return -1;
   }
  @@ -636,8 +650,10 @@
    * Iterate down the stack to the first layer implementing "Read" API
    */
   INTVAL
  -PIO_eof(theINTERP, ParrotIO *io)
  +PIO_eof(theINTERP, PMC *pmc)
   {
  +    ParrotIO *io = PMC_data(pmc);
  +
       if (io) {
           return (io->flags & (PIO_F_EOF)) != 0;
       }
  @@ -649,38 +665,41 @@
    * PIO_putps is for.
    */
   INTVAL
  -PIO_puts(theINTERP, ParrotIO *io, const char *s)
  +PIO_puts(theINTERP, PMC *pmc, const char *s)
   {
  -    if (io) {
  -        ParrotIOLayer *l = io->stack;
  +    ParrotIOLayer *l = pmc->cache.struct_val;
  +
           while (l) {
               if (l->api->PutS) {
  +            ParrotIO *io = PMC_data(pmc);
                   return (*l->api->PutS) (interpreter, l, io, s);
               }
               l = PIO_DOWNLAYER(l);
           }
  -    }
   
       return -1;
   }
   
   INTVAL
  -PIO_putps(theINTERP, ParrotIO *io, STRING *s) {
  +PIO_putps(theINTERP, PMC *pmc, STRING *s) 
  +{
       INTVAL retVal;
  +
       char *temp = string_to_cstring(interpreter, s);
  -    retVal = PIO_puts(interpreter, io, temp);
  +    retVal = PIO_puts(interpreter, pmc, temp);
       free(temp);
       return retVal;
   }
   
   INTVAL
  -PIO_fprintf(theINTERP, ParrotIO *io, const char *s, ...) {
  +PIO_fprintf(theINTERP, PMC *pmc, const char *s, ...)
  +{
       va_list args;
       INTVAL ret=-1;
   
       va_start(args, s);
   
  -    ret=PIO_putps(interpreter, io, Parrot_vsprintf_c(interpreter, s, args));
  +    ret=PIO_putps(interpreter, pmc, Parrot_vsprintf_c(interpreter, s, args));
   
       va_end(args);
   
  @@ -698,7 +717,8 @@
       str=Parrot_vsprintf_c(interpreter, s, args);
   
       if(interpreter) {
  -        ret=PIO_putps(interpreter, PIO_STDOUT(interpreter), str);
  +        ret=PIO_putps(interpreter, 
  +                      new_io_pmc(interpreter, PIO_STDOUT(interpreter)), str);
       }
       else {
           /* Be nice about this...
  @@ -725,7 +745,8 @@
       if(interpreter) {
           str=Parrot_vsprintf_c(interpreter, s, args);
   
  -        ret=PIO_putps(interpreter, PIO_STDERR(interpreter), str);
  +        ret=PIO_putps(interpreter, 
  +                      new_io_pmc(interpreter, PIO_STDERR(interpreter)), str);
       }
       else {
           /* Be nice about this...
  @@ -740,9 +761,11 @@
   }
   
   INTVAL
  -PIO_getfd(theINTERP, ParrotIO *io)
  +PIO_getfd(theINTERP, PMC *pmc)
   {
       INTVAL i;
  +    ParrotIO *io = PMC_data(pmc);
  +
       ParrotIOTable table = ((ParrotIOData*)interpreter->piodata)->table;
   
       for(i = 0; i < PIO_NR_OPEN; i++) {
  
  
  
  1.25      +7 -6      parrot/io/io_unix.c
  
  Index: io_unix.c
  ===================================================================
  RCS file: /cvs/public/parrot/io/io_unix.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -w -r1.24 -r1.25
  --- io_unix.c 24 Mar 2003 07:29:01 -0000      1.24
  +++ io_unix.c 1 Jul 2003 15:41:06 -0000       1.25
  @@ -1,7 +1,7 @@
   /* io_unix.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *      $Id: io_unix.c,v 1.24 2003/03/24 07:29:01 leo Exp $
  + *      $Id: io_unix.c,v 1.25 2003/07/01 15:41:06 dan Exp $
    *  Overview:
    *      This is the Parrot IO UNIX layer. May be changed to
    *      include other platforms if that platform is similar
  @@ -89,13 +89,14 @@
       ParrotIOData *d = GET_INTERP_IOD(interpreter);
       if (d != NULL && d->table != NULL) {
           if ((PIO_STDIN(interpreter) =
  -             PIO_unix_fdopen(interpreter, layer, STDIN_FILENO, PIO_F_READ))
  +             PIO_unix_fdopen(interpreter, layer, STDIN_FILENO, 
  +                             PIO_F_READ | PIO_F_SHARED))
               && (PIO_STDOUT(interpreter) =
                   PIO_unix_fdopen(interpreter, layer, STDOUT_FILENO,
  -                                PIO_F_WRITE))
  +                                PIO_F_WRITE | PIO_F_SHARED))
               && (PIO_STDERR(interpreter) =
                   PIO_unix_fdopen(interpreter, layer, STDERR_FILENO,
  -                                PIO_F_WRITE))
  +                                PIO_F_WRITE | PIO_F_SHARED))
               )
               return 0;
       }
  @@ -178,7 +179,7 @@
            */
           if (PIO_unix_isatty(fd))
               flags |= PIO_F_CONSOLE;
  -        io = PIO_new(interpreter, NULL, type, flags, mode);
  +        io = PIO_new(interpreter, type, flags, mode);
           io->fd = fd;
           return io;
       }
  @@ -215,7 +216,7 @@
   
       if (PIO_unix_isatty(fd))
           flags |= PIO_F_CONSOLE;
  -    io = PIO_new(interpreter, NULL, PIO_F_FILE, flags, mode);
  +    io = PIO_new(interpreter, PIO_F_FILE, flags, mode);
       io->fd = fd;
       return io;
   }
  
  
  

Reply via email to