description(

"This test checks that JavaScriptCore does not crash when uwinding the stack that includes a host function."

);

function twoHostFunctions() {
    var stack = [];
    stack.push({ "args": twoHostFunctions.arguments });
    stack.push({ "args": twoHostFunctions.arguments });
    testPassed("Two host functions called in a row.");
}

function arrayOperatorFunction(element) {
    return element + 5;
}

var myArray = new Array (0, 1, 2);
function hostCallsUser(array) {
    return array.map(arrayOperatorFunction);
}

function throwException() {
    throw "Exception thrown";
}

function hostAndException() {
    var stack = [];
    stack.push({ "args": hostAndException.arguments });
    throwException();
}

twoHostFunctions();
myArray = hostCallsUser(myArray);
shouldBe('myArray', 'new Array( 5, 6, 7 )');

try {
    hostAndException();
} catch (e) {
    testPassed("Exception thrown and caught");
}

