<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script>

function runArrayOOMTest() {
    document.write("<p>Starting test...</p>");

    // The index 'target' is the location in the array we expect to fault on access, should the size calculation of the realloc of the vector be allowed
    // to overflow.  The vector needs to be ((target + 1) * sizeof(JSValue*)) bytes long to hold 'target', or approximately 2/3 UINT32_MAX.  Upon growing
    // the array an additional 50% capacity will be allocated, plus the storage object header, taking the size of the allocation over UINT32_MAX.
    var target = Math.floor(0xFFFFFFFF / 6);
    // In order to force arr[target] to be stored in the vector, rather than the sparse map, we need ensure the vector is sufficiently densely populated.
    var populate = Math.floor(target / 8 + 1);

    try {
        var arr = new Array();
        for (i=0; i < populate; ++i)
            arr[i] = 0;
        arr[target] = 0;
    } catch(e) {
        var expect_name = "Error";
        var expect_message = "Out of memory";
        if ((e.name == expect_name) && (e.message == expect_message))
            document.write("<p>SUCCESS</p>");
        else
            document.write("<p>FAIL - Expected \"" + expect_name + "/" + expect_message + "\", got \"" + e.name + "/" + e.message + "\".</p>");

        return;
    }

    document.write("<p>FAIL - Expected exception.</p>");
}

</script>
</head>
<body>
<p>This test checks that Array objects fail gracefully (throw exception) when array length grows large.</p>
<p>This test may run for over 20 seconds on a fast machine, and will consume hundereds of MB of memory.</p>
<input type="button" onclick="runArrayOOMTest()" value="Start">
</body>
</html>
