# HG changeset patch # User Trass3r # Date 1284515935 -7200 # Node ID fe2e1b93e88f2ee921b6bb9bdb381655eebea1f8 # Parent 9a2a1ae6c8e52358a353ced30871f232c9fe7c09 phobos compiles now: * fixed upgrade mistake in interpret.Util + implemented missing methods in RealExp,VarExp diff -r 9a2a1ae6c8e5 -r fe2e1b93e88f dmd/RealExp.d --- a/dmd/RealExp.d Tue Sep 14 23:49:12 2010 +0100 +++ b/dmd/RealExp.d Wed Sep 15 03:58:55 2010 +0200 @@ -24,6 +24,7 @@ import dmd.backend.mTY; import std.stdio; +import std.string; class RealExp : Expression { @@ -52,7 +53,7 @@ } } - return 0; + return false; } override Expression semantic(Scope sc) @@ -66,22 +67,31 @@ override Expression interpret(InterState istate) { - assert(false); +version(LOG) + writef("RealExp::interpret() %s\n", toChars()); + + return this; } override string toChars() { - assert(false); + return format(type.isimaginary() ? "%gi" : "%g", value); } override ulong toInteger() { - assert(false); +version(IN_GCC) + return toReal().toInt(); +else + return cast(ulong) toReal(); } override ulong toUInteger() { - assert(false); +version(IN_GCC) + return cast(ulong) toReal().toInt(); +else + return cast(ulong) toReal(); } override real toReal() @@ -129,7 +139,7 @@ override void toCBuffer(OutBuffer buf, HdrGenState* hgs) { - floatToBuffer(buf, type, value); + floatToBuffer(buf, type, value); } override void toMangleBuffer(OutBuffer buf) @@ -176,7 +186,7 @@ print(); ///type.print(); ///type.toBasetype().print(); - printf("ty = %d, tym = %lx\n", type.ty, ty); + printf("ty = %d, tym = %lx\n", type.ty, ty); assert(0); } return el_const(ty, &c); @@ -221,5 +231,4 @@ } return pdt; } -} - +} \ No newline at end of file diff -r 9a2a1ae6c8e5 -r fe2e1b93e88f dmd/TypeFunction.d --- a/dmd/TypeFunction.d Tue Sep 14 23:49:12 2010 +0100 +++ b/dmd/TypeFunction.d Wed Sep 15 03:58:55 2010 +0200 @@ -423,6 +423,8 @@ case TRUST.TRUSTsafe: buf.writestring("@safe "); break; + + default: } if (next && (!ident || ident.toHChars2() == ident.toChars())) diff -r 9a2a1ae6c8e5 -r fe2e1b93e88f dmd/VarExp.d --- a/dmd/VarExp.d Tue Sep 14 23:49:12 2010 +0100 +++ b/dmd/VarExp.d Wed Sep 15 03:58:55 2010 +0200 @@ -17,9 +17,11 @@ import dmd.TOK; import dmd.TY; import dmd.STC; +import dmd.SymbolDeclaration; import dmd.SymbolExp; import dmd.Type; import dmd.interpret.Util; +import dmd.backend.Util; import dmd.backend.dt_t; import dmd.expression.Util; @@ -258,7 +260,35 @@ override dt_t** toDt(dt_t** pdt) { - assert(false); + // writef("VarExp::toDt() %d\n", op); + for (; *pdt; pdt = &((*pdt).DTnext)) + {} + + VarDeclaration v = var.isVarDeclaration(); + if (v && (v.isConst() || v.isImmutable()) && + type.toBasetype().ty != Tsarray && v.init) + { + if (v.inuse) + { + error("recursive reference %s", toChars()); + return pdt; + } + v.inuse++; + *pdt = v.init.toDt(); + v.inuse--; + return pdt; + } + SymbolDeclaration sd = var.isSymbolDeclaration(); + if (sd && sd.dsym) + { + sd.dsym.toDt(pdt); + return pdt; + } + debug writef("VarExp::toDt(), kind = %s\n", var.kind()); + + error("non-constant expression %s", toChars()); + pdt = dtnzeros(pdt, 1); + return pdt; } version(DMDV1) diff -r 9a2a1ae6c8e5 -r fe2e1b93e88f dmd/interpret/Util.d --- a/dmd/interpret/Util.d Tue Sep 14 23:49:12 2010 +0100 +++ b/dmd/interpret/Util.d Wed Sep 15 03:58:55 2010 +0200 @@ -144,16 +144,16 @@ ///} else { /// if (v.isConst() && v.init) ///} - { + { e = v.init.toExpression(); if (e && !e.type) e.type = v.type; } else - { + { e = v.value; - if (v.isCTFE()) - { + if (!v.isCTFE()) + { error(loc, "static variable %s cannot be read at compile time", v.toChars()); e = EXP_CANT_INTERPRET; } @@ -168,7 +168,7 @@ else if (s) { if (s.dsym.toInitializer() == s.sym) - { + { Expressions exps = new Expressions(); e = new StructLiteralExp(Loc(0), s.dsym, exps); e = e.semantic(null);