//@ runShadowChicken "use strict"; var shadowChickenFunctionsOnStack = $vm.shadowChickenFunctionsOnStack; var verbose = false; load("resources/shadow-chicken-support.js"); initialize(); (function test1() { function foo() { expectStack([foo, bar, baz, test1]); } function bar() { return foo(); } function baz() { return bar(); } baz(); })(); (function test2() { function foo() { } function bar() { return foo(); } function baz() { return bar(); } baz(); })(); (function test3() { if (verbose) { print("test3:"); print("bob = " + describe(bob)); print("thingy = " + describe(thingy)); print("foo = " + describe(foo)); print("bar = " + describe(bar)); print("baz = " + describe(baz)); } function bob() { if (verbose) print("Doing bob..."); expectStack([bob, thingy, foo, bar, baz, test3]); } function thingy() { return bob(); } function foo() { if (verbose) print("Doing foo..."); expectStack([foo, bar, baz, test3]); return thingy(); } function bar() { return foo(); } function baz() { return bar(); } baz(); })(); (function test4() { if (verbose) { print("test4:"); print("bob = " + describe(bob)); print("thingy = " + describe(thingy)); print("foo = " + describe(foo)); print("bar = " + describe(bar)); print("baz = " + describe(baz)); } function bob(thingyIsTail) { if (verbose) print("Doing bob..."); expectStack([bob, thingy, foo, bar, baz, test4]); } function thingy(isTail) { bob(false); return bob(isTail); } function foo() { if (verbose) print("Doing foo..."); expectStack([foo, bar, baz, test4]); thingy(false); return thingy(true); } function bar() { foo(); return foo(); } function baz() { bar(); return bar(); } baz(); })(); (function test5a() { if (verbose) print("In test5a:"); var foos = 50; function foo(ttl) { if (ttl <= 1) { var array = []; for (var i = 0; i < foos; ++i) array.push(foo); array.push(test5a); expectStack(array); return; } return foo(ttl - 1); } foo(foos); })(); (function test5b() { if (verbose) print("In test5b:"); var foos = 100; function foo(ttl) { if (ttl <= 1) { var array = []; for (var i = 0; i < foos; ++i) array.push(foo); array.push(test5b); expectStack(array); return; } return foo(ttl - 1); } foo(foos); })(); (function test6() { if (verbose) { print("In test6"); print("foo = " + describe(foo)); print("array.push = " + describe([].push)); } var foos = 128; function foo(ttl) { if (ttl <= 1) { var array = []; for (var i = 0; i < foos; ++i) array.push(foo); array.push(test6); expectStack(array); return; } return foo(ttl - 1); } foo(foos); if (verbose) print("Done with test6."); })(); (function test7() { var foos = 200000; function foo(ttl) { if (ttl <= 1) { var stack = shadowChickenFunctionsOnStack(); var expectedStack = []; expectedStack.push(shadowChickenFunctionsOnStack); while (expectedStack.length < stack.length - 2) expectedStack.push(foo); expectedStack.push(test7); expectedStack.push(stackTop); compareStacks(stack, expectedStack); return; } return foo(ttl - 1); } foo(foos); })();