Fix set-string-nth GC issue

db4
Slava Pestov 2008-02-01 16:26:11 -06:00
parent 8dd333cbb5
commit cef80543ad
1 changed files with 25 additions and 3 deletions

View File

@ -431,23 +431,30 @@ CELL string_nth(F_STRING* string, CELL index)
}
}
/* allocates memory */
void set_string_nth(F_STRING* string, CELL index, CELL value)
{
bput(SREF(string,index),value & 0xff);
F_BYTE_ARRAY *aux;
if(string->aux == F)
{
if(value <= 0xff)
return;
else
{
string->aux = tag_object(allot_byte_array(
REGISTER_UNTAGGED(string);
aux = allot_byte_array(
untag_fixnum_fast(string->length)
* sizeof(u16)));
* sizeof(u16));
UNREGISTER_UNTAGGED(string);
string->aux = tag_object(aux);
}
}
else
aux = untag_object(string->aux);
F_BYTE_ARRAY *aux = untag_object(string->aux);
cput(BREF(aux,index * sizeof(u16)),value >> 8);
}
@ -463,10 +470,13 @@ F_STRING* allot_string_internal(CELL capacity)
string->length = tag_fixnum(capacity);
string->hashcode = F;
string->aux = F;
set_string_nth(string,capacity,0);
return string;
}
/* allocates memory */
void fill_string(F_STRING *string, CELL start, CELL capacity, CELL fill)
{
if(fill == 0)
@ -476,7 +486,11 @@ void fill_string(F_STRING *string, CELL start, CELL capacity, CELL fill)
CELL i;
for(i = start; i < capacity; i++)
{
REGISTER_UNTAGGED(string);
set_string_nth(string,i,fill);
UNREGISTER_UNTAGGED(string);
}
}
}
@ -484,7 +498,9 @@ void fill_string(F_STRING *string, CELL start, CELL capacity, CELL fill)
F_STRING *allot_string(CELL capacity, CELL fill)
{
F_STRING* string = allot_string_internal(capacity);
REGISTER_UNTAGGED(string);
fill_string(string,0,capacity,fill);
UNREGISTER_UNTAGGED(string);
return string;
}
@ -506,7 +522,10 @@ F_STRING* reallot_string(F_STRING* string, CELL capacity, CELL fill)
UNREGISTER_UNTAGGED(string);
memcpy(new_string + 1,string + 1,to_copy);
REGISTER_UNTAGGED(string);
fill_string(new_string,to_copy,capacity,fill);
UNREGISTER_UNTAGGED(string);
return new_string;
}
@ -529,7 +548,9 @@ DEFINE_PRIMITIVE(resize_string)
CELL i; \
for(i = 0; i < length; i++) \
{ \
REGISTER_UNTAGGED(s); \
set_string_nth(s,i,(utype)*string); \
UNREGISTER_UNTAGGED(s); \
string++; \
} \
return s; \
@ -552,6 +573,7 @@ DEFINE_PRIMITIVE(resize_string)
MEMORY_TO_STRING(char,u8)
MEMORY_TO_STRING(u16,u16)
// MEMORY_TO_STRING(u32,u32)
bool check_string(F_STRING *s, CELL max)
{