cvsuser     03/11/19 07:44:06

  Added:       include/parrot pmc_freeze.h
               t/pmc    freeze.t
  Log:
  First draft of freeze -- Leo's base code
  
  Revision  Changes    Path
  1.1                  parrot/include/parrot/pmc_freeze.h
  
  Index: pmc_freeze.h
  ===================================================================
  /* pmc_freeze.h
   *  Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
   *  CVS Info
   *     $Id: pmc_freeze.h,v 1.1 2003/11/19 15:44:04 dan Exp $
   *  Overview:
   *     PMC freeze and thaw interface
   *  Data Structure and Algorithms:
   *  History:
   *  Notes:
   *  References:
   */
  
  #if !defined(PARROT_PMC_FREEZE_H_GUARD)
  #define      PARROT_PMC_FREEZE_H_GUARD
  
  struct _visit_info;
  typedef void (*visit_child_f)(Parrot_Interp, PMC*, struct _visit_info*);
  typedef void (*visit_f)(Parrot_Interp, PMC*, struct _visit_info*);
  
  typedef enum {
      VISIT_FREEZE_NORMAL,
      VISIT_FREEZE_AT_DESTRUCT,
      VISIT_FREEZE_SIZE,
      VISIT_THAW_NORMAL,
      VISIT_THAW_CONSTANTS,
      VISIT_CLONE,
      VISIT_DESTRUCTION_ORDER
  } visit_enum_type;
  
  struct _image_io;
  #define IMAGE_IO struct _image_io
  typedef void    (*push_integer_f)       (Parrot_Interp, IMAGE_IO*, INTVAL);
  typedef void    (*push_pmc_f)           (Parrot_Interp, IMAGE_IO*, PMC*);
  typedef INTVAL  (*shift_integer_f)      (Parrot_Interp, IMAGE_IO*);
  typedef PMC*    (*shift_pmc_f)          (Parrot_Interp, IMAGE_IO*);
  
  typedef struct _image_funcs {
      push_integer_f      push_integer;
      push_pmc_f          push_pmc;
      shift_integer_f     shift_integer;
      shift_pmc_f         shift_pmc;
  } image_funcs;
  
  typedef struct _image_io {
      STRING *image;
      image_funcs *vtable;
  } image_io;
  
  typedef struct _visit_info {
      visit_child_f       visit_child_function;
      visit_f             visit_function; /* freeze, thaw ... */
      visit_enum_type     what;
      STRING*             image;
      PMC*                mark_ptr;
      PMC**               thaw_ptr;       /* where to thaw aa new PMC */
      INTVAL              last_type;
      PMC*                seen;           /* seen hash */
      PMC*                todo;           /* todo list */
      PMC*                id_list;        /* used by thaw */
      UINTVAL             id;             /* freze ID of PMC */
      IMAGE_IO            *image_io;
  } visit_info;
  
  /*
   * public interfaces
   */
  STRING* Parrot_freeze(Parrot_Interp, PMC*);
  STRING* Parrot_freeze_at_destruct(Parrot_Interp, PMC*);
  
  PMC*    Parrot_thaw(Parrot_Interp, STRING*);
  PMC*    Parrot_thaw_constants(Parrot_Interp, STRING*);
  
  PMC*    Parrot_clone(Parrot_Interp, PMC*);
  
  #endif
  
  /*
   * Local variables:
   * c-indentation-style: bsd
   * c-basic-offset: 4
   * indent-tabs-mode: nil
   * End:
   *
   * vim: expandtab shiftwidth=4:
  */
  
  
  
  1.1                  parrot/t/pmc/freeze.t
  
  Index: freeze.t
  ===================================================================
  #! perl -w
  
  use Parrot::Test tests => 5;
  use Test::More;
  
  output_like(<<'CODE', <<'OUTPUT', "freeze/thaw a PerlInt");
      new P1, .PerlInt
      set P1, 777
      freeze S0, P1
      print S0
      print ":\n"
  
      thaw P10, S0
      typeof S10, P10
      print S10
      print " "
      print P10
      print "\n"
      end
  CODE
  /0x[0-9a-f]+ \d+ 777 :
  PerlInt 777
  /
  OUTPUT
  
  output_is(<<'CODE', <<'OUTPUT', "freeze/thaw a PerlArray");
      new P0, .PerlArray
      new P1, .PerlInt
      set P1, 666
      push P0, P1
      new P1, .PerlInt
      set P1, 777
      push P0, P1
      freeze S0, P0
  
      thaw P10, S0
      typeof S10, P10   # type
      print S10
      print " "
      set I11, P10      # elements
      print I11
      print "\n"
      set P12, P10[0]
      print P12
      print "\n"
      set P12, P10[1]
      print P12
      print "\n"
      end
  CODE
  PerlArray 2
  666
  777
  OUTPUT
  
  output_like(<<'CODE', <<'OUTPUT', "freeze PerlArray self-ref");
      new P0, .PerlArray
      new P1, .PerlInt
      set P1, 666
      push P0, P1
      push P0, P0
      freeze S0, P0
      print S0
      print ":\n"
      end
  CODE
  /(0x[0-9a-f]*)[048c] \d+ 2 0x[0-9a-f]+ \d+ 666 \1[159d] :
  /
  OUTPUT
  
  output_is(<<'CODE', <<'OUTPUT', "freeze/thaw PerlArray self-ref");
      new P1, .PerlInt
      set P1, 666
      new P0, .PerlArray
      push P0, P1
      new P1, .PerlInt
      set P1, 777
      push P0, P1
      push P0, P0
      freeze S0, P0
  
      thaw P10, S0
      typeof S10, P10
      print S10
      print " "
      set I11, P10
      print I11
      print "\n"
      set P12, P10[0]
      print P12
      print "\n"
      set P12, P10[1]
      print P12
      print "\n"
      set P12, P10[2]
      set P13, P12[0]
      print P13
      print "\n"
      end
  CODE
  PerlArray 3
  666
  777
  666
  OUTPUT
  
  output_is(<<'CODE', <<'OUTPUT', "freeze/thaw PerlArray self-ref, contained Arrray");
      new P1, .PerlInt
      set P1, 666
      new P0, .PerlArray
      push P0, P1
      new P1, .PerlInt
      set P1, 777
      push P0, P1
  
      new P2, .PerlArray
      new P4, .PerlInt
      set P4, 4
      push P2, P4
      push P2, P0
  
      push P0, P2
      push P0, P1
      freeze S0, P0
  
      thaw P10, S0
      typeof S10, P10
      print S10
      print " "
      set I11, P10
      print I11
      print "\n"
      set P12, P10[0]
      print P12
      print "\n"
      set P12, P10[1]
      print P12
      print "\n"
      set P12, P10[2]
      set P13, P12[0]
      print P13
      print "\n"
      set P13, P12[1]
      set P14, P13[0]
      print P14
      print "\n"
      set P12, P10[3]
      print P12
      print "\n"
      end
  CODE
  PerlArray 4
  666
  777
  4
  666
  777
  OUTPUT
  
  
  

Reply via email to