Skip to content

Commit

Permalink
Merge pull request #4269 from rainers/vc_lstring2
Browse files Browse the repository at this point in the history
refactor: make allocation of variable length structure StringValue less brittle
  • Loading branch information
WalterBright committed Jan 10, 2015
2 parents 225c460 + 3ed63df commit 308dca2
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 8 deletions.
11 changes: 5 additions & 6 deletions src/root/stringtable.c
Expand Up @@ -82,8 +82,7 @@ struct StringEntry

uint32_t StringTable::allocValue(const char *s, size_t length)
{
enum { offset_lstring = sizeof(StringValue().ptrvalue) + sizeof(StringValue().length) };
const size_t nbytes = offset_lstring + length + 1;
const size_t nbytes = sizeof(StringValue) + length + 1;

if (!npools || nfill + nbytes > POOL_SIZE)
{
Expand All @@ -95,8 +94,8 @@ uint32_t StringTable::allocValue(const char *s, size_t length)
StringValue *sv = (StringValue *)&pools[npools - 1][nfill];
sv->ptrvalue = NULL;
sv->length = length;
::memcpy((char *)sv->lstring, s, length);
((char *)sv->lstring)[length] = 0;
::memcpy(sv->lstring(), s, length);
sv->lstring()[length] = 0;

const uint32_t vptr = (uint32_t)(npools << POOL_BITS | nfill);
nfill += nbytes + (-nbytes & 7); // align to 8 bytes
Expand Down Expand Up @@ -154,7 +153,7 @@ size_t StringTable::findSlot(hash_t hash, const char *s, size_t length)
if (!table[i].vptr ||
table[i].hash == hash &&
(sv = getValue(table[i].vptr))->length == length &&
::memcmp(s, (char *)sv->lstring, length) == 0)
::memcmp(s, sv->lstring(), length) == 0)
return i;
i = (i + j) & (tabledim - 1);
}
Expand Down Expand Up @@ -215,7 +214,7 @@ void StringTable::grow()
StringEntry *se = &otab[i];
if (!se->vptr) continue;
StringValue *sv = getValue(se->vptr);
table[findSlot(se->hash, (char *)sv->lstring, sv->length)] = *se;
table[findSlot(se->hash, sv->lstring(), sv->length)] = *se;
}
mem.free(otab);
}
4 changes: 2 additions & 2 deletions src/root/stringtable.h
Expand Up @@ -24,10 +24,10 @@ struct StringValue
{
void *ptrvalue;
size_t length;
char lstring[1]; // variable length
char *lstring() { return (char *)(this + 1); }

size_t len() const { return length; }
const char *toDchars() const { return (char *)lstring; }
const char *toDchars() const { return (char *)(this + 1); }

StringValue(); // not constructible
};
Expand Down

0 comments on commit 308dca2

Please sign in to comment.