Mercurial > projects > ldc
diff dmd/delegatize.c @ 1:c53b6e3fe49a trunk
[svn r5] Initial commit. Most things are very rough.
author | lindquist |
---|---|
date | Sat, 01 Sep 2007 21:43:27 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/delegatize.c Sat Sep 01 21:43:27 2007 +0200 @@ -0,0 +1,214 @@ + +// Compiler implementation of the D programming language +// Copyright (c) 1999-2007 by Digital Mars +// All Rights Reserved +// written by Walter Bright +// http://www.digitalmars.com +// License for redistribution is by either the Artistic License +// in artistic.txt, or the GNU General Public License in gnu.txt. +// See the included readme.txt for details. + +#include <stdio.h> +#include <assert.h> + +#include "mars.h" +#include "expression.h" +#include "statement.h" +#include "mtype.h" +#include "utf.h" +#include "declaration.h" +#include "aggregate.h" +#include "scope.h" + +/******************************************** + * Convert from expression to delegate that returns the expression, + * i.e. convert: + * expr + * to: + * t delegate() { return expr; } + */ + +Expression *Expression::toDelegate(Scope *sc, Type *t) +{ + //printf("Expression::toDelegate(t = %s) %s\n", t->toChars(), toChars()); + TypeFunction *tf = new TypeFunction(NULL, t, 0, LINKd); + FuncLiteralDeclaration *fld = + new FuncLiteralDeclaration(loc, loc, tf, TOKdelegate, NULL); + Expression *e; +#if 1 + sc = sc->push(); + sc->parent = fld; // set current function to be the delegate + e = this; + e->scanForNestedRef(sc); + sc = sc->pop(); +#else + e = this->syntaxCopy(); +#endif + Statement *s = new ReturnStatement(loc, e); + fld->fbody = s; + e = new FuncExp(loc, fld); + e = e->semantic(sc); + return e; +} + +/****************************** + * Perform scanForNestedRef() on an array of Expressions. + */ + +void arrayExpressionScanForNestedRef(Scope *sc, Expressions *a) +{ + //printf("arrayExpressionScanForNestedRef(%p)\n", a); + if (a) + { + for (int i = 0; i < a->dim; i++) + { Expression *e = (Expression *)a->data[i]; + + if (e) + { + e->scanForNestedRef(sc); + } + } + } +} + +void Expression::scanForNestedRef(Scope *sc) +{ + //printf("Expression::scanForNestedRef(%s)\n", toChars()); +} + +void SymOffExp::scanForNestedRef(Scope *sc) +{ + //printf("SymOffExp::scanForNestedRef(%s)\n", toChars()); + VarDeclaration *v = var->isVarDeclaration(); + if (v) + v->checkNestedReference(sc, 0); +} + +void VarExp::scanForNestedRef(Scope *sc) +{ + //printf("VarExp::scanForNestedRef(%s)\n", toChars()); + VarDeclaration *v = var->isVarDeclaration(); + if (v) + v->checkNestedReference(sc, 0); +} + +void ThisExp::scanForNestedRef(Scope *sc) +{ + assert(var); + var->isVarDeclaration()->checkNestedReference(sc, 0); +} + +void SuperExp::scanForNestedRef(Scope *sc) +{ + ThisExp::scanForNestedRef(sc); +} + +void FuncExp::scanForNestedRef(Scope *sc) +{ + //printf("FuncExp::scanForNestedRef(%s)\n", toChars()); + //fd->parent = sc->parent; +} + +void DeclarationExp::scanForNestedRef(Scope *sc) +{ + //printf("DeclarationExp::scanForNestedRef() %s\n", toChars()); + declaration->parent = sc->parent; +} + +void NewExp::scanForNestedRef(Scope *sc) +{ + //printf("NewExp::scanForNestedRef(Scope *sc): %s\n", toChars()); + + if (thisexp) + thisexp->scanForNestedRef(sc); + arrayExpressionScanForNestedRef(sc, newargs); + arrayExpressionScanForNestedRef(sc, arguments); +} + +void UnaExp::scanForNestedRef(Scope *sc) +{ + e1->scanForNestedRef(sc); +} + +void BinExp::scanForNestedRef(Scope *sc) +{ + e1->scanForNestedRef(sc); + e2->scanForNestedRef(sc); +} + +void CallExp::scanForNestedRef(Scope *sc) +{ + //printf("CallExp::scanForNestedRef(Scope *sc): %s\n", toChars()); + e1->scanForNestedRef(sc); + arrayExpressionScanForNestedRef(sc, arguments); +} + + +void IndexExp::scanForNestedRef(Scope *sc) +{ + e1->scanForNestedRef(sc); + + if (lengthVar) + { //printf("lengthVar\n"); + lengthVar->parent = sc->parent; + } + e2->scanForNestedRef(sc); +} + + +void SliceExp::scanForNestedRef(Scope *sc) +{ + e1->scanForNestedRef(sc); + + if (lengthVar) + { //printf("lengthVar\n"); + lengthVar->parent = sc->parent; + } + if (lwr) + lwr->scanForNestedRef(sc); + if (upr) + upr->scanForNestedRef(sc); +} + + +void ArrayLiteralExp::scanForNestedRef(Scope *sc) +{ + arrayExpressionScanForNestedRef(sc, elements); +} + + +void AssocArrayLiteralExp::scanForNestedRef(Scope *sc) +{ + arrayExpressionScanForNestedRef(sc, keys); + arrayExpressionScanForNestedRef(sc, values); +} + + +void StructLiteralExp::scanForNestedRef(Scope *sc) +{ + arrayExpressionScanForNestedRef(sc, elements); +} + + +void TupleExp::scanForNestedRef(Scope *sc) +{ + arrayExpressionScanForNestedRef(sc, exps); +} + + +void ArrayExp::scanForNestedRef(Scope *sc) +{ + e1->scanForNestedRef(sc); + arrayExpressionScanForNestedRef(sc, arguments); +} + + +void CondExp::scanForNestedRef(Scope *sc) +{ + econd->scanForNestedRef(sc); + e1->scanForNestedRef(sc); + e2->scanForNestedRef(sc); +} + + +