Mercurial > projects > ldc
diff gen/classes.cpp @ 347:6057fdf797d8 trunk
[svn r368] Fixed custom class allocators with arbitrary user arguments. Closes #25
Removed some dead code.
Started on a more generalised approach to call misc. D functions.
author | lindquist |
---|---|
date | Sun, 13 Jul 2008 20:49:10 +0200 |
parents | aaade6ded589 |
children | 3c5e19bfcbf2 |
line wrap: on
line diff
--- a/gen/classes.cpp Sun Jul 13 09:14:01 2008 +0200 +++ b/gen/classes.cpp Sun Jul 13 20:49:10 2008 +0200 @@ -796,15 +796,18 @@ // custom allocator else if (newexp->allocator) { - DtoForceDeclareDsymbol(newexp->allocator); - assert(newexp->newargs); - assert(newexp->newargs->dim == 1); + DValue* res = DtoCallDFunc(newexp->allocator, newexp->newargs); + mem = DtoBitCast(res->getRVal(), DtoType(tc), "newclass_custom"); - llvm::Function* fn = newexp->allocator->ir.irFunc->func; - assert(fn); - DValue* arg = ((Expression*)newexp->newargs->data[0])->toElem(gIR); - mem = gIR->CreateCallOrInvoke(fn, arg->getRVal(), "newclass_custom_alloc")->get(); - mem = DtoBitCast(mem, DtoType(tc), "newclass_custom"); +// DtoForceDeclareDsymbol(newexp->allocator); +// assert(newexp->newargs); +// assert(newexp->newargs->dim == 1); +// +// llvm::Function* fn = newexp->allocator->ir.irFunc->func; +// assert(fn); +// DValue* arg = ((Expression*)newexp->newargs->data[0])->toElem(gIR); +// mem = gIR->CreateCallOrInvoke(fn, arg->getRVal(), "newclass_custom_alloc")->get(); +// mem = DtoBitCast(mem, DtoType(tc), "newclass_custom"); } // default allocator else @@ -834,13 +837,11 @@ { Logger::println("Resolving nested context"); LOG_SCOPE; - size_t idx = 2; - //idx += tc->sym->ir.irStruct->interfaces.size(); - LLValue* nest = gIR->func()->decl->ir.irFunc->nestedVar; + LLValue* nest = gIR->func()->nestedVar; if (!nest) - nest = gIR->func()->decl->ir.irFunc->thisVar; + nest = gIR->func()->thisVar; assert(nest); - LLValue* gep = DtoGEPi(mem,0,idx,"tmp"); + LLValue* gep = DtoGEPi(mem,0,2,"tmp"); nest = DtoBitCast(nest, gep->getType()->getContainedType(0)); DtoStore(nest, gep); } @@ -849,7 +850,7 @@ if (newexp->member) { assert(newexp->arguments != NULL); - return DtoCallClassCtor(tc, newexp->member, newexp->arguments, mem); + return DtoCallDFunc(newexp->member, newexp->arguments, tc, mem); } // return default constructed class @@ -887,42 +888,6 @@ ////////////////////////////////////////////////////////////////////////////////////////// -DValue* DtoCallClassCtor(TypeClass* type, CtorDeclaration* ctor, Array* arguments, LLValue* mem) -{ - Logger::println("Calling constructor"); - LOG_SCOPE; - - assert(ctor); - DtoForceDeclareDsymbol(ctor); - llvm::Function* fn = ctor->ir.irFunc->func; - TypeFunction* tf = (TypeFunction*)DtoDType(ctor->type); - - llvm::PAListPtr palist; - - std::vector<LLValue*> ctorargs; - ctorargs.push_back(mem); - for (size_t i=0; i<arguments->dim; ++i) - { - Expression* ex = (Expression*)arguments->data[i]; - Argument* fnarg = Argument::getNth(tf->parameters, i); - DValue* argval = DtoArgument(fnarg, ex); - LLValue* a = argval->getRVal(); - const LLType* aty = fn->getFunctionType()->getParamType(i+1); - if (a->getType() != aty) - a = DtoBitCast(a, aty); - ctorargs.push_back(a); - if (fnarg && fnarg->llvmByVal) - palist = palist.addAttr(i+2, llvm::ParamAttr::ByVal); // return,this is 2 - } - CallOrInvoke* call = gIR->CreateCallOrInvoke(fn, ctorargs.begin(), ctorargs.end(), "tmp"); - call->setCallingConv(DtoCallingConv(LINKd)); - call->setParamAttrs(palist); - - return new DImValue(type, call->get(), false); -} - -////////////////////////////////////////////////////////////////////////////////////////// - void DtoFinalizeClass(LLValue* inst) { // get runtime function