function assert(name, actual, expected) {
    if (actual != expected) {
        print("FAILED test " + name + ": expected " + expected + ", actual: " + actual);
        throw "FAILED";
    }
}

function checkResult(name, result, expectedK, expectedProp) {
    assert(name, result[0], expectedK);
    assert(name, result[1], expectedProp);
}

// ForIn on Indexed properties.

function testIndexedProperties(o) {
    for (var k in o) {
        {
            function k() { }
        }
        return [ k, o[k] ];
    }
}

var o = [42];
for (var i = 0; i < 10000; ++i) {
    var result = testIndexedProperties(o);
    checkResult("testIndexedProperties", result, "function k() { }", undefined);
}

function testIndexedProperties2(o) {
    for (var k in o) {
        {
            k = "boo";
            function k() { }
        }
        return [ k, o[k] ];
    }
}

var o = [42];
for (var i = 0; i < 10000; ++i) {
    var result = testIndexedProperties2(o);
    checkResult("testIndexedProperties2", result, "boo", undefined);
}

function testIndexedProperties3(o) {
    for (var k in o) {
        try {
        } finally {
            {
                function k() { }
            }
        }
        return [ k, o[k] ];
    }
}

var o = [42];
for (var i = 0; i < 10000; ++i) {
    var result = testIndexedProperties3(o);
    checkResult("testIndexedProperties3", result, "function k() { }", undefined);
}

function testIndexedProperties4(o) {
    for (var k in o) {
        try {
        } finally {
            {
                k = "boo";
                function k() { }
            }
        }
        return [ k, o[k] ];
    }
}

var o = [42];
for (var i = 0; i < 10000; ++i) {
    var result = testIndexedProperties4(o);
    checkResult("testIndexedProperties4", result, "boo", undefined);
}

// ForIn on Structure properties.

function testStructureProperties(o) {
    for (var k in o) {
        {
            function k() { }
        }
        return [ k, o[k] ];
    }
}

var o = {a: 42};
for (var i = 0; i < 10000; ++i) {
    var result = testStructureProperties(o);
    checkResult("testStructureProperties", result, "function k() { }", undefined);
}

function testStructureProperties2(o) {
    for (var k in o) {
        {
            k = 0x1234;
            function k() { }
        }
        return [ k, o[k] ];
    }
}

var o = {a: 42};
for (var i = 0; i < 10000; ++i) {
    var result = testStructureProperties2(o);
    checkResult("testStructureProperties2", result, 0x1234, undefined);
}

function testStructureProperties3(o) {
    for (var k in o) {
        try {
        } finally {
            {
                function k() { }
            }
        }
        return [ k, o[k] ];
    }
}

var o = {a: 42};
for (var i = 0; i < 10000; ++i) {
    var result = testStructureProperties3(o);
    checkResult("testStructureProperties3", result, "function k() { }", undefined);
}

function testStructureProperties4(o) {
    for (var k in o) {
        try {
        } finally {
            {
                k = 0x1234;
                function k() { }
            }
        }
        return [ k, o[k] ];
    }
}

var o = {a: 42};
for (var i = 0; i < 10000; ++i) {
    var result = testStructureProperties4(o);
    checkResult("testStructureProperties4", result, 0x1234, undefined);
}