51 lines
1.1 KiB
JavaScript
51 lines
1.1 KiB
JavaScript
description(
|
|
"Tests what happens when you have an inlined function that captures arguments and then throws an exception."
|
|
);
|
|
|
|
var capturedArgs;
|
|
|
|
function foo(f, a, b, c) {
|
|
var result = 0;
|
|
capturedArgs = arguments;
|
|
for (var i = 1; i < arguments.length; ++i)
|
|
result += arguments[i] + f();
|
|
return result + a + b + c;
|
|
}
|
|
|
|
var shouldThrow = false;
|
|
|
|
function bar(f) {
|
|
return foo(f, 1, 2, 3);
|
|
}
|
|
|
|
function makeF(i) {
|
|
return eval("(function() { if (shouldThrow) throw \"The exception " + i + "\"; return 0; })");
|
|
}
|
|
|
|
noInline(bar);
|
|
for (var i = 0; i < 100; i = dfgIncrement({f:bar, i:i + 1, n:100}))
|
|
bar(makeF(i));
|
|
|
|
function recurse(n) {
|
|
if (!n)
|
|
return 42;
|
|
return recurse(n - 1);
|
|
}
|
|
|
|
shouldThrow = true;
|
|
|
|
var theException;
|
|
try {
|
|
bar(makeF(100));
|
|
testFailed("bar() didn't throw an exception.");
|
|
} catch (e) {
|
|
theException = e;
|
|
}
|
|
|
|
shouldBe("theException", "\"The exception 100\"");
|
|
recurse(1000);
|
|
shouldBe("capturedArgs.length", "4");
|
|
shouldBe("capturedArgs[1]", "1");
|
|
shouldBe("capturedArgs[2]", "2");
|
|
shouldBe("capturedArgs[3]", "3");
|