"use strict"; var shadowChickenFunctionsOnStack = $vm.shadowChickenFunctionsOnStack; function describeFunction(f) { var name; try { name = f.name; } catch (e) {} if (!name) name = "<" + describe(f) + ">"; return name; } function describeArray(array) { var result = "["; for (var i = 0; i < array.length; ++i) { if (i) result += ", "; result += describeFunction(array[i]); } return result + "]"; } function compareStacks(stack, array) { if (stack.length != array.length) throw new Error("Bad stack length: " + describeArray(stack) + " (expected " + describeArray(array) + ")"); for (var i = 0; i < stack.length; ++i) { if (stack[i] != array[i]) throw new Error("Bad stack at i = " + i + ": " + describeArray(stack) + " (expected " + describeArray(array) + ")"); } } function expectStack(array) { var stack = shadowChickenFunctionsOnStack(); if (verbose) print("stack = " + describeArray(stack)); var myTop = stack.pop(); if (myTop != stackTop) throw new Error("Bad stack top: " + myTop); var myBottom = stack.shift(); if (myBottom != shadowChickenFunctionsOnStack) throw new Error("Bad stack bottom: " + myBottom); myBottom = stack.shift(); if (myBottom != expectStack) throw new Error("Bad stack next-to-bottom: " + myBottom); compareStacks(stack, array); } var initialShadow; var stackTop; function initialize() { initialShadow = shadowChickenFunctionsOnStack(); if (initialShadow.length != 3) throw new Error("bad initial shadow length: " + initialShadow.length); if (initialShadow[0] != shadowChickenFunctionsOnStack) throw new Error("bad top of stack: " + describeFunction(initialShadow[0])); if (initialShadow[1] != initialize) throw new Error("bad middle of stack: " + describeFunction(initialShadow[1])); stackTop = initialShadow[2]; expectStack([initialize]); }