Expression *scanVar(Dsymbol *s, InlineScanState *iss) { //printf("scanVar(%s %s)\n", s->kind(), s->toPrettyChars()); VarDeclaration *vd = s->isVarDeclaration(); if (vd) { TupleDeclaration *td = vd->toAlias()->isTupleDeclaration(); if (td) { for (size_t i = 0; i < td->objects->dim; i++) { DsymbolExp *se = (DsymbolExp *)(*td->objects)[i]; assert(se->op == TOKdsymbol); scanVar(se->s, iss); // TODO } } else if (vd->init) { if (ExpInitializer *ie = vd->init->isExpInitializer()) { Expression *e = ie->exp->inlineScan(iss); if (vd->init != ie) // DeclareExp with vd appears in e return e; ie->exp = e; } } } else { s->inlineScan(); } return NULL; }
void scanVar(Dsymbol *s, InlineScanState *iss) { VarDeclaration *vd = s->isVarDeclaration(); if (vd) { TupleDeclaration *td = vd->toAlias()->isTupleDeclaration(); if (td) { for (size_t i = 0; i < td->objects->dim; i++) { DsymbolExp *se = (DsymbolExp *)td->objects->data[i]; assert(se->op == TOKdsymbol); scanVar(se->s, iss); } } else { // Scan initializer (vd->init) if (vd->init) { ExpInitializer *ie = vd->init->isExpInitializer(); if (ie) { ie->exp = ie->exp->inlineScan(iss); } } } } }
void scanVar(Dsymbol *s, InlineScanState *iss) { VarDeclaration *vd = s->isVarDeclaration(); if (vd) { TupleDeclaration *td = vd->toAlias()->isTupleDeclaration(); if (td) { for (size_t i = 0; i < td->objects->dim; i++) { DsymbolExp *se = (DsymbolExp *)td->objects->tdata()[i]; assert(se->op == TOKdsymbol); scanVar(se->s, iss); } } else { // Scan initializer (vd->init) if (vd->init) { ExpInitializer *ie = vd->init->isExpInitializer(); if (ie) { #if DMDV2 if (vd->type) { Type *tb = vd->type->toBasetype(); if (tb->ty == Tstruct) { StructDeclaration *sd = ((TypeStruct *)tb)->sym; if (sd->cpctor) { /* The problem here is that if the initializer is a * function call that returns a struct S with a cpctor: * S s = foo(); * the postblit is done by the return statement in foo() * in s2ir.c, the intermediate code generator. * But, if foo() is inlined and now the code looks like: * S s = x; * the postblit is not there, because such assignments * are rewritten as s.cpctor(&x) by the front end. * So, the inlining won't get the postblit called. * Work around by not inlining these cases. * A proper fix would be to move all the postblit * additions to the front end. */ return; } } } #endif ie->exp = ie->exp->inlineScan(iss); } } } } }
Expression *DeclarationExp::inlineScan(InlineScanState *iss) { //printf("DeclarationExp::inlineScan()\n"); Expression *e = scanVar(declaration, iss); return e ? e : this; }