cvsuser     02/11/06 00:52:07

  Modified:    .        core.ops dod.c headers.c res_lea.c spf_render.c
                        string.c
  Log:
  string_set is back for a faster live
  
  Revision  Changes    Path
  1.225     +1 -1      parrot/core.ops
  
  Index: core.ops
  ===================================================================
  RCS file: /cvs/public/parrot/core.ops,v
  retrieving revision 1.224
  retrieving revision 1.225
  diff -u -w -r1.224 -r1.225
  --- core.ops  6 Nov 2002 05:02:46 -0000       1.224
  +++ core.ops  6 Nov 2002 08:52:07 -0000       1.225
  @@ -213,7 +213,7 @@
   inline op chr (out STR, in INT) {
     STRING *s;
     s = string_make(interpreter, &$1, (UINTVAL)1, NULL, 0, NULL);
  -  *(char *)s->bufstart = $2;
  +  *(char *)s->strstart = $2;
     s->strlen = 1;
     $1 = s;
     goto NEXT();
  
  
  
  1.32      +26 -20    parrot/dod.c
  
  Index: dod.c
  ===================================================================
  RCS file: /cvs/public/parrot/dod.c,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -w -r1.31 -r1.32
  --- dod.c     6 Nov 2002 05:02:46 -0000       1.31
  +++ dod.c     6 Nov 2002 08:52:07 -0000       1.32
  @@ -1,7 +1,7 @@
   /* dod.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: dod.c,v 1.31 2002/11/06 05:02:46 sfink Exp $
  + *     $Id: dod.c,v 1.32 2002/11/06 08:52:07 leo Exp $
    *  Overview:
    *     Handles dead object destruction of the various headers
    *  Data Structure and Algorithms:
  @@ -337,23 +337,24 @@
               NULL != cur_arena; cur_arena = cur_arena->prev) {
           b = cur_arena->start_objects;
           for (i = 0; i < cur_arena->used; i++) {
  +            if (!(b->flags & BUFFER_on_free_list_FLAG)) {
               if (cleanup) {
                   /* clear COWed external FLAG */
                   b->flags &= ~(UINTVAL)BUFFER_external_FLAG;
                   /* the real external flag */
                   if (b->flags & BUFFER_bufstart_external_FLAG)
                       b->flags |= BUFFER_external_FLAG;
  -                /* if cleanup, i.e. Parrot_destroy, constants are dead too */
  +                    /* if cleanup (Parrot_destroy) constants are dead too */
                   b->flags &=
                           ~(UINTVAL)(BUFFER_constant_FLAG | BUFFER_live_FLAG);
               }
   
               if ((b->flags & BUFFER_strstart_FLAG) && b->bufstart &&
  -                    !(b->flags & (BUFFER_external_FLAG
  -                                    | BUFFER_on_free_list_FLAG))) {
  -                refcount = &((int *)b->bufstart)[-1];
  +                        !(b->flags & BUFFER_external_FLAG)) {
  +                    refcount = ((int *)b->bufstart);
                   *refcount = 0;
               }
  +            }
               b = (Buffer *)((char *)b + object_size);
           }
       }
  @@ -374,10 +375,11 @@
               NULL != cur_arena; cur_arena = cur_arena->prev) {
           b = cur_arena->start_objects;
           for (i = 0; i < cur_arena->used; i++) {
  -            if (b->bufstart && (b->flags & BUFFER_strstart_FLAG) &&
  -                    !(b->flags & (BUFFER_external_FLAG
  -                                    | BUFFER_on_free_list_FLAG))) {
  -                refcount = &((int *)b->bufstart)[-1];
  +            if (!(b->flags & BUFFER_on_free_list_FLAG) &&
  +                    (b->flags & BUFFER_strstart_FLAG) &&
  +                    b->bufstart &&
  +                    !(b->flags & (BUFFER_external_FLAG))) {
  +                refcount = ((int *)b->bufstart);
                   /* mark users of this bufstart by incrementing refcount */
                   if (b->flags & BUFFER_live_FLAG)
                       *refcount = 1 << 29;        /* ~infinite usage */
  @@ -403,7 +405,6 @@
   
   #ifdef GC_IS_MALLOC
       if (!cleanup) {
  -        clear_cow(interpreter, pool, 0);
           used_cow(interpreter, pool, 0);
       }
   #endif /* GC_IS_MALLOC */
  @@ -447,6 +448,11 @@
               b = (Buffer *)((char *)b + object_size);
           }
       }
  +#ifdef GC_IS_MALLOC
  +    if (!cleanup) {
  +        clear_cow(interpreter, pool, 0);
  +    }
  +#endif /* GC_IS_MALLOC */
       interpreter->active_Buffers += total_used;
       pool->num_free_objects = pool->total_objects - total_used;
   }
  
  
  
  1.19      +2 -2      parrot/headers.c
  
  Index: headers.c
  ===================================================================
  RCS file: /cvs/public/parrot/headers.c,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -w -r1.18 -r1.19
  --- headers.c 3 Nov 2002 21:15:11 -0000       1.18
  +++ headers.c 6 Nov 2002 08:52:07 -0000       1.19
  @@ -1,7 +1,7 @@
   /* headers.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: headers.c,v 1.18 2002/11/03 21:15:11 leo Exp $
  + *     $Id: headers.c,v 1.19 2002/11/06 08:52:07 leo Exp $
    *  Overview:
    *     Header management functions. Handles getting of various headers,
    *     and pool creation
  @@ -94,7 +94,7 @@
                   (BUFFER_external_FLAG | BUFFER_on_free_list_FLAG)))
       {
           if (buffer->flags & BUFFER_strstart_FLAG) {
  -            int *refcount = &((int *)buffer->bufstart)[-1];
  +            int *refcount = ((int *)buffer->bufstart);
   
               if (!--(*refcount))
                   free(refcount); /* the actual bufstart */
  
  
  
  1.5       +6 -4      parrot/res_lea.c
  
  Index: res_lea.c
  ===================================================================
  RCS file: /cvs/public/parrot/res_lea.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- res_lea.c 3 Nov 2002 21:15:11 -0000       1.4
  +++ res_lea.c 6 Nov 2002 08:52:07 -0000       1.5
  @@ -54,12 +54,13 @@
           /* COWable objects (i.e. strings) use an int at bufstart
            * for refcounting in DOD */
           size = ((size + pad + sizeof(int)) & ~pad);
  -        p = realloc((char *)str->bufstart - sizeof(int), size);
  -        str->strstart = str->bufstart = (char *)p + sizeof(int);
  +        p = realloc((char *)str->bufstart, size);
  +        str->strstart = (char *)p + sizeof(int);
  +        str->bufstart = p;
           /* usable size at bufstart */
           str->buflen = size - sizeof(int);
       }
  -    return str->bufstart;
  +    return str->strstart;
   }
   
   void *
  @@ -75,7 +76,8 @@
           size = ((size + pad + sizeof(int)) & ~pad);
           p = calloc(1, size);
           *(int*)p = 0;
  -        str->strstart = str->bufstart = (char *)p + sizeof(int);
  +        str->strstart = (char *)p + sizeof(int);
  +        str->bufstart = p;
           str->buflen = size - sizeof(int);
       }
       return str;
  
  
  
  1.11      +2 -2      parrot/spf_render.c
  
  Index: spf_render.c
  ===================================================================
  RCS file: /cvs/public/parrot/spf_render.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- spf_render.c      3 Nov 2002 21:15:11 -0000       1.10
  +++ spf_render.c      6 Nov 2002 08:52:07 -0000       1.11
  @@ -1,7 +1,7 @@
   /* spf_render.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: spf_render.c,v 1.10 2002/11/03 21:15:11 leo Exp $
  + *     $Id: spf_render.c,v 1.11 2002/11/06 08:52:07 leo Exp $
    *  Overview:
    *     Implements the main function that drives the Parrot_sprintf
    *     family and its utility functions.
  @@ -145,7 +145,7 @@
               /* signed and zero padded */
               if (info->flags & FLAG_ZERO
                   && (string_ord(str,0) == '-' || string_ord(str,0) == '+')) {
  -                STRING *temp;
  +                STRING *temp = 0;
                   string_substr(interpreter, str, 1, len-1, &temp);
                   string_chopn(str, -1);
                   string_append(interpreter, str, fill, 0);
  
  
  
  1.109     +37 -5     parrot/string.c
  
  Index: string.c
  ===================================================================
  RCS file: /cvs/public/parrot/string.c,v
  retrieving revision 1.108
  retrieving revision 1.109
  diff -u -w -r1.108 -r1.109
  --- string.c  6 Nov 2002 05:02:46 -0000       1.108
  +++ string.c  6 Nov 2002 08:52:07 -0000       1.109
  @@ -1,12 +1,21 @@
   /* string.c
    *  Copyright: (When this is determined...it will go here)
    *  CVS Info
  - *     $Id: string.c,v 1.108 2002/11/06 05:02:46 sfink Exp $
  + *     $Id: string.c,v 1.109 2002/11/06 08:52:07 leo Exp $
    *  Overview:
    *     This is the api definitions for the string subsystem
    *  Data Structure and Algorithms:
    *  History:
    *  Notes:
  + *
  + *  ********************************************************
  + *  bufstart and buflen are used by the memory subsystem
  + *  The string functions may only use buflen to determine,
  + *  if there is some space left beyond bufused. This is the
  + *  *only* valid usage of these two data members, beside
  + *  setting bufstart/buflen for external strings.
  + *  ********************************************************
  + *
    *  References:
    */
   
  @@ -49,7 +58,7 @@
            * independant of the original COW data */
           s->flags &= ~BUFFER_constant_FLAG;
           Parrot_allocate_string(interpreter, s, size);
  -        mem_sys_memcopy(s->bufstart, p, size);
  +        mem_sys_memcopy(s->strstart, p, size);
           s->flags &= ~(UINTVAL)(BUFFER_COW_FLAG | BUFFER_external_FLAG |
                   BUFFER_bufstart_external_FLAG);
           if (interpreter) {
  @@ -95,7 +104,8 @@
   }
   
   static void
  -make_COW_reference_from_header(struct Parrot_Interp *interpreter, STRING *s, STRING 
*d) {
  +make_COW_reference_from_header(struct Parrot_Interp *interpreter,
  +        STRING *s, STRING *d) {
       if (s->flags & BUFFER_constant_FLAG) {
           s->flags |= BUFFER_COW_FLAG|BUFFER_external_FLAG;
           copy_string_header(interpreter, d, s);
  @@ -107,6 +117,28 @@
       }
   }
   
  +/*for api string string_set
  + * set the contents of dest to the contents of src
  + */
  +STRING *
  +string_set(struct Parrot_Interp *interpreter, STRING *dest, STRING *src)
  +{
  +    if (dest && dest != src) {
  +        /* they are different, dest is not an external string */
  +#ifdef GC_IS_MALLOC
  +        if (!(dest->flags &
  +                    (BUFFER_external_FLAG |
  +                     BUFFER_bufstart_external_FLAG |
  +                     BUFFER_COW_FLAG)) && dest->bufstart) {
  +            mem_sys_free(dest->bufstart);
  +        }
  +#endif
  +        make_COW_reference_from_header(interpreter, src, dest);
  +    }
  +    else
  +        dest = make_COW_reference(interpreter, src);
  +    return dest;
  +}
   
   
   /* Basic string stuff - creation, enlargement, etc. */
  @@ -602,9 +634,9 @@
       }
   
       /* do in-place i.e. make a COW string */
  -    dest = make_COW_reference(interpreter,  src);
  +    dest = string_set(interpreter, *d, src);
       if (src->encoding->index == enum_encoding_singlebyte) {
  -        dest->strstart = (char *)dest->bufstart + true_offset;
  +        dest->strstart = (char *)dest->strstart + true_offset;
           dest->bufused = true_length;
       }
       else {
  
  
  


Reply via email to