While in principle machine code implementations of subroutines can return from several different places, in practice they don't. Rather the compiler's code generator emits a branch instruction to the end of the subroutine, there there is an "epilog".
There are many good reasons for returning from the middle in certain specific cases; what if the only epilog you need is an "rts"? Branching to the epilog could cause a cache miss. I expect the compiler developers know all about this but don't typically avail themselves of it because writing compilers is difficult. To be clear, the following source code: - (id) init { if ( self == [super init] ) return nil; // lots of code goes here return self; } ... is implemented as something like this, but in machine code: - (id) init { id result; if ( self == [super init] ){ result = nil; goto epilog; } // lots of code goes here result = self; epilog: return result; } Michael David Crawford, Consulting Software Engineer mdcrawf...@gmail.com http://www.warplife.com/mdc/ Available for Software Development in the Portland, Oregon Metropolitan Area. On Fri, May 29, 2015 at 6:25 PM, Graham Cox <graham....@bigpond.com> wrote: > >> On 30 May 2015, at 3:22 am, Alex Zavatone <z...@mac.com> wrote: >> >> // We don't care if this gets long. > > > My take is that you're rewriting a well-recognised idiom to solve a > non-existent problem. > > The well-recognised idiom makes it easy to verify it's correct. Hiding a > different construct inside a macro obscures that, making it harder to verify > the code. It's not "wrong" exactly, just harder to see at a glance that it's > right. > > The non-existent problem you're trying to solve is that the gap between a > pair of braces could get large. So what? Early returns can be another source > of bugs, so structural purists would tell you that you shouldn't do that. > Sometimes I think it's justified, but not usually worthwhile. Another > religious issue is whether matching braces should line up or not. Personally > I prefer that they do, at the cost of an extra line. Because you aren't doing > that, your long distance between braces is bothering you, because you're > losing track of where it started (I assume that's why it's bothering you). If > you line up the braces that is much less of an issue. > > Source code is for humans, so it should be as readable as you can possibly > make it. Macros often hinder that. Unaligned braces hinder that. Multiple > statements per line hinder that. > > Factoring code helps, so I'd suggest that's the better way to solve this. > (and it's also beneficial when it comes to making sure that -initWithCoder: > and other initializers that don't correctly follow the designated initializer > rule can get access to your common initialization. While this is rarely a > problem, I did notice that the recent change to encourage the use of > -initWithCoder: for unpacking NSViews from a nib breaks this long-standing > rule and so a common init method that both can call is a simple workaround). > > --Graham > > > > _______________________________________________ > > Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) > > Please do not post admin requests or moderator comments to the list. > Contact the moderators at cocoa-dev-admins(at)lists.apple.com > > Help/Unsubscribe/Update your Subscription: > https://lists.apple.com/mailman/options/cocoa-dev/mdcrawford%40gmail.com > > This email sent to mdcrawf...@gmail.com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com