From ee7a9a272dcbcf35c5c844101bb090e031029765 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Thu, 14 Mar 2019 07:15:04 +0100 Subject: [PATCH] destroyer.nim: added a remark about code generation --- compiler/destroyer.nim | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/compiler/destroyer.nim b/compiler/destroyer.nim index 9b49a95000..8821e789c5 100644 --- a/compiler/destroyer.nim +++ b/compiler/destroyer.nim @@ -117,6 +117,20 @@ Rule Pattern Transformed into Rule 3.2 describes a "cursor" variable, a variable that is only used as a view into some data structure. See ``compiler/cursors.nim`` for details. + +Note: In order to avoid the very common combination ``reset(x); =sink(x, y)`` for +variable definitions we must turn "the first sink/assignment" operation into a +copyMem. This is harder than it looks: + + while true: + try: + if cond: break # problem if we run destroy(x) here :-/ + var x = f() + finally: + destroy(x) + +And the C++ optimizers don't sweat to optimize it for us, so we don't have +to do it. ]## import