mirror of
https://github.com/nim-lang/Nim.git
synced 2026-09-18 02:54:52 +00:00
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:
55
tests/arc/tcontrolflow.nim
Normal file
55
tests/arc/tcontrolflow.nim
Normal 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)
|
||||
Reference in New Issue
Block a user