Mercurial > projects > ldc
diff ir/irlandingpad.cpp @ 320:d772927ca496 trunk
[svn r341] Fix all regressions between [332] and [340]:
- fixed assert on empty catch body
- fixed(?) typedefed classes in catch specification
- fixed assert with catchall
Added some documentation.
author | ChristianK |
---|---|
date | Sat, 05 Jul 2008 13:05:29 +0200 |
parents | e9c93739bc4c |
children | d7e6ace5cca4 |
line wrap: on
line diff
--- a/ir/irlandingpad.cpp Sat Jul 05 10:22:56 2008 +0200 +++ b/ir/irlandingpad.cpp Sat Jul 05 13:05:29 2008 +0200 @@ -21,17 +21,20 @@ catchstmt->var->ir.irLocal->value = gIR->ir->CreateBitCast(catch_var, getPtrToType(DtoType(catchstmt->var->type))); } - // emit handler - assert(catchstmt->handler); - catchstmt->handler->toIR(gIR); + // emit handler, if there is one + // handler is zero for instance for 'catch { debug foo(); }' + if(catchstmt->handler); + catchstmt->handler->toIR(gIR); if (!gIR->scopereturned()) gIR->ir->CreateBr(end); assert(catchstmt->type); - catchType = catchstmt->type->isClassHandle(); + //TODO: Is toBasetype correct here? Should catch handlers with typedefed + // classes behave differently? + catchType = catchstmt->type->toBasetype()->isClassHandle(); + assert(catchType); DtoForceDeclareDsymbol(catchType); - assert(catchType); } IRLandingPadInfo::IRLandingPadInfo(Statement* finallystmt) @@ -122,11 +125,10 @@ // if there's a finally, the eh table has to have a 0 action if(hasFinally) selectorargs.push_back(llvm::ConstantInt::get(LLType::Int32Ty, 0)); - // if there is a catch, store exception object - if(catchToInt.size()) + // if there is a catch and some catch allocated storage, store exception object + if(catchToInt.size() && catch_var) { const LLType* objectTy = DtoType(ClassDeclaration::object->type); - assert(catch_var); gIR->ir->CreateStore(gIR->ir->CreateBitCast(eh_ptr, objectTy), catch_var); }