On Saturday 12 February 2011 07:05:34 Andrej Mitrovic wrote: > On 2/12/11, bearophile <bearophileh...@lycos.com> wrote: > > Andrej Mitrovic: > >> Yeah, enforce is great. > > > > Enforce is not disabled in release mode. > > Right. That's why I need it in this case, since the library can return > null at runtime due to user or even (audio) hardware errors. > > > Currently a function with enforce > > inside can't be nothrow, and it can't be inlined. > > > > Bye, > > bearophile > > Of course it can't be nothrow? I thought the idea of enforce is to > throw a custom exception when needed, so how can you expect a function > which throws an exception to be nothrow? > > Btw, is the inline problem just a DMD implementation problem, or does > enforce have to be fixed for that?
It's because the second argument to enforce is lazy. Whether dmd will ever be able to reasonably inline functions which take lazy arguments, I don't know (there's a fair bit that goes on underneath to make lazy happen, so the resulting code isn't exactly short). However, it has been discussed from time to time to have a non-lazy version of enforce. That would require either creating another function (e.g. enforceNonLazy) or making dmd smart enough to be able to have two versions of a function - one lazy and one non-lazy - and have it use the non-lazy one when it can (e.g. when it's only given a string and there's nothing which the resulting delegate would do other than return the string - making it non-lazy in such a case does nothing). Regardless, it's why I pretty much never use lazy. I don't think that if(condition) throw new Exception("my message"); is onerous at all, and I don't want to worry about the inlining issue. But if your function isn't likely to be inlined anyway, or for some reason, you just don't like having the if statement, then enforce is just fine. - Jonathan M Davis