From 8ce1c99d0d9ff5a8539000365ec640c88098e60f Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 13 Jul 2012 00:50:56 +0200 Subject: [PATCH] work on closures continues; fixed #116 --- compiler/ast.nim | 4 +--- tests/run/tclosure3.nim | 21 +++++++++++++++++++++ todo.txt | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 tests/run/tclosure3.nim diff --git a/compiler/ast.nim b/compiler/ast.nim index 9cd741cf10..9f3a99363a 100755 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -245,6 +245,7 @@ type # language; for interfacing with Objective C sfDiscardable # returned value may be discarded implicitely sfDestructor # proc is destructor + sfByCopy # a variable is to be captured by value in a closure TSymFlags* = set[TSymFlag] @@ -264,9 +265,6 @@ const sfShadowed* = sfInnerProc # a variable that was shadowed in some inner scope - - sfByCopy* = sfBorrow - # a variable is to be captured by value in a closure sfHoist* = sfVolatile ## proc return value can be hoisted diff --git a/tests/run/tclosure3.nim b/tests/run/tclosure3.nim new file mode 100644 index 0000000000..6dee49aeae --- /dev/null +++ b/tests/run/tclosure3.nim @@ -0,0 +1,21 @@ +discard """ + file: "tclosure3.nim" + output: "success" + disabled: true +""" + +proc main = + const n = 30 + for iterations in 0..50_000: + var s: seq[proc(): int {.closure.}] = @[] + for i in 0 .. n-1: + let ii = i + s.add(proc(): int = return ii*ii) + for i in 0 .. n-1: + let val = s[i]() + if val != i*i: echo "bug ", val + + if getOccupiedMem() > 3000_000: quit("still a leak!") + echo "success" + +main() diff --git a/todo.txt b/todo.txt index d6b84d7536..1e3bd6bae1 100755 --- a/todo.txt +++ b/todo.txt @@ -11,7 +11,7 @@ version 0.9.0 New pragmas: - ``hoist`` pragma for loop hoisting -- test & document ``byCopy`` pragma +- fix & document ``byCopy`` pragma - document destructors - ``borrow`` needs to take type classes into account