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