On Sunday 29 April 2007 11:18:20 Joshua Isom wrote:
> I've done realclean a few times actually. If I run with r18322, it
> runs just fine, but r18323, which dealt with zero length mallocs for
> strings, caused it to start crashing. Here's a backtrace. This is one
> of those tests where with -G it succeeds, so you'll have to make sure
> that gc is enabled. I'm not having any trouble on my darwin/ppc
> machine, but my only two running platforms are darwin/ppc and
> freebsd/amd64.
Here's a patch that fixes a related bug in Tcl on certain platforms. How does
it fare for you?
-- c
=== src/string.c
==================================================================
--- src/string.c (revision 3342)
+++ src/string.c (local)
@@ -399,24 +399,22 @@
*/
STRING *
-string_append(Interp *interp,
- STRING *a, STRING *b)
+string_append(Interp *interp, STRING *a, STRING *b)
{
- UINTVAL a_capacity, b_len;
- UINTVAL total_length;
- CHARSET *cs;
+ UINTVAL a_capacity, b_len;
+ UINTVAL total_length;
+ CHARSET *cs;
ENCODING *enc;
/* XXX should this be a CHARSET method? */
/* If B isn't real, we just bail */
b_len = string_length(interp, b);
- if (!b_len) {
+ if (!b_len)
return a;
- }
- /* Is A real? */
- if (a == NULL)
+ /* Is A real and non-empty? */
+ if (a == NULL || PObj_bufstart(a) == NULL)
return string_copy(interp, b);
saneify_string(a);
@@ -424,9 +422,8 @@
/* If the destination's constant, or external then just fall back to
string_concat */
- if (PObj_is_cowed_TESTALL(a)) {
+ if (PObj_is_cowed_TESTALL(a))
return string_concat(interp, a, b, 0);
- }
cs = string_rep_compatible(interp, a, b, &enc);
if (cs != NULL) {
@@ -444,10 +441,9 @@
if (b->encoding == Parrot_utf16_encoding_ptr)
a->encoding = Parrot_utf16_encoding_ptr;
}
- /*
- * calc usable and total bytes
- */
- a_capacity = string_capacity(interp, a);
+
+ /* calc usable and total bytes */
+ a_capacity = string_capacity(interp, a);
total_length = a->bufused + b->bufused;
/* make sure A's big enough for both */
@@ -463,8 +459,9 @@
b->strstart, b->bufused);
a->bufused += b->bufused;
- a->strlen += b_len;
- a->hashval = 0;
+ a->strlen += b_len;
+ a->hashval = 0;
+
return a;
}