Mercurial > projects > ldc
diff gen/classes.cpp @ 816:7d16ce7ad19d
Made ClassInfo.interfaces generation consistent with DMD, fixes #134
Removed unneeded includes from dmd/attrib.c
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Mon, 01 Dec 2008 18:34:02 +0100 |
parents | 6c2ff06c4201 |
children | 8f0b24bc55f0 |
line wrap: on
line diff
--- a/gen/classes.cpp Mon Dec 01 15:21:33 2008 +0100 +++ b/gen/classes.cpp Mon Dec 01 18:34:02 2008 +0100 @@ -51,9 +51,14 @@ irstruct->interfaceMap[b->base] = iri; else irstruct->interfaceMap.insert(std::make_pair(b->base, iri)); + // add to ordered list irstruct->interfaceVec.push_back(iri); + // add to classinfo interfaces + if (newinstance) + irstruct->classInfoInterfaces.push_back(iri); + // assign this iri to all base interfaces of this one for (unsigned j = 0; j < b->baseInterfaces_dim; j++) { @@ -148,6 +153,7 @@ // add to interfaceInfos IrInterface* iri = new IrInterface(bc); irstruct->interfaceVec.push_back(iri); + irstruct->classInfoInterfaces.push_back(iri); } } @@ -378,7 +384,6 @@ // interface vtables unsigned idx = 0; - for (IrStruct::InterfaceVectorIter i=irstruct->interfaceVec.begin(); i!=irstruct->interfaceVec.end(); ++i) { IrInterface* iri = *i; @@ -392,7 +397,7 @@ iri->vtbl = new llvm::GlobalVariable(iri->vtblInitTy.get(), true, _linkage, 0, nam, gIR->module); - // always create interfaceinfos + // always set the interface info as it's need as the first vtbl entry LLConstant* idxs[2] = {DtoConstUint(0), DtoConstUint(idx)}; iri->info = llvm::ConstantExpr::getGetElementPtr(irstruct->interfaceInfos, idxs, 2); idx++; @@ -1506,8 +1511,15 @@ c = LLConstant::getNullValue(intersTy); else { const LLType* t = intersTy->getContainedType(1); // .ptr + // cast to Interface* c = DtoBitCast(ir->interfaceInfos, t); - size_t iisz = ir->interfaceVec.size(); + size_t isz = ir->interfaceVec.size(); + size_t iisz = ir->classInfoInterfaces.size(); + assert(iisz <= isz); + // offset - we only want the 'iisz' last ones + LLConstant* idx = DtoConstUint(isz - iisz); + c = llvm::ConstantExpr::getGetElementPtr(c, &idx, 1); + // make array c = DtoConstSlice(DtoConstSize_t(iisz), c); } inits.push_back(c);