# HG changeset patch # User korDen # Date 1285828215 -14400 # Node ID d8565fbd755c4e7e61e2bd07e8117688b5d4cff1 # Parent 25ede4f66bda2c3f5c760d08e2501af3637657bb Moved object and classinfo from ClassDeclaration to Global (as part of getting rid of the global state) diff -r 25ede4f66bda -r d8565fbd755c dmd/ClassDeclaration.d --- a/dmd/ClassDeclaration.d Thu Sep 30 10:04:32 2010 +0400 +++ b/dmd/ClassDeclaration.d Thu Sep 30 10:30:15 2010 +0400 @@ -71,7 +71,7 @@ enum OFFSET_RUNTIME = 0x76543210; -struct Param +struct FuncDeclarationFinder { bool visit(FuncDeclaration fd2) { @@ -84,9 +84,6 @@ class ClassDeclaration : AggregateDeclaration { - static __gshared ClassDeclaration object; - static __gshared ClassDeclaration classinfo; - ClassDeclaration baseClass; // null only if this is Object version(DMDV1) { CtorDeclaration *ctor; @@ -270,17 +267,17 @@ if (id is Id.Object_) { - if (object) - object.error("%s", msg); - object = this; + if (global.object) + global.object.error("%s", msg); + global.object = this; } // if (id is Id.ClassInfo) if (id is Id.TypeInfo_Class) { - if (classinfo) - classinfo.error("%s", msg); - classinfo = this; + if (global.classinfo) + global.classinfo.error("%s", msg); + global.classinfo = this; } if (id is Id.ModuleInfo) @@ -546,7 +543,7 @@ TypeClass tc; Type bt; - if (!object) + if (!global.object) { error("missing or corrupt object.d"); fatal(); @@ -963,7 +960,7 @@ return false; } - Param p; p.fd = fd; + FuncDeclarationFinder p; p.fd = fd; s = s.toAlias(); OverloadSet os = s.isOverloadSet(); @@ -1116,8 +1113,8 @@ ident is Id.TypeInfo_Class || ident is Id.TypeInfo_Typedef || ident is Id.TypeInfo_Tuple || - this is object || - this is classinfo || + this is global.object || + this is global.classinfo || this is Module.moduleinfo || ident.toChars().startsWith("TypeInfo_") ) @@ -1345,16 +1342,17 @@ */ dt_t* dt = null; offset = CLASSINFO_SIZE; // must be ClassInfo.size - if (classinfo) + if (global.classinfo) { - if (classinfo.structsize != CLASSINFO_SIZE) + if (global.classinfo.structsize != CLASSINFO_SIZE) error("D compiler and phobos' object.d are mismatched"); + + dtxoff(&dt, global.classinfo.toVtblSymbol(), 0, TYnptr); // vtbl for ClassInfo } - - if (classinfo) - dtxoff(&dt, classinfo.toVtblSymbol(), 0, TYnptr); // vtbl for ClassInfo else + { dtdword(&dt, 0); // BUG: should be an assert() + } dtdword(&dt, 0); // monitor diff -r 25ede4f66bda -r d8565fbd755c dmd/ClassInfoDeclaration.d --- a/dmd/ClassInfoDeclaration.d Thu Sep 30 10:04:32 2010 +0400 +++ b/dmd/ClassInfoDeclaration.d Thu Sep 30 10:30:15 2010 +0400 @@ -3,6 +3,7 @@ import dmd.common; import dmd.VarDeclaration; import dmd.ClassDeclaration; +import dmd.Global; import dmd.Dsymbol; import dmd.Scope; import dmd.Loc; @@ -24,7 +25,7 @@ this(ClassDeclaration cd) { - super(Loc(0), ClassDeclaration.classinfo.type, cd.ident, null); + super(Loc(0), global.classinfo.type, cd.ident, null); this.cd = cd; storage_class = STC.STCstatic | STC.STCgshared; diff -r 25ede4f66bda -r d8565fbd755c dmd/Global.d --- a/dmd/Global.d Thu Sep 30 10:04:32 2010 +0400 +++ b/dmd/Global.d Thu Sep 30 10:30:15 2010 +0400 @@ -3,6 +3,7 @@ import dmd.common; import dmd.Array; import dmd.Param; +import dmd.ClassDeclaration; class Global { @@ -45,6 +46,9 @@ uint errors; // number of errors reported so far uint gag; // !=0 means gag reporting of errors + ClassDeclaration object; + ClassDeclaration classinfo; + this() { params.versionids = new Array(); diff -r 25ede4f66bda -r d8565fbd755c dmd/InterfaceDeclaration.d --- a/dmd/InterfaceDeclaration.d Thu Sep 30 10:04:32 2010 +0400 +++ b/dmd/InterfaceDeclaration.d Thu Sep 30 10:30:15 2010 +0400 @@ -306,18 +306,18 @@ if (j && bc.base.isInterfaceDeclaration()) *poffset = OFFSET_RUNTIME; } - return 1; + return true; } if (isBaseOf(b, poffset)) { if (j && poffset && bc.base.isInterfaceDeclaration()) *poffset = OFFSET_RUNTIME; - return 1; + return true; } } if (poffset) *poffset = 0; - return 0; + return false; } override string kind() @@ -412,8 +412,8 @@ */ dt_t *dt = null; - if (classinfo) - dtxoff(&dt, classinfo.toVtblSymbol(), 0, TYnptr); // vtbl for ClassInfo + if (global.classinfo) + dtxoff(&dt, global.classinfo.toVtblSymbol(), 0, TYnptr); // vtbl for ClassInfo else dtdword(&dt, 0); // BUG: should be an assert() dtdword(&dt, 0); // monitor @@ -436,8 +436,8 @@ dtdword(&dt, vtblInterfaces.dim); if (vtblInterfaces.dim) { - if (classinfo) - assert(classinfo.structsize == CLASSINFO_SIZE); + if (global.classinfo) + assert(global.classinfo.structsize == CLASSINFO_SIZE); offset = CLASSINFO_SIZE; dtxoff(&dt, csym, offset, TYnptr); // (*) } diff -r 25ede4f66bda -r d8565fbd755c dmd/TypeClass.d --- a/dmd/TypeClass.d Thu Sep 30 10:04:32 2010 +0400 +++ b/dmd/TypeClass.d Thu Sep 30 10:30:15 2010 +0400 @@ -192,8 +192,8 @@ if (ident is Id.classinfo_) { - assert(ClassDeclaration.classinfo); - Type t = ClassDeclaration.classinfo.type; + assert(global.classinfo); + Type t = global.classinfo.type; if (e.op == TOK.TOKtype || e.op == TOK.TOKdottype) { /* For type.classinfo, we know the classinfo