mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-07-20 14:15:22 +02:00
Merge dmd-1.073.
This commit is contained in:
140
dmd/constfold.c
140
dmd/constfold.c
@@ -1244,7 +1244,7 @@ Expression *Index(Type *type, Expression *e1, Expression *e2)
|
||||
{ ArrayLiteralExp *ale = (ArrayLiteralExp *)e1;
|
||||
e = ale->elements->tdata()[i];
|
||||
e->type = type;
|
||||
if (e->checkSideEffect(2))
|
||||
if (e->hasSideEffect())
|
||||
e = EXP_CANT_INTERPRET;
|
||||
}
|
||||
}
|
||||
@@ -1262,7 +1262,7 @@ Expression *Index(Type *type, Expression *e1, Expression *e2)
|
||||
else
|
||||
{ e = ale->elements->tdata()[i];
|
||||
e->type = type;
|
||||
if (e->checkSideEffect(2))
|
||||
if (e->hasSideEffect())
|
||||
e = EXP_CANT_INTERPRET;
|
||||
}
|
||||
}
|
||||
@@ -1282,7 +1282,7 @@ Expression *Index(Type *type, Expression *e1, Expression *e2)
|
||||
if (ex->isBool(TRUE))
|
||||
{ e = ae->values->tdata()[i];
|
||||
e->type = type;
|
||||
if (e->checkSideEffect(2))
|
||||
if (e->hasSideEffect())
|
||||
e = EXP_CANT_INTERPRET;
|
||||
break;
|
||||
}
|
||||
@@ -1335,7 +1335,7 @@ Expression *Slice(Type *type, Expression *e1, Expression *lwr, Expression *upr)
|
||||
}
|
||||
else if (e1->op == TOKarrayliteral &&
|
||||
lwr->op == TOKint64 && upr->op == TOKint64 &&
|
||||
!e1->checkSideEffect(2))
|
||||
!e1->hasSideEffect())
|
||||
{ ArrayLiteralExp *es1 = (ArrayLiteralExp *)e1;
|
||||
uinteger_t ilwr = lwr->toInteger();
|
||||
uinteger_t iupr = upr->toInteger();
|
||||
@@ -1359,6 +1359,64 @@ Expression *Slice(Type *type, Expression *e1, Expression *lwr, Expression *upr)
|
||||
return e;
|
||||
}
|
||||
|
||||
/* Set a slice of char array literal 'existingAE' from a string 'newval'.
|
||||
* existingAE[firstIndex..firstIndex+newval.length] = newval.
|
||||
*/
|
||||
void sliceAssignArrayLiteralFromString(ArrayLiteralExp *existingAE, StringExp *newval, int firstIndex)
|
||||
{
|
||||
size_t newlen = newval->len;
|
||||
size_t sz = newval->sz;
|
||||
unsigned char *s = (unsigned char *)newval->string;
|
||||
Type *elemType = existingAE->type->nextOf();
|
||||
for (size_t j = 0; j < newlen; j++)
|
||||
{
|
||||
dinteger_t val;
|
||||
switch (sz)
|
||||
{
|
||||
case 1: val = s[j]; break;
|
||||
case 2: val = ((unsigned short *)s)[j]; break;
|
||||
case 4: val = ((unsigned *)s)[j]; break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
existingAE->elements->tdata()[j+firstIndex]
|
||||
= new IntegerExp(newval->loc, val, elemType);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set a slice of string 'existingSE' from a char array literal 'newae'.
|
||||
* existingSE[firstIndex..firstIndex+newae.length] = newae.
|
||||
*/
|
||||
void sliceAssignStringFromArrayLiteral(StringExp *existingSE, ArrayLiteralExp *newae, int firstIndex)
|
||||
{
|
||||
unsigned char *s = (unsigned char *)existingSE->string;
|
||||
for (size_t j = 0; j < newae->elements->dim; j++)
|
||||
{
|
||||
unsigned value = (unsigned)(newae->elements->tdata()[j]->toInteger());
|
||||
switch (existingSE->sz)
|
||||
{
|
||||
case 1: s[j+firstIndex] = value; break;
|
||||
case 2: ((unsigned short *)s)[j+firstIndex] = value; break;
|
||||
case 4: ((unsigned *)s)[j+firstIndex] = value; break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Set a slice of string 'existingSE' from a string 'newstr'.
|
||||
* existingSE[firstIndex..firstIndex+newstr.length] = newstr.
|
||||
*/
|
||||
void sliceAssignStringFromString(StringExp *existingSE, StringExp *newstr, int firstIndex)
|
||||
{
|
||||
unsigned char *s = (unsigned char *)existingSE->string;
|
||||
size_t sz = existingSE->sz;
|
||||
assert(sz == newstr->sz);
|
||||
memcpy(s + firstIndex * sz, newstr->string, sz * newstr->len);
|
||||
}
|
||||
|
||||
/* Also return EXP_CANT_INTERPRET if this fails
|
||||
*/
|
||||
Expression *Cat(Type *type, Expression *e1, Expression *e2)
|
||||
@@ -1468,62 +1526,42 @@ Expression *Cat(Type *type, Expression *e1, Expression *e2)
|
||||
else if (e2->op == TOKstring && e1->op == TOKarrayliteral &&
|
||||
t1->nextOf()->isintegral())
|
||||
{
|
||||
// Concatenate the strings
|
||||
StringExp *es1 = (StringExp *)e2;
|
||||
ArrayLiteralExp *es2 = (ArrayLiteralExp *)e1;
|
||||
size_t len = es1->len + es2->elements->dim;
|
||||
int sz = es1->sz;
|
||||
|
||||
void *s = mem.malloc((len + 1) * sz);
|
||||
memcpy((char *)s + sz * es2->elements->dim, es1->string, es1->len * sz);
|
||||
for (size_t i = 0; i < es2->elements->dim; i++)
|
||||
{ Expression *es2e = es2->elements->tdata()[i];
|
||||
if (es2e->op != TOKint64)
|
||||
return EXP_CANT_INTERPRET;
|
||||
dinteger_t v = es2e->toInteger();
|
||||
memcpy((unsigned char *)s + i * sz, &v, sz);
|
||||
// [chars] ~ string --> [chars]
|
||||
StringExp *es = (StringExp *)e2;
|
||||
ArrayLiteralExp *ea = (ArrayLiteralExp *)e1;
|
||||
size_t len = es->len + ea->elements->dim;
|
||||
Expressions * elems = new Expressions;
|
||||
elems->setDim(len);
|
||||
for (size_t i= 0; i < ea->elements->dim; ++i)
|
||||
{
|
||||
elems->tdata()[i] = ea->elements->tdata()[i];
|
||||
}
|
||||
|
||||
// Add terminating 0
|
||||
memset((unsigned char *)s + len * sz, 0, sz);
|
||||
|
||||
StringExp *es = new StringExp(loc, s, len);
|
||||
es->sz = sz;
|
||||
es->committed = 0;
|
||||
es->type = type;
|
||||
e = es;
|
||||
ArrayLiteralExp *dest = new ArrayLiteralExp(e1->loc, elems);
|
||||
dest->type = type;
|
||||
sliceAssignArrayLiteralFromString(dest, es, ea->elements->dim);
|
||||
return dest;
|
||||
}
|
||||
else if (e1->op == TOKstring && e2->op == TOKarrayliteral &&
|
||||
t2->nextOf()->isintegral())
|
||||
{
|
||||
// Concatenate the strings
|
||||
StringExp *es1 = (StringExp *)e1;
|
||||
ArrayLiteralExp *es2 = (ArrayLiteralExp *)e2;
|
||||
size_t len = es1->len + es2->elements->dim;
|
||||
int sz = es1->sz;
|
||||
|
||||
void *s = mem.malloc((len + 1) * sz);
|
||||
memcpy(s, es1->string, es1->len * sz);
|
||||
for (size_t i = 0; i < es2->elements->dim; i++)
|
||||
{ Expression *es2e = es2->elements->tdata()[i];
|
||||
if (es2e->op != TOKint64)
|
||||
return EXP_CANT_INTERPRET;
|
||||
dinteger_t v = es2e->toInteger();
|
||||
memcpy((unsigned char *)s + (es1->len + i) * sz, &v, sz);
|
||||
// string ~ [chars] --> [chars]
|
||||
StringExp *es = (StringExp *)e1;
|
||||
ArrayLiteralExp *ea = (ArrayLiteralExp *)e2;
|
||||
size_t len = es->len + ea->elements->dim;
|
||||
Expressions * elems = new Expressions;
|
||||
elems->setDim(len);
|
||||
for (size_t i= 0; i < ea->elements->dim; ++i)
|
||||
{
|
||||
elems->tdata()[es->len + i] = ea->elements->tdata()[i];
|
||||
}
|
||||
|
||||
// Add terminating 0
|
||||
memset((unsigned char *)s + len * sz, 0, sz);
|
||||
|
||||
StringExp *es = new StringExp(loc, s, len);
|
||||
es->sz = sz;
|
||||
es->committed = 0; //es1->committed;
|
||||
es->type = type;
|
||||
e = es;
|
||||
ArrayLiteralExp *dest = new ArrayLiteralExp(e1->loc, elems);
|
||||
dest->type = type;
|
||||
sliceAssignArrayLiteralFromString(dest, es, 0);
|
||||
return dest;
|
||||
}
|
||||
else if (e1->op == TOKstring && e2->op == TOKint64)
|
||||
{
|
||||
// Concatenate the strings
|
||||
// string ~ char --> string
|
||||
void *s;
|
||||
StringExp *es1 = (StringExp *)e1;
|
||||
StringExp *es;
|
||||
|
||||
Reference in New Issue
Block a user