arc optimizations (#13325)

* scope based destructors
* handle 'or' and 'and' expressions properly, see the new test arc/tcontrolflow.nim
* make this branch mergable, logic is disabled for now
This commit is contained in:
Andreas Rumpf
2020-03-18 16:57:34 +01:00
committed by GitHub
parent a96842aaeb
commit fb641483f0
11 changed files with 312 additions and 95 deletions

View File

@@ -0,0 +1,55 @@
discard """
output: '''begin A
elif
destroyed
end A
begin false
if
destroyed
end false
begin true
if
end true
'''
cmd: "nim c --gc:arc -d:danger $file"
disabled: "true"
"""
# we use the -d:danger switch to detect uninitialized stack
# slots more reliably (there shouldn't be any, of course).
# XXX Enable once scope based destruction works!
type
Foo = object
id: int
proc `=destroy`(x: var Foo) =
if x.id != 0:
echo "destroyed"
x.id = 0
proc construct(): Foo = Foo(id: 3)
proc elifIsEasy(cond: bool) =
echo "begin A"
if cond:
echo "if"
elif construct().id == 3:
echo "elif"
else:
echo "else"
echo "end A"
elifIsEasy(false)
proc orIsHard(cond: bool) =
echo "begin ", cond
if cond or construct().id == 3:
echo "if"
else:
echo "else"
echo "end ", cond
orIsHard(false)
orIsHard(true)