summaryrefslogtreecommitdiffstats
path: root/tests/NRE.test
diff options
context:
space:
mode:
authorMiguel Sofer <miguel.sofer@gmail.com>2008-07-29 23:18:06 (GMT)
committerMiguel Sofer <miguel.sofer@gmail.com>2008-07-29 23:18:06 (GMT)
commit4e7c533c4c7575412649e7978325ff32cec68d3b (patch)
treec1dac9adf158058dd42d4022d5370f52ad089bc3 /tests/NRE.test
parent580724e069e7de6cbe19b235d60d6a6abe6712e3 (diff)
downloadtcl-4e7c533c4c7575412649e7978325ff32cec68d3b.zip
tcl-4e7c533c4c7575412649e7978325ff32cec68d3b.tar.gz
tcl-4e7c533c4c7575412649e7978325ff32cec68d3b.tar.bz2
* tests/NRE.test: new tests that went MIA in the NRE revamping
Diffstat (limited to 'tests/NRE.test')
-rw-r--r--tests/NRE.test226
1 files changed, 223 insertions, 3 deletions
diff --git a/tests/NRE.test b/tests/NRE.test
index a881675..bc0801a 100644
--- a/tests/NRE.test
+++ b/tests/NRE.test
@@ -8,7 +8,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: NRE.test,v 1.5 2008/07/21 03:43:32 msofer Exp $
+# RCS: @(#) $Id: NRE.test,v 1.6 2008/07/29 23:18:07 msofer Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
@@ -29,6 +29,26 @@ if {[testConstraint teststacklimit]} {
set oldLimit [teststacklimit 2048]
}
+namespace eval testnre {
+ #
+ # [testnrelevels] returns a 5-list with: C-stack depth, iPtr->numlevels,
+ # cmdFrame level, callFrame level and tosPtr
+ #
+ variable last [testnrelevels]
+ proc depthDiff {} {
+ variable last
+ set depth [testnrelevels]
+ set res {}
+ foreach t $depth l $last {
+ lappend res [expr {$t-$l}]
+ }
+ set last $depth
+ return $res
+ }
+ namespace export *
+}
+namespace import testnre::*
+
#
# The first few tests will blow the C stack if the NR machinery is not working
@@ -41,6 +61,7 @@ set oldRecursionLimit [interp recursionlimit {}]
interp recursionlimit {} 100000
test NRE-1.1 {self-recursive procs} -setup {
+ variable a {}
proc a i {
if {[incr i] > 20000} {
return $i
@@ -53,6 +74,21 @@ test NRE-1.1 {self-recursive procs} -setup {
rename a {}
} -result {0 20001}
+test NRE-1.1a {self-recursive procs} -setup {
+ variable a {}
+ proc a i {
+ set x [depthDiff]
+ if {[incr i] > 10} {
+ return [lrange $x 0 3]
+ }
+ a $i
+ }
+} -body {
+ a 0
+} -cleanup {
+ rename a {}
+} -result {0 1 1 1}
+
test NRE-1.2 {self-recursive lambdas} -setup {
set a [list i {
if {[incr i] > 20000} {
@@ -330,6 +366,20 @@ test NRE-X.1 {eval in wrong interp} {
namespace eval tcl::unsupported namespace export tailcall
namespace import tcl::unsupported::tailcall
+test NRE-T.0 {tailcall is constant space} -constraints {tailcall knownbug} -setup {
+ proc a i {
+ if {[incr i] > 10} {
+ return [depthDiff]
+ }
+ depthDiff
+ tailcall a $i
+ }
+} -body {
+ a 0
+} -cleanup {
+ rename a {}
+} -result {0 0 0 0 0}
+
test NRE-T.1 {tailcall} -constraints {tailcall} -body {
namespace eval a {
variable x *::a
@@ -407,8 +457,178 @@ test NRE-T.6 {tailcall does remove callframes} -constraints {tailcall} -body {
rename boo {}
} -result 1
-namespace forget tcl::unsupported::tailcall
+test NRE-T.7 {tailcall does return} -constraints {tailcall} -setup {
+ namespace eval ::foo {
+ variable res {}
+ proc a {} {
+ variable res
+ append res a
+ tailcall set x 1
+ append res a
+ }
+ proc b {} {
+ variable res
+ append res b
+ a
+ append res b
+ }
+ proc c {} {
+ variable res
+ append res c
+ b
+ append res c
+ }
+ proc d {} {
+ variable res
+ append res d
+ c
+ append res d
+ }
+ }
+} -body {
+ namespace eval ::foo d
+} -cleanup {
+ namespace delete ::foo
+} -result dcbabcd
+
+test NRE-T.8 {tailcall tailcall} -constraints {tailcall knownbug} -setup {
+ namespace eval ::foo {
+ variable res {}
+ proc a {} {
+ variable res
+ append res a
+ tailcall tailcall set x 1
+ append res a
+ }
+ proc b {} {
+ variable res
+ append res b
+ a
+ append res b
+ }
+ proc c {} {
+ variable res
+ append res c
+ b
+ append res c
+ }
+ proc d {} {
+ variable res
+ append res d
+ c
+ append res d
+ }
+ }
+} -body {
+ namespace eval ::foo d
+} -cleanup {
+ namespace delete ::foo
+} -result dcbacd
+test NRE-T.9 {tailcall does return} -constraints {tailcall} -setup {
+ namespace eval ::foo {
+ variable res {}
+ proc a {} {
+ variable res
+ append res a
+ tailcall {set x 1}
+ append res a
+ }
+ proc b {} {
+ variable res
+ append res b
+ a
+ append res b
+ }
+ proc c {} {
+ variable res
+ append res c
+ b
+ append res c
+ }
+ proc d {} {
+ variable res
+ append res d
+ c
+ append res d
+ }
+ }
+} -body {
+ namespace eval ::foo d
+} -cleanup {
+ namespace delete ::foo
+} -result dcbabcd
+
+test NRE-T.10 {tailcall tailcall} -constraints {tailcall knownbug} -setup {
+ namespace eval ::foo {
+ variable res {}
+ proc a {} {
+ variable res
+ append res a
+ tailcall {tailcall set x 1}
+ append res a
+ }
+ proc b {} {
+ variable res
+ append res b
+ a
+ append res b
+ }
+ proc c {} {
+ variable res
+ append res c
+ b
+ append res c
+ }
+ proc d {} {
+ variable res
+ append res d
+ c
+ append res d
+ }
+ }
+} -body {
+ namespace eval ::foo d
+} -cleanup {
+ namespace delete ::foo
+} -result dcbacd
+
+test NRE-T.11 {tailcall tailcall} -constraints {tailcall knownbug} -setup {
+ namespace eval ::foo {
+ variable res {}
+ proc a {} {
+ variable res
+ append res a
+ tailcall {tailcall {set x 1}}
+ append res a
+ }
+ proc b {} {
+ variable res
+ append res b
+ a
+ append res b
+ }
+ proc c {} {
+ variable res
+ append res c
+ b
+ append res c
+ }
+ proc d {} {
+ variable res
+ append res d
+ c
+ append res d
+ }
+ }
+} -body {
+ namespace eval ::foo d
+} -cleanup {
+ namespace delete ::foo
+} -result dcbacd
+
+
+namespace forget tcl::unsupported::tailcall
#
# Test that ensembles are non-recursive
#
@@ -425,6 +645,6 @@ if {[testConstraint teststacklimit]} {
teststacklimit $oldLimit
unset oldLimit
}
-
+namespace delete testnre
return