An optimizer for ARC (#14962)
* WIP: an optimizer for ARC * do not optimize away destructors in 'finally' if unstructured control flow is involved * optimized the optimizer * minor code cleanup * first steps to .cursor inference * cursor inference: big steps to a working solution * baby steps * better .cursor inference * new feature: expandArc for easy inspection of the AST after ARC transformations * added topt_cursor test * adapt tests * cleanups, make tests green * optimize common traversal patterns * moved test case * fixes .cursor inference so that npeg compiles once again * cursor inference: more bugfixes Co-authored-by: Clyybber <darkmine956@gmail.com>
This commit is contained in:
parent
813dd1b670
commit
c5358b0d4b
19 changed files with 895 additions and 62 deletions
|
|
@ -1,49 +0,0 @@
|
|||
discard """
|
||||
cmd: '''nim c --newruntime $file'''
|
||||
output: '''copied
|
||||
copied
|
||||
2
|
||||
destroyed
|
||||
destroyed
|
||||
copied
|
||||
copied
|
||||
2
|
||||
destroyed
|
||||
destroyed'''
|
||||
"""
|
||||
|
||||
type
|
||||
ObjWithDestructor = object
|
||||
a: int
|
||||
proc `=destroy`(self: var ObjWithDestructor) =
|
||||
echo "destroyed"
|
||||
|
||||
proc `=`(self: var ObjWithDestructor, other: ObjWithDestructor) =
|
||||
echo "copied"
|
||||
|
||||
proc test(a: range[0..1], arg: ObjWithDestructor) =
|
||||
var iteration = 0
|
||||
while true:
|
||||
{.computedGoto.}
|
||||
|
||||
let
|
||||
b = int(a) * 2
|
||||
c = a
|
||||
d = arg
|
||||
e = arg
|
||||
|
||||
discard c
|
||||
discard d
|
||||
discard e
|
||||
|
||||
inc iteration
|
||||
|
||||
case a
|
||||
of 0:
|
||||
assert false
|
||||
of 1:
|
||||
echo b
|
||||
if iteration == 2:
|
||||
break
|
||||
|
||||
test(1, ObjWithDestructor())
|
||||
Loading…
Add table
Add a link
Reference in a new issue