for-in-prototype.js   [plain text]


(function() {
    // Iterate when the base object's properties shadow properties in the prototype chain.
    var foo = function() {
        var A = function() { };
        A.prototype.x = 42;
        var o = new A();
        o.x = 43;
        var result = "";
        for (var p in o)
            result += o[p];
        return result;
    };
    for (var i = 0; i < 10000; ++i) {
        if (foo() !== "43")
            throw new Error("bad result");
    }
    foo(null);
})();
(function() {
    // Iterate when the prototype has the same range of indexed properties as the base object.
    var foo = function() {
        var A = function() {};
        A.prototype[0] = 42;
        var a = new A();
        a[0] = 43;
        var result = "";
        for (var p in a)
            result += a[p];
        return result;
    };
    noInline(foo);
    for (var i = 0; i < 10000; ++i) {
        if (foo() !== "43")
            throw new Error("bad result");
    }
    foo(null);
})();
(function() {
    // Iterate when the prototype has indexed properties beyond the range of the base object.
    var foo = function() {
        var A = function() {};
        A.prototype[0] = 42;
        A.prototype[1] = 3;
        var a = new A();
        a[0] = 43;
        var result = "";
        for (var p in a)
            result += a[p];
        return result;
    };
    noInline(foo);
    for (var i = 0; i < 10000; ++i) {
        if (foo() !== "433")
            throw new Error("bad result");
    }
    foo(null);
})();