4 ms·
Defer is a restricted form of COMEFROM with automatic labels. You COMEFROM the end of the next `defer` block in the same scope, or from the end of the function
by sparkie 8mo ago
Defer is a restricted form of COMEFROM with automatic labels. You COMEFROM the end of the next `defer` block in the same scope, or from the end of the function (before `return`) if there is no more `defer`. The order of execution of defer-blocks is backwards (bottom-to-top) rather than the typical top-to-bottom.
puts("foo");
defer { puts("bar"); }
puts("baz");
defer { puts("qux"); }
puts("corge");
return;
Will evaluate:
puts("foo");
puts("baz");
puts("corge");
puts("qux");
puts("bar");
return;
- vlowther 8mo agoThat is the most cursed description I have seen on how defer works. Ever.
- sparkie 8mo agoThis is how it would look with explicit labels and comefrom: puts("foo"); before_defer0: comefrom after_defer1; puts("bar"); after_defer0: comefrom before_defer0; puts("baz"); before_defer1: comefrom before_ret; puts("qux"); after_defer1: comefrom before_defer1; puts("corge"); before_ret: comefrom after_defer0; return; --- `defer` is obviously not implemented in this way, it will re-order the code to flow top-to-bottom and have fewer branches, but the control flow is effectively the same thing. In theory a compiler could implement `comefrom` by re-ordering the basic blocks like `defer` does, so that the actual runtime evaluation of code is still top-to-bottom.