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 {