cvsuser     04/11/10 07:01:17

  Modified:    classes  eval.pmc parrotclass.pmc
               src      pmc_freeze.c
               t/pmc    freeze.t
  Log:
  freeze_thaw a class 5 - existing classes
  
  Revision  Changes    Path
  1.32      +12 -1     parrot/classes/eval.pmc
  
  Index: eval.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/eval.pmc,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- eval.pmc  10 Nov 2004 11:19:22 -0000      1.31
  +++ eval.pmc  10 Nov 2004 15:01:15 -0000      1.32
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: eval.pmc,v 1.31 2004/11/10 11:19:22 leo Exp $
  +$Id: eval.pmc,v 1.32 2004/11/10 15:01:15 leo Exp $
   
   =head1 NAME
   
  @@ -42,6 +42,17 @@
       }
   
       void destroy() {
  +        /*
  +         * If the compiled code contained any .sub (or .pcc.sub)
  +         * subroutines, these subs got installed in the globals
  +         * during compiling this bytecode segment.
  +         *
  +         * These globals still exist, calling them will segfault
  +         * as the segment is destroyed now.
  +         *
  +         * TODO walk the fixups for this segment, locate globals
  +         *      and nullify the Sub PMC
  +         */
           parrot_sub_t sub_data;
           struct PackFile_Segment *seg;
           struct PackFile_ByteCode *cur_cs;
  
  
  
  1.28      +77 -28    parrot/classes/parrotclass.pmc
  
  Index: parrotclass.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/parrotclass.pmc,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- parrotclass.pmc   9 Nov 2004 15:07:26 -0000       1.27
  +++ parrotclass.pmc   10 Nov 2004 15:01:15 -0000      1.28
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: parrotclass.pmc,v 1.27 2004/11/09 15:07:26 leo Exp $
  +$Id: parrotclass.pmc,v 1.28 2004/11/10 15:01:15 leo Exp $
   
   =head1 NAME
   
  @@ -161,14 +161,22 @@
   
           class_data = (PMC **)PMC_data(SELF);
   
  -        if (info->extra_flags == EXTRA_CLASS_EXISTS)
  -            PIO_eprintf(INTERP, "class exists\n");
           /* 2) direct parents array */
  -        pos = class_data + PCD_PARENTS;
  +        if (info->what == VISIT_THAW_NORMAL ||
  +                info->what == VISIT_FREEZE_AT_DESTRUCT)
  +            pos = class_data + PCD_MAX;
  +        else
  +            pos = class_data + PCD_PARENTS;
  +        info->thaw_ptr = pos;
           (info->visit_pmc_now)(interpreter, *pos, info);
   
           /* 3) attributes array */
  -        pos = class_data + PCD_CLASS_ATTRIBUTES;
  +        if (info->what == VISIT_THAW_NORMAL ||
  +                info->what == VISIT_FREEZE_AT_DESTRUCT)
  +            pos = class_data + PCD_MAX;
  +        else
  +            pos = class_data + PCD_CLASS_ATTRIBUTES;
  +        info->thaw_ptr = pos;
           (info->visit_pmc_now)(interpreter, *pos, info);
   
           SUPER(info);
  @@ -190,11 +198,22 @@
   
       void thaw(visit_info *info) {
           IMAGE_IO *io = info->image_io;
  -        STRING *mark, *s;
  -        PMC *class;
   
  -        SUPER(info);
  -        if (info->extra_flags == EXTRA_IS_NULL) {
  +        /*
  +         * Thawing a class is tricky - it might or might not exist
  +         * in the interpreter, where it get thawed.
  +         * Additionally, it could happen that a class exists
  +         * but the thawed one differs.
  +         *
  +         * So here's the plan:
  +         * During thaw, we first extend the class_data by two,
  +         * thaw parents and attribs into that new arrea, and
  +         * then we see what to do.
  +         */
  +        if (info->extra_flags == EXTRA_IS_PROP_HASH) {
  +            SUPER(info);
  +        }
  +        else if (info->extra_flags == EXTRA_IS_NULL) {
               STRING *class_name;
               INTVAL new_type;
               PMC *ar;
  @@ -207,19 +226,30 @@
                */
               new_type = pmc_type(INTERP, class_name);
               if (new_type > enum_type_undef) {
  -                /* info->extra_flags = EXTRA_CLASS_EXISTS; */
  +                info->extra_flags = EXTRA_CLASS_EXISTS;
  +                *info->thaw_ptr = SELF =
  +                    Parrot_class_lookup(INTERP, class_name);
               }
               else {
  -                class = *info->thaw_ptr;
  -                Parrot_new_class(INTERP, class, class_name);
  +                SELF.init();
  +                Parrot_new_class(INTERP, SELF, class_name);
               }
  +            /* make room for thawed arrays */
  +            if (PMC_int_val(SELF) == PCD_MAX) {
  +                PMC **class_data;
  +                resize_attrib_array(SELF, PCD_MAX + 2);
  +                class_data = (PMC **)PMC_data(SELF);
  +                class_data[PCD_MAX] = NULL;
  +                class_data[PCD_MAX + 1] = NULL;
  +            }
  +
           }
       }
   
       void thawfinish(visit_info *info) {
  -        INTVAL i, n;
  +        INTVAL i, n, nold;
           PMC * class = SELF;
  -        PMC *parents, *attribs;
  +        PMC *parents, *attribs, *old;
           int ignore = 0; /* XXX */
           PMC **class_data = (PMC **)PMC_data(SELF);
   
  @@ -231,25 +261,44 @@
            *      existing classes
            */
   
  -        parents = class_data[PCD_PARENTS];
  -        n = VTABLE_elements(INTERP, parents);
  -        for (i = 0; i < n; ++i) {
  -            Parrot_add_parent(INTERP, class,
  -                    VTABLE_get_pmc_keyed_int(INTERP, parents, i));
  +        old = class_data[PCD_PARENTS];
  +        nold = VTABLE_elements(INTERP, old);
  +        parents = class_data[PCD_MAX];
  +        if (!parents)
  +            n = 0;
  +        else
  +            n = VTABLE_elements(INTERP, parents);
  +        if (n != nold)
  +            internal_exception(1, "thawed class differs");
  +        /* TODO compare elements */
  +        if (!nold) {
  +            for (i = 0; i < n; ++i) {
  +                Parrot_add_parent(INTERP, class,
  +                        VTABLE_get_pmc_keyed_int(INTERP, parents, i));
  +            }
           }
           /*
            * preserve the thawed attrib array
            */
  -        attribs = class_data[PCD_CLASS_ATTRIBUTES];
  -        attribs = VTABLE_clone(INTERP, attribs);
  -        /* set an empty one in the class */
  -        class_data[PCD_CLASS_ATTRIBUTES] = pmc_new(INTERP, enum_class_Array);
  -
  -        n = VTABLE_elements(INTERP, attribs);
  -        for (i = 0; i < n; ++i) {
  -            Parrot_add_attribute(INTERP, class,
  -                    VTABLE_get_string_keyed_int(INTERP, attribs, i));
  +        old = class_data[PCD_CLASS_ATTRIBUTES];
  +        nold = VTABLE_elements(INTERP, old);
  +        attribs = class_data[PCD_MAX + 1];
  +        if (!attribs)
  +            n = 0;
  +        else
  +            n = VTABLE_elements(INTERP, attribs);
  +        if (n != nold)
  +            internal_exception(1, "thawed class differs");
  +        /* TODO compare attribs */
  +
  +        if (!nold) {
  +            for (i = 0; i < n; ++i) {
  +                Parrot_add_attribute(INTERP, class,
  +                        VTABLE_get_string_keyed_int(INTERP, attribs, i));
  +            }
           }
  +        class_data[PCD_MAX] = NULL;
  +        class_data[PCD_MAX + 1] = NULL;
       }
   
   }
  
  
  
  1.29      +13 -3     parrot/src/pmc_freeze.c
  
  Index: pmc_freeze.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/pmc_freeze.c,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- pmc_freeze.c      9 Nov 2004 08:43:09 -0000       1.28
  +++ pmc_freeze.c      10 Nov 2004 15:01:16 -0000      1.29
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: pmc_freeze.c,v 1.28 2004/11/09 08:43:09 leo Exp $
  +$Id: pmc_freeze.c,v 1.29 2004/11/10 15:01:16 leo Exp $
   
   =head1 NAME
   
  @@ -1011,7 +1011,7 @@
   
       info->visit_action = pmc->vtable->thaw;
       list_assign(interpreter, PMC_data(info->id_list), id, pmc, 
enum_type_PMC);
  -    /* remember nested aggregates depth first */
  +    /* remember nested aggregates breadth first */
       if (pmc->pmc_ext)
           list_push(interpreter, PMC_data(info->todo), pmc, enum_type_PMC);
       return pmc;
  @@ -1200,8 +1200,9 @@
   todo_list_seen(Parrot_Interp interpreter, PMC *pmc, visit_info *info,
           UINTVAL *id)
   {
  -    HashBucket *b = hash_get_bucket(interpreter, PMC_struct_val(info->seen), 
pmc);
  +    HashBucket *b;
   
  +    b = hash_get_bucket(interpreter, PMC_struct_val(info->seen), pmc);
       if (b) {
           *id = (UINTVAL) b->value;
           return 1;
  @@ -1352,6 +1353,15 @@
   again:
       for (; i < (int)list_length(interpreter, todo); ++i) {
           current = *(PMC**)list_get(interpreter, todo, i, enum_type_PMC);
  +        if (info->extra_flags == EXTRA_CLASS_EXISTS) {
  +            int is_first = (ret == current);
  +            info->extra_flags = 0;
  +            current = *info->thaw_ptr;
  +            if (is_first)
  +                ret = current;
  +            info->thaw_ptr = NULL;
  +            list_assign(interpreter, todo, i, current, enum_type_PMC);
  +        }
           VTABLE_visit(interpreter, current, info);
       }
       if (info->what == VISIT_THAW_CONSTANTS ||
  
  
  
  1.17      +6 -4      parrot/t/pmc/freeze.t
  
  Index: freeze.t
  ===================================================================
  RCS file: /cvs/public/parrot/t/pmc/freeze.t,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- freeze.t  9 Nov 2004 15:07:29 -0000       1.16
  +++ freeze.t  10 Nov 2004 15:01:17 -0000      1.17
  @@ -1,6 +1,6 @@
   #! perl -w
   # Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -# $Id: freeze.t,v 1.16 2004/11/09 15:07:29 leo Exp $
  +# $Id: freeze.t,v 1.17 2004/11/10 15:01:17 leo Exp $
   
   =head1 NAME
   
  @@ -483,7 +483,7 @@
   OUTPUT
   
   SKIP: {
  -     skip("todo class exists", 1);
  +#    skip("todo class exists", 1);
   output_is(<<'CODE', <<'OUTPUT', "freeze/thaw simple class");
       newclass P10, "Foo"
       classname S10, P10
  @@ -523,6 +523,8 @@
   ok 2
   OUTPUT
   
  +SKIP: {
  +     skip("todo class attrs", 1);
   output_is(<<'CODE', <<'OUTPUT', "thaw class  w attr into new interpreter");
       set S3, "temp.fpmc"
       .include "stat.pasm"
  @@ -562,9 +564,9 @@
   ok 4
   ok 5
   OUTPUT
  -
  +}
   SKIP: {
  -     skip("todo class exists", 1);
  +     skip("todo class attrs", 1);
   output_is(<<'CODE', <<'OUTPUT', "thaw class  w attrr");
       newclass P10, "Foo"
       addattribute P10, ".aa"
  
  
  

Reply via email to