Expression *DeclarationExp::interpret(InterState *istate) { #if LOG printf("DeclarationExp::interpret() %s\n", toChars()); #endif Expression *e; VarDeclaration *v = declaration->isVarDeclaration(); if (v) { Dsymbol *s = v->toAlias(); if (s == v && !v->isStatic() && v->init) { ExpInitializer *ie = v->init->isExpInitializer(); if (ie) e = ie->exp->interpret(istate); else if (v->init->isVoidInitializer()) e = NULL; } #if V2 else if (s == v && (v->isConst() || v->isInvariant()) && v->init) #else else if (s == v && v->isConst() && v->init) #endif { e = v->init->toExpression(); if (!e) e = EXP_CANT_INTERPRET; else if (!e->type) e->type = v->type; } } else if (declaration->isAttribDeclaration() ||
Expression *DeclarationExp::doInline(InlineDoState *ids) { DeclarationExp *de = (DeclarationExp *)copy(); VarDeclaration *vd; //printf("DeclarationExp::doInline(%s)\n", toChars()); vd = declaration->isVarDeclaration(); if (vd) { #if 0 // Need to figure this out before inlining can work for tuples 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); se->s; } return st->objects->dim; } #endif if (vd->isStatic() || vd->isConst()) ; else { VarDeclaration *vto; vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init); *vto = *vd; vto->parent = ids->parent; #if IN_DMD vto->csym = NULL; vto->isym = NULL; #endif ids->from.push(vd); ids->to.push(vto); if (vd->init) { if (vd->init->isVoidInitializer()) { vto->init = new VoidInitializer(vd->init->loc); } else { ExpInitializer *ie = vd->init->isExpInitializer(); assert(ie); vto->init = new ExpInitializer(ie->loc, ie->exp->doInline(ids)); } } de->declaration = (Dsymbol *) (void *)vto; } } /* This needs work, like DeclarationExp::toElem(), if we are * to handle TemplateMixin's. For now, we just don't inline them. */ return de; }
Expression *DeclarationExp::doInline(InlineDoState *ids) { //printf("DeclarationExp::doInline(%s)\n", toChars()); VarDeclaration *vd = declaration->isVarDeclaration(); if (vd) { #if 0 // Need to figure this out before inlining can work for tuples TupleDeclaration *td = vd->toAlias()->isTupleDeclaration(); if (td) { for (size_t i = 0; i < td->objects->dim; i++) { DsymbolExp *se = (*td->objects)[i]; assert(se->op == TOKdsymbol); se->s; } return st->objects->dim; } #endif if (vd->isStatic()) ; else { VarDeclaration *vto; if (ids->fd && vd == ids->fd->nrvo_var) { for (size_t i = 0; i < ids->from.dim; i++) { if (vd == ids->from[i]) { vto = (VarDeclaration *)ids->to[i]; Expression *e; if (vd->init && !vd->init->isVoidInitializer()) { e = vd->init->toExpression(); assert(e); e = e->doInline(ids); } else e = new IntegerExp(vd->init->loc, 0, Type::tint32); return e; } } } vto = new VarDeclaration(vd->loc, vd->type, vd->ident, vd->init); memcpy((void *)vto, (void *)vd, sizeof(VarDeclaration)); vto->parent = ids->parent; vto->csym = NULL; vto->isym = NULL; ids->from.push(vd); ids->to.push(vto); L1: if (vd->init) { if (vd->init->isVoidInitializer()) { vto->init = new VoidInitializer(vd->init->loc); } else { Expression *e = vd->init->toExpression(); assert(e); vto->init = new ExpInitializer(e->loc, e->doInline(ids)); } } DeclarationExp *de = (DeclarationExp *)copy(); de->declaration = (Dsymbol *) (void *)vto; return de; } } /* This needs work, like DeclarationExp::toElem(), if we are * to handle TemplateMixin's. For now, we just don't inline them. */ return Expression::doInline(ids); }
int Dsymbol_canThrow(Dsymbol *s, bool mustNotThrow) { AttribDeclaration *ad; VarDeclaration *vd; TemplateMixin *tm; TupleDeclaration *td; //printf("Dsymbol_toElem() %s\n", s->toChars()); ad = s->isAttribDeclaration(); if (ad) { Dsymbols *decl = ad->include(NULL, NULL); if (decl && decl->dim) { for (size_t i = 0; i < decl->dim; i++) { s = (*decl)[i]; if (Dsymbol_canThrow(s, mustNotThrow)) return 1; } } } else if ((vd = s->isVarDeclaration()) != NULL) { s = s->toAlias(); if (s != vd) return Dsymbol_canThrow(s, mustNotThrow); if (vd->storage_class & STCmanifest) ; else if (vd->isStatic() || vd->storage_class & (STCextern | STCtls | STCgshared)) ; else { if (vd->init) { ExpInitializer *ie = vd->init->isExpInitializer(); if (ie && ie->exp->canThrow(mustNotThrow)) return 1; } if (vd->edtor && !vd->noscope) return vd->edtor->canThrow(mustNotThrow); } } else if ((tm = s->isTemplateMixin()) != NULL) { //printf("%s\n", tm->toChars()); if (tm->members) { for (size_t i = 0; i < tm->members->dim; i++) { Dsymbol *sm = (*tm->members)[i]; if (Dsymbol_canThrow(sm, mustNotThrow)) return 1; } } } else if ((td = s->isTupleDeclaration()) != NULL) { for (size_t i = 0; i < td->objects->dim; i++) { RootObject *o = (*td->objects)[i]; if (o->dyncast() == DYNCAST_EXPRESSION) { Expression *eo = (Expression *)o; if (eo->op == TOKdsymbol) { DsymbolExp *se = (DsymbolExp *)eo; if (Dsymbol_canThrow(se->s, mustNotThrow)) return 1; } } } } return 0; }